Förstå modeller, klasser och relationer

Ett domänspecifikt språk (DSL) definieras av dess DSL-definitionsfil, tillsammans med eventuell anpassad programkod som du kan skriva. Merparten av programkoden i DSL-lösningen genereras från den här filen.

I det här avsnittet beskrivs de centrala funktionerna i DSL-definitionen.

DSL-definitionen

När du öppnar Dsl\DslDefinition.dslliknar Visual Studio-fönstret följande bild.

dsl-designer

Den viktigaste informationen i DSL-definitionen visas i DSL-definitionsdiagrammet. Ytterligare information, som också är en del av DslDefinition.dsl, visas i DSL Explorer, som vanligtvis visas vid sidan av diagrammet. Du arbetar med diagrammet för de vanligaste uppgifterna och med DSL Explorer för mer avancerade anpassningar.

DSL-definitionsdiagrammet visar de domänklasser som definierar modellelement och de relationer som definierar länkar mellan modellelement. Den visar också de former och kopplingar som används för att visa modellelementen för användaren.

dsl designer med swimlane

När du väljer ett objekt i DSL-definitionen, antingen i diagrammet eller I DSL Explorer, visas information om det i fönstret Egenskaper. Ytterligare information kan visas i DSL-detaljfönstret.

Modeller är instanser av DSL:er

En modell är en instans av din DSL som skapats av en användare. En modell innehåller modellelement, som är instanser av de domänklasser som du definierar, och länkar mellan elementen, som är instanser av de domänrelationer som du definierar. En modell kan också ha former och kopplingar som visar modellelementen och länkarna i ett diagram. DSL-definitionen innehåller formklasser, anslutningsklasser och en klass för diagrammet.

En DSL-definition kallas även för en domänmodell. En DSL-definition eller domänmodell är designtidsrepresentationen av det domänspecifika språket, medan modellen är instansieringen av det domänspecifika språket.

Domänklasser definierar modellelement

Domänklasser används för att skapa de olika elementen i domänen, och domänrelationer är länkarna mellan elementen. De är designtidsrepresentationen av elementen och länkarna som instansieras av användarna av det designspecifika språket när de skapar sina modeller.

Den här bilden visar en modell som har skapats av användaren av ett musikbiblioteks DSL. Musikalbum representeras av rutor som innehåller listor med låtar. Artister representeras av runda hörnlådor och är kopplade till de album som de har bidragit till.

Instansmodell för genererad DSL

DSL-definitionen separerar två aspekter. Utseendet på modellelementen i modelldiagrammet definieras med hjälp av formklasser och anslutningsklasser. Informationen i modellen definieras med hjälp av domänklasser och domänrelationer.

Följande bild visar domänklasserna och relationerna i DSL-definitionen för musikbiblioteket.

Inbäddnings- och referensrelationer

Bilden visar fyra domänklasser: Musik, Album, Artist och Sång. Domänklasserna definierar domänegenskaper som Namn, Rubrik och så vidare. I instansmodellen visas värdena för vissa av dessa egenskaper i diagrammet.

Mellan klasserna finns domänrelationer: MusicHasAlbums, MusicHasArtists, AlbumbHasSongs och ArtistAppearedOnAlbums. Relationerna har flera funktioner, till exempel 1..1, 0..*. Till exempel måste varje låt vara relaterad till exakt ett album via relationen AlbumHasSongs. Varje album kan ha valfritt antal låtar.

Ordna om DSL-definitionsdiagrammet

Observera att en domänklass kan visas flera gånger i DSL-definitionsdiagrammet, som Album gör i den här bilden. Det finns alltid en huvudvy och det kan finnas vissa referensvyer .

Om du vill ordna om DSL-definitionsdiagrammet kan du:

  • Växla huvudvyer och referensvyer med hjälp av kommandona Bring Tree Here och Split Tree . Högerklicka på en enskild domänklass för att se dessa kommandon.

  • Ordna om domänklasserna och figurklasserna genom att trycka på Ctrl + Pil upp och Ctrl + Pil ned.

  • Dölj eller expandera klasser med hjälp av ikonen längst upp till höger i varje form.

  • Dölj delar av trädet genom att klicka på minustecknet (-) längst ned i en domänklass.

Arv

Domänklasser kan definieras med arv. Om du vill skapa en arvshärledning klickar du på verktyget Arv, klickar på den härledda klassen och klickar sedan på basklassen. Ett modellelement har alla egenskaper som definieras för sin egen domänklass, tillsammans med alla egenskaper som ärvts från basklassen. Den ärver också sina roller i relationer.

Arv kan också användas mellan relationer, former och kopplingar. Arv måste stanna inom samma grupp. En form kan inte ärva från en domänklass.

Domänrelationer

Modellelement kan länkas av relationer. Länkar är alltid binära. de länkar exakt två element. Alla element kan dock ha många länkar till andra objekt, och det kan till och med finnas fler än en länk mellan samma elementpar.

Precis som du kan definiera olika klasser av element kan du definiera olika klasser av länkar. Klassen för en länk kallas för en domänrelation. En domänrelation anger vilka klasser av element som dess instanser kan ansluta till. Varje slut på en relation kallas en roll, och domänrelationen definierar namn för de två rollerna samt för själva relationen.

Det finns två typer av domänrelationer: inbäddning av relationer och referensrelationer. I DSL-definitionsdiagrammet har inbäddningsrelationer fasta linjer vid varje roll och referensrelationer har streckade linjer.

Inbäddning av relationer

Varje element i en modell, förutom dess rot, är målet för en inbäddningslänk. Därför utgör hela modellen ett enda träd med inbäddningslänkar. En inbäddningsrelation representerar inneslutning eller ägarskap. Två modellelement som är relaterade på det här sättet kallas även parent och child. Barnet sägs vara inbäddad i föräldern.

Inbäddade länkar visas vanligtvis inte uttryckligen som kopplingar i ett diagram. I stället representeras de vanligtvis av inneslutning. Modellens rot representeras av diagrammet och element som är inbäddade i den visas som former i diagrammet.

I exemplet har rotklassen Musik en inbäddningsrelation MusicHasAlbums till Album, som har en inbäddningsrelation AlbumHasSongs till Song. Låtar visas som objekt i en lista i varje album. Musik har också en inbäddning av MusicHasArtists till klassen Artist, vars instanser också visas som former i diagrammet.

Som standard tas inbäddade element bort automatiskt när deras överordnade objekt tas bort.

När en modell sparas i en fil i XML-format kapslas inbäddade element i deras överordnade element, såvida du inte har anpassat serialiseringen.

Anmärkning

Inbäddning är inte detsamma som arv. Barn i en inbäddningsrelation ärver inte förälderns egenskaper. En inbäddning är en typ av länk mellan modellelement. Arv är en relation mellan klasser och skapar inte länkar mellan modellelement.

Inbäddningsregler

Varje element i en instansmodell måste vara målet för exakt en inbäddningslänk, förutom modellens rot.

Därför måste varje icke-abstrakt domänklass, förutom rotklassen, vara målet för minst en inbäddningsrelation, eller så måste den ärva en inbäddning från en basklass. En klass kan vara målet för två eller flera inbäddningar, men dess instansmodellelement kan bara ha en överordnad i taget. Multipliciteten från mål till källa måste vara 0..1 eller 1..1.

Utforskaren visar inbäddningsträdet

DSL-definitionen skapar också en utforskare som användarna ser tillsammans med sitt modelldiagram.

Genererad utforskare av DSL

Utforskaren visar alla element i modellen, även de som du inte har definierat några former för. Den visar element och inbäddningsrelationer, men inte referensrelationer.

Om du vill se värdena för domänegenskaperna för ett element väljer användaren ett element, antingen i modelldiagrammet eller i modellutforskaren, och öppnar fönstret Egenskaper. Den visar alla domänegenskaper, inklusive de som inte visas i diagrammet. I exemplet har varje låt både en Rubrik och en Genre, men endast värdet för rubriken visas i diagrammet.

Referensrelationer

En referensrelation representerar vilken typ av relation som helst som inte är en inbäddning.

Referensrelationer visas vanligtvis i ett diagram som kopplingar mellan former.

I XML-representationen av modellen representeras en referenslänk mellan två element med hjälp av monikers. Monikers är alltså namn som unikt identifierar varje element i modellen. XML-noden för varje modellelement innehåller en nod som anger namnet på relationen och monikern för det andra elementet.

Roller

Varje domänrelation har två roller, en källroll och en målroll.

I följande bild är raden mellan domänklassen Publisher och domänrelationen PublisherCatalog källrollen. Linjen mellan domänrelationen och Album-domänklassen är målrollen.

Roller och egenskaper.

Namnen som är associerade med en relation är särskilt viktiga när du skriver programkod som passerar modellen. När du till exempel skapar DSL-lösningen har den genererade klassen Publisher en egenskapskatalog som är en samling album. Klassen Album har en egenskap Publisher som är en enda instans av klassen Publisher.

När du skapar en relation i en DSL-definition får egenskaps- och relationsnamnen standardvärden. Du kan dock ändra dem.

Multipliciteter

Multiplikiteter anger hur många element som kan ha samma roll i en domänrelation. I exemplet anger inställningen noll-till-många (0..*) multiplicitet för katalogrollen att alla instanser av Publisher-domänklassen kan ha så många PublisherCatalog-relationslänkar som du vill ge den.

Konfigurera multipliciteten för en roll antingen genom att skriva i diagrammet eller genom att Multiplicity ändra egenskapen i fönstret Egenskaper . I följande tabell beskrivs inställningarna för den här egenskapen.

Multiplicitetstyp Description
0..* (Noll till flera) Varje instans av domänklassen kan ha flera instanser av relationen eller inga instanser av relationen.
0..1 (noll till en) Varje instans av domänklassen får inte ha fler än en instans av relationen eller inga instanser av relationen.
1..1 (En) Varje instans av domänklassen kan ha en instans av relationen. Du kan inte skapa fler än en instans av den här relationen från någon instans av rollklassen. Om valideringen är aktiverad visas ett verifieringsfel när någon instans av rollklassen inte har någon instans av relationen.
1..* (En till många) Varje instans av klassen för rollen som har den här multiplikiteten kan ha flera instanser av relationen och varje instans måste ha minst en instans av relationen. Om valideringen är aktiverad visas ett verifieringsfel när någon instans av rollklassen inte har någon instans av relationen.

Domänrelationer som klasser

En länk representeras i Store som en instans av LinkElement, som är en härledd klass av ModelElement. Du kan definiera dessa egenskaper i domänmodelldiagrammet för domänrelationer.

Du kan också göra en relation till källa eller mål för andra relationer. Högerklicka på domänrelationen i domänmodelldiagrammet och klicka sedan på Visa som klass. Ytterligare en klassruta kommer att visas. Du kan sedan ansluta relationer till den.

Du kan definiera en relation delvis genom arv, precis som du kan med domänklasser. Välj den härledda relationen och ange Basrelation i fönstret Egenskaper.

En härledd relation specialiserar sin basrelation. De domänklasser som den länkar ska härledas från eller samma som de klasser som länkas av basrelationen. När en länk till den härledda relationen skapas i en modell är det en instans av både härledda och grundläggande relationer. I programkod kan du navigera till den motsatta änden av länken med hjälp av de egenskaper som genereras antingen av basen eller av den härledda klassen.