Delen via


Informatie over modellen, klassen en relaties

Een domeinspecifieke taal (DSL) wordt gedefinieerd door het DSL Definition-bestand, samen met eventuele aangepaste programmacode die u kunt schrijven. De meeste programmacode in de DSL-oplossing wordt gegenereerd op basis van dit bestand.

In dit onderwerp worden de centrale kenmerken van de DSL-definitie uitgelegd.

De DSL-definitie

Wanneer u opent Dsl\DslDefinition.dsl, lijkt het Visual Studio-venster op de volgende afbeelding.

dsl designer

De belangrijkste informatie in de DSL-definitie wordt weergegeven in het DIAGRAM van de DSL-definitie. Aanvullende informatie, die ook deel uitmaakt van DslDefinition.dsl, wordt weergegeven in DSL Explorer, die meestal aan de zijkant van het diagram wordt weergegeven. U werkt met het diagram voor de meest voorkomende taken en met DSL Explorer voor geavanceerdere aanpassingen.

Het DIAGRAM van de DSL-definitie toont de domeinklassen die modelelementen definiëren en de relaties waarmee koppelingen tussen modelelementen worden gedefinieerd. Ook worden de shapes en verbindingslijnen weergegeven die worden gebruikt om de modelelementen voor de gebruiker weer te geven.

dsl designer met swimlane

Wanneer u een item in de DSL-definitie selecteert, in het diagram of in DSL Explorer, wordt informatie over het item weergegeven in het venster Eigenschappen. Aanvullende informatie kan worden weergegeven in het venster DSL Details.

Modellen zijn exemplaren van DSL's

Een model is een exemplaar van uw DSL dat door een gebruiker is gemaakt. Een model bevat modelelementen, die exemplaren zijn van de domeinklassen die u definieert en koppelingen tussen de elementen, die exemplaren zijn van de domeinrelaties die u definieert. Een model kan ook shapes en verbindingslijnen bevatten, waarmee de modelelementen en koppelingen in een diagram worden weergegeven. De DSL-definitie bevat de shapeklassen, verbindingslijnklassen en een klasse voor het diagram.

Een DSL-definitie wordt ook wel een domeinmodel genoemd. Een DSL-definitie of domeinmodel is de ontwerptijdweergave van de domeinspecifieke taal, terwijl het model de runtime-instantiëring is van de domeinspecifieke taal.

Domeinklassen definiëren modelelementen

Domeinklassen worden gebruikt om de verschillende elementen in het domein te maken en domeinrelaties zijn de koppelingen tussen de elementen. Ze zijn de ontwerptijdweergave van de elementen en koppelingen die worden geïnstantieerd door de gebruikers van de ontwerpspecifieke taal wanneer ze hun modellen maken.

In deze afbeelding ziet u een model dat is gemaakt door de gebruiker van een muziekbibliotheek DSL. Muziekalbums worden vertegenwoordigd door dozen die lijsten met nummers bevatten. Artiesten worden vertegenwoordigd door ronde hoekvakken en zijn verbonden met de albums waaraan ze hebben bijgedragen.

Exemplaarmodel van gegenereerde DSL

De DSL-definitie scheidt twee aspecten. Het uiterlijk van de modelelementen in het modeldiagram wordt gedefinieerd met behulp van shapeklassen en verbindingslijnklassen. De informatie die in het model wordt uitgevoerd, wordt gedefinieerd met behulp van domeinklassen en domeinrelaties.

In de volgende afbeelding ziet u de domeinklassen en relaties in de DSL-definitie van de muziekbibliotheek.

Insluiten en verwijzingsrelaties

In de afbeelding ziet u vier domeinklassen: Muziek, Album, Artist en Song. De domeinklassen definiëren domeineigenschappen zoals Naam, Titel, enzovoort. In het exemplaarmodel worden de waarden van sommige van deze eigenschappen weergegeven in het diagram.

Tussen de klassen bevinden zich domeinrelaties: MusicHasAlbums, MusicHasArtists, AlbumbHasSongs en ArtistAppearedOnAlbums. De relaties hebben meerdere eigenschappen, zoals 1..1, 0..*. Elk nummer moet bijvoorbeeld zijn gerelateerd aan precies één album via de relatie AlbumHasSongs. Elk album kan een willekeurig aantal nummers hebben.

Het DSL-definitiediagram opnieuw rangschikken

U ziet dat een domeinklasse meerdere keren kan worden weergegeven in het DSL-definitiediagram, zoals album in deze afbeelding doet. Er is altijd één hoofdweergave en er kunnen enkele referentieweergaven zijn.

Als u het DIAGRAM van de DSL-definitie wilt wijzigen, kunt u het volgende doen:

  • Wissel de hoofd- en referentieweergaven met behulp van de opdrachten Bring Tree Here en Split Tree . Klik met de rechtermuisknop op één domeinklasse om deze opdrachten weer te geven.

  • Rangschik de domeinklassen en shapeklassen opnieuw door op Ctrl+Up en Ctrl+Down te drukken.

  • U kunt klassen samenvouwen of uitvouwen met behulp van het pictogram rechtsboven in elke shape.

  • Vouw delen van de structuur samen door onder aan een domeinklasse op het minteken (-) te klikken.

Erfenis

Domeinklassen kunnen worden gedefinieerd met behulp van overname. Als u een overname-afleiding wilt maken, klikt u op het hulpprogramma Overname, klikt u op de afgeleide klasse en vervolgens op de basisklasse. Een modelelement bevat alle eigenschappen die zijn gedefinieerd op een eigen domeinklasse, samen met alle eigenschappen die zijn overgenomen van de basisklasse. Het neemt ook de rollen over in relaties.

Overerving kan ook worden gebruikt tussen Relaties, Vormen en Verbindingen. Erfenis moet blijven binnen dezelfde groep. Een vorm kan niet erven van een domeinklasse.

Domeinrelaties

Modelelementen kunnen worden gekoppeld aan relaties. Koppelingen zijn altijd binair; ze koppelen precies twee elementen. Elk element kan echter veel koppelingen naar andere objecten hebben en er kan zelfs meer dan één koppeling zijn tussen hetzelfde paar elementen.

Net zoals u verschillende klassen elementen kunt definiëren, kunt u verschillende klassen van koppelingen definiëren. De klasse van een koppeling wordt een domeinrelatie genoemd. Een domeinrelatie geeft aan welke klassen element de exemplaren ervan verbinding kunnen maken. Elk einde van een relatie wordt een rol genoemd en de domeinrelatie definieert namen voor de twee rollen, evenals voor de relatie zelf.

Er zijn twee soorten domeinrelaties: insluitingsrelaties en verwijzingsrelaties. In het DSL-definitiediagram hebben inbeddingsrelaties doorlopende lijnen voor elke rol en verwijzingsrelaties streepjeslijnen.

Relaties insluiten

Elk element in een model, met uitzondering van de wortel, is het doel van één embedlink. Daarom vormt het hele model één boomstructuur van ingebedde koppelingen. Een insluitingsrelatie vertegenwoordigt insluiting of eigendom. Twee modelelementen die op deze manier zijn gerelateerd, worden ook wel bovenliggend en onderliggend element genoemd. Het kind is ingebed in de ouder.

Insluitlinks worden meestal niet expliciet weergegeven als verbindingen op een diagram. In plaats daarvan worden ze meestal vertegenwoordigd door insluiting. De root van het model is het diagram, en elementen die erin zijn ingesloten, worden weergegeven als vormen op het diagram.

In het voorbeeld heeft de hoofdklasse Music een embedderelatie MusicHasAlbums met Album, die op zijn beurt een embedderelatie AlbumHasSongs met Song heeft. Nummers worden weergegeven als items in een lijst binnen elk album. Muziek bevat ook een insluiting van MusicHasArtists voor de klasse Artist, waarvan exemplaren ook worden weergegeven als vormen in het diagram.

Standaard worden ingebedde elementen automatisch verwijderd wanneer hun ouders worden verwijderd.

Wanneer een model wordt opgeslagen in XML-vorm, worden ingesloten elementen genesteld in hun bovenliggende elementen, tenzij u de serialisatie hebt aangepast.

Opmerking

Insluiten is niet hetzelfde als overname. Kind elementen in een insluitrelatie nemen de eigenschappen van het bovenliggende item niet over. Een insluiting is een type koppeling tussen modelelementen. Overname is een relatie tussen klassen en maakt geen koppelingen tussen modelelementen.

Regels voor insluiten

Elk element in een exemplaarmodel moet het doel zijn van precies één insluitingskoppeling, met uitzondering van de hoofdmap van het model.

Daarom moet elke niet-abstracte domeinklasse, behalve de hoofdklasse, het doel zijn van ten minste één insluitingsrelatie, of moet deze een insluiting overnemen van een basisklasse. Een klasse kan het doel zijn van twee of meer insluitingen, maar de elementen van het exemplaarmodel kunnen slechts één bovenliggend element tegelijk hebben. De multipliciteit van doel naar bron moet 0..1 of 1..1 zijn.

De Explorer geeft de embedding-boom weer

Uw DSL-definitie maakt ook een verkenner, die gebruikers naast hun modeldiagram zien.

Gegenereerde verkenner van DSL

De verkenner toont alle elementen in het model, zelfs de elementen waarvoor u geen shapes hebt gedefinieerd. Hierin worden elementen en insluitingsrelaties weergegeven, maar geen verwijzingsrelaties.

Als u de waarden van de domeineigenschappen van een element wilt zien, selecteert de gebruiker een element in het modeldiagram of in de modelverkenner en opent u het venster Eigenschappen. Alle domeineigenschappen worden weergegeven, inclusief de eigenschappen die niet in het diagram worden weergegeven. In het voorbeeld heeft elk nummer zowel een titel als een genre, maar alleen de waarde van de titel wordt weergegeven in het diagram.

Verwijzingsrelaties

Een verwijzingsrelatie vertegenwoordigt een soort relatie die niet insluit.

Verwijzingsrelaties worden doorgaans in een diagram weergegeven als verbindingslijnen tussen shapes.

In de XML-weergave van het model wordt een verwijzingskoppeling tussen twee elementen weergegeven met monikers. Dat wil gezegd, monikers zijn namen die elk element in het model uniek identificeren. Het XML-knooppunt voor elk modelelement bevat een knooppunt dat de naam van de relatie en de moniker van het andere element aangeeft.

Rollen

Elke domeinrelatie heeft twee rollen, een bronrol en een doelrol.

In de volgende afbeelding is de lijn tussen de domeinklasse Publisher en de relatie PublisherCatalog-domein de bronrol. De lijn tussen de domeinrelatie en de klasse Albumdomein is de doelrol.

Rollen en eigenschappen.

De namen die aan een relatie zijn gekoppeld, zijn vooral belangrijk wanneer u programmacode schrijft die het model doorkruist. Wanneer u bijvoorbeeld de DSL-oplossing bouwt, heeft de gegenereerde klasse Publisher een eigenschappencatalogus die een verzameling albums is. De klasse Album heeft een eigenschap Publisher die een enkele instantie van de klasse Publisher is.

Wanneer u een relatie in een DSL-definitie maakt, krijgen de eigenschaps- en relatienamen standaardwaarden. U kunt ze echter wijzigen.

Multipliciteiten

Meervoudige kenmerken geven aan hoeveel elementen dezelfde rol kunnen hebben in een domeinrelatie. In het voorbeeld geeft de multipliciteitsinstelling nul-op-veel (0..*) voor de catalogusrol aan dat elk exemplaar van de Publisher-domeinklasse net zoveel PublisherCatalog-relatiekoppelingen kan hebben als u deze wilt geven.

Configureer de multipliciteit van een rol door in het diagram te typen of door de Multiplicity eigenschap in het venster Eigenschappen te wijzigen. In de volgende tabel worden de instellingen voor deze eigenschap beschreven.

Multipliciteitstype Description
0..* (nul tot veel) Elk exemplaar van de domeinklasse kan meerdere exemplaren van de relatie hebben of geen exemplaren van de relatie.
0..1 (nul tot één) Elk exemplaar van de domeinklasse mag niet meer dan één exemplaar van de relatie hebben of geen exemplaren van de relatie.
1..1 (één) Elk exemplaar van de domeinklasse kan één exemplaar van de relatie hebben. U kunt niet meer dan één exemplaar van deze relatie creëren vanuit een exemplaar van de rolklasse. Als validatie is ingeschakeld, verschijnt er een validatiefout wanneer een instantie van de rolklasse geen instantie van de relatie heeft.
1..* (één-op-veel) Elk exemplaar van de klasse op de rol met deze multipliciteit kan meerdere exemplaren van de relatie hebben en elke instantie moet ten minste één exemplaar van de relatie hebben. Als validatie is ingeschakeld, verschijnt er een validatiefout wanneer een instantie van de rolklasse geen instantie van de relatie heeft.

Domeinrelaties als klassen

Een koppeling wordt in de Store weergegeven als een exemplaar van LinkElement, een afgeleide klasse van ModelElement. U kunt deze eigenschappen definiëren in het domeinmodeldiagram voor domeinrelaties.

U kunt ook een relatie als de bron of het doel van andere relaties instellen. Klik in het domeinmodeldiagram met de rechtermuisknop op de domeinrelatie en klik vervolgens op Weergeven als klasse. Er wordt een extra klasvak weergegeven. Vervolgens kunt u er relaties mee verbinden.

U kunt een relatie gedeeltelijk definiëren door overname, net zoals bij domeinklassen. Selecteer de afgeleide relatie en stel basisrelatie in het venster Eigenschappen in.

Een afgeleide relatie is gespecialiseerd in de basisrelatie. De domeinklassen die worden gekoppeld, moeten worden afgeleid van of hetzelfde als de klassen die zijn gekoppeld door de basisrelatie. Wanneer een koppeling van de afgeleide relatie wordt gemaakt in een model, is het een exemplaar van zowel de afgeleide als de basisrelaties. In programmacode kunt u naar het tegenovergestelde uiteinde van de koppeling navigeren met behulp van de eigenschappen die door de basis of door de afgeleide klasse zijn gegenereerd.