Sdílet prostřednictvím


Porozumění modelům, třídám a relacím

Jazyk specifický pro doménu (DSL) je definován jeho souborem DSL Definition spolu s veškerým vlastním programovým kódem, který byste mohli napsat. Většina kódu programu v řešení DSL je generována z tohoto souboru.

Toto téma vysvětluje centrální funkce definice DSL.

Definice DSL

Po otevření Dsl\DslDefinition.dslse okno sady Visual Studio podobá následujícímu obrázku.

Dsl Designer

Nejdůležitější informace v definici DSL jsou zobrazeny v diagramu definice DSL. Další informace, které jsou také součástí DslDefinition.dsl, se zobrazí v Průzkumníku DSL, který se obvykle zobrazuje na straně diagramu. Pracujete s diagramem pro nejčastější úlohy a s Průzkumníkem DSL pro pokročilejší přizpůsobení.

Diagram definice DSL znázorňuje třídy domény, které definují prvky modelu, a relace, které definují propojení mezi prvky modelu. Zobrazuje také obrazce a spojnice, které slouží k zobrazení prvků modelu uživateli.

dsl designer s plaveckou drahou

Když vyberete položku v definici DSL, buď v diagramu nebo v Průzkumníku DSL, zobrazí se informace o ní v okně Vlastnosti. Další informace mohou být zobrazeny v okně s podrobnostmi DSL.

Modely jsou instancemi DSL.

Model je instance vašeho DSL vytvořeného uživatelem. Model obsahuje prvky modelu, které jsou instancemi tříd domény, které definujete, a propojení mezi prvky, které jsou instancemi relací domény, které definujete. Model může mít také obrazce a spojnice, které zobrazují prvky modelu a propojení v diagramu. Definice DSL zahrnuje třídy obrazců, třídy spojnic a třídu diagramu.

Definice DSL se také označuje jako doménový model. Definice DSL nebo doménový model je návrhové vyjádření jazyka specifického pro doménu, zatímco model je instance běhu jazyka specifického pro doménu.

Třídy domény definují prvky modelu

Třídy domény se používají k vytvoření různých prvků v doméně a vztahy mezi doménou jsou propojení mezi prvky. Jedná se o návrhovou reprezentaci prvků a odkazů, které budou vytvářet instance uživatelům jazyka specifického pro návrh při vytváření modelů.

Tento obrázek znázorňuje model vytvořený uživatelem hudební knihovny DSL. Hudební alba jsou reprezentována poli, která obsahují seznamy skladeb. Interpreti jsou reprezentováni kruhovými rámečky a jsou připojeni k albům, ke kterým přispěli.

Model instance vygenerovaného DSL

Definice DSL odděluje dva aspekty. Vzhled prvků modelu v diagramu modelu je definován pomocí tříd obrazců a tříd spojnic. Informace přenášené v modelu se definují pomocí doménových tříd a vztahů mezi doménou.

Následující obrázek znázorňuje třídy a vztahy domény v definici DSL knihovny hudby.

Vkládání a referenční vztahy

Na obrázku jsou čtyři třídy domény: Hudba, Album, Interpret a Song. Třídy domény definují vlastnosti domény, jako je Název, Titulek atd. V modelu instance se v diagramu zobrazí hodnoty některých z těchto vlastností.

Mezi třídami jsou doménové vztahy: MusicHasAlbums, MusicHasArtists, AlbumbHasSongs a ArtistAppearedOnAlbums. Relace mají násobnosti, jako například 1..1, 0..*. Například každá skladba musí souviset s přesně jedním albem prostřednictvím relace AlbumHasSongs. Každé album může mít libovolný počet skladeb.

Změna uspořádání diagramu definice DSL

Všimněte si, že třída domény se může v diagramu definice DSL objevit několikrát, jak to album dělá na tomto obrázku. Vždy existuje jedno hlavní zobrazení a může existovat několik referenčních zobrazení.

Pokud chcete změnit uspořádání diagramu definice DSL, můžete:

  • Primární a referenční zobrazení můžete prohodit pomocí příkazů Přenést strom sem a Rozdělit strom. Kliknutím pravým tlačítkem myši na jednu třídu domény zobrazíte tyto příkazy.

  • Přeuspořádejte třídy domény a třídy obrazců stisknutím kombinace kláves Ctrl+Šipka nahoru a Ctrl+Šipka dolů.

  • Sbalte nebo rozbalte třídy pomocí ikony v pravém horním rohu každého obrazce.

  • Sbalte části stromu kliknutím na znaménko minus (-) pod doménovou třídou.

Dědičnost

Třídy domény lze definovat pomocí dědičnosti. Chcete-li vytvořit odvození dědičnosti, klepněte na nástroj Dědičnost, klepněte na odvozenou třídu a potom klepněte na základní třídu. Prvek modelu má všechny vlastnosti, které jsou definovány ve vlastní doménové třídě, spolu se všemi vlastnostmi zděděnými ze základní třídy. Dědí také své role v relacích.

Dědičnost se dá použít také mezi relacemi, obrazci a spojnicemi. Dědičnost musí zůstat ve stejné skupině. Tvar nemůže dědit z doménové třídy.

Vztahy mezi doménami

Prvky modelu můžou být propojeny relacemi. Odkazy jsou vždy binární; propojí přesně dva prvky. Jakýkoli prvek však může mít mnoho odkazů na jiné objekty a může existovat dokonce více než jedno propojení mezi stejnou dvojicí prvků.

Stejně jako můžete definovat různé třídy prvků, můžete definovat různé třídy odkazů. Třída odkazu se nazývá vztah domény. Vztah domény určuje, k jakým třídám elementů se mohou instance připojit. Každému konci relace se říká role a vztah domény definuje názvy obou rolí a také pro samotnou relaci.

Jsou dva druhy vztahů mezi doménami: vkládací vztahy a referenční vztahy. V diagramu definice DSL mají vložené relace plné čáry v každé roli a referenční relace mají přerušované čáry.

Vkládání relací

Každý prvek v modelu s výjimkou kořenového adresáře je cílem jednoho vloženého odkazu. Proto celý model tvoří jeden strom vložených odkazů. Vnořený vztah představuje zahrnutí nebo vlastnictví. Dva prvky modelu, které jsou tímto způsobem související, se také označují jako nadřazené a podřízené prvky. Dítě je řečeno, že je vloženo do nadřazeného objektu.

Vložené odkazy se obvykle nezobrazují explicitně jako spojnice v diagramu. Místo toho jsou obvykle reprezentovány omezením. Kořen modelu je reprezentován diagramem a prvky, které jsou v něm vložené, se zobrazují jako obrazce v diagramu.

V příkladu má kořenová třída Music vložený vztah MusicHasAlbums k Albu, který má vkládání AlbumHasSongs do Song. Skladby se zobrazují jako položky v seznamu uvnitř každého alba. Hudba má také vazbu MusicHasArtists do třídy Umělec, jejíž instance se také zobrazují jako obrazce v diagramu.

Ve výchozím nastavení se vložené prvky automaticky odstraní při odstranění jejich nadřazených prvků.

Pokud jste serializaci nepřizpůsobili, jsou vložené elementy při ukládání modelu do souboru ve formátu XML vnořené do svých nadřazených prvků.

Poznámka:

Vkládání není stejné jako dědičnost. Podřízené položky v vložené relaci nedědí vlastnosti nadřazeného objektu. Vložení je typ propojení mezi prvky modelu. Dědičnost je vztah mezi třídami a nevytvoří propojení mezi prvky modelu.

Pravidla vkládání

Každý prvek v modelu instance musí být cílem přesně jednoho vloženého odkazu s výjimkou kořenového adresáře modelu.

Proto musí být každá ne abstraktní doménová třída s výjimkou kořenové třídy cílem alespoň jedné relace vložení, nebo musí dědit vložení ze základní třídy. Třída může být cílem dvou nebo více vložených objektů, ale prvky modelu instance mohou mít najednou pouze jeden nadřazený objekt. Násobnost z cíle na zdroj musí být 0..1 nebo 1..1.

Průzkumník zobrazí strom vkládání.

Definice DSL také vytvoří průzkumníka, který uživatelé uvidí společně s diagramem modelu.

Vygenerovaný průzkumník DSL

Průzkumník zobrazí všechny prvky v modelu, i ty, pro které jste nedefinovali žádné obrazce. Zobrazuje prvky a vložené vztahy, ale ne referenční vztahy.

Pokud chcete zobrazit hodnoty vlastností domény elementu, uživatel vybere prvek v diagramu modelu nebo v Průzkumníku modelů a otevře okno Vlastnosti. Zobrazí všechny vlastnosti domény, včetně těch, které nejsou zobrazeny v diagramu. V tomto příkladu má každá skladba název i žánr, ale v diagramu je zobrazena pouze hodnota Názvu.

Referenční relace

Relace odkazu představuje jakýkoli druh relace, která není vložena.

Referenční relace se obvykle zobrazují v diagramu jako spojnice mezi obrazci.

Ve znázornění MODELU ve formátu XML je odkaz mezi dvěma prvky reprezentován pomocí monikers. To znamená, že monikers jsou názvy, které jednoznačně identifikují každý prvek v modelu. Uzel XML pro každý prvek modelu obsahuje uzel, který určuje název relace a moniker druhého prvku.

Seznam rolí

Každý vztah domény má dvě role, zdrojovou roli a cílovou roli.

Na následujícím obrázku je přímkou mezi třídou domény Publisheru a vztahem domény PublisherCatalog zdrojová role. Linie mezi vztahem domény a třídou domény Album je cílovou rolí.

Role a vlastnosti.

Názvy přidružené k relaci jsou zvláště důležité při psaní kódu programu, který prochází modelem. Například když sestavíte řešení DSL, má vygenerovaná třída Publisher vlastnost Catalog, která zahrnuje kolekci alb. Třída Album má vlastnost Publisher, která je jedinou instancí třídy Publisher.

Když vytvoříte relaci v definici DSL, vlastnost a názvy relací mají výchozí hodnoty. Můžete je ale změnit.

Násobnosti

Násobnost určuje, kolik prvků může mít stejnou roli v relaci v rámci domény. V uvedeném příkladu nastavení násobnosti nula až mnoho (0..*) pro roli Katalog určuje, že každá instance doménové třídy Publisher může mít libovolný počet vazeb na relaci PublisherCatalog.

Nakonfigurujte násobnost role zadáním do diagramu nebo úpravou Multiplicity vlastnosti v okně Vlastnosti . Následující tabulka popisuje nastavení této vlastnosti.

Typ násobnosti Description
0..* (nula až mnoho) Každá instance třídy domény může mít více instancí relace nebo žádné instance relace.
0..1 (nula na jednu) Každá instance třídy domény nesmí mít více než jednu instanci relace nebo žádné instance relace.
1..1 (jedna) Každá instance třídy domény může mít jednu instanci relace. Z žádné instance třídy role nelze vytvořit více než jednu instanci této relace. Pokud je ověření povolené, zobrazí se chyba ověření, když žádná instance třídy role nemá žádnou instanci relace.
1..* (Jeden až mnoho) Každá instance třídy v roli, která má tuto násobnost, může mít více instancí relace a každá instance musí mít alespoň jednu instanci relace. Pokud je ověření povolené, zobrazí se chyba ověření, když žádná instance třídy role nemá žádnou instanci relace.

Relace domény jako třídy

Odkaz je reprezentován ve Storu jako instance LinkElement, což je odvozená třída ModelElement. Tyto vlastnosti můžete definovat v diagramu doménového modelu v relacích domény.

Můžete také vytvořit relaci jako zdroj nebo cíl jiných relací. V diagramu doménového modelu klikněte pravým tlačítkem myši na vztah domény a potom klikněte na Zobrazit jako třídu. Zobrazí se další okno třídy. Poté k němu můžete připojit vztahy.

Vztah můžete definovat částečně dědičností, stejně jako u tříd domény. V okně Vlastnosti vyberte odvozenou relaci a nastavte základní relaci .

Odvozený vztah specializuje svůj základní vztah. Třídy domény, které odkazuje, by měly být odvozeny nebo stejné jako třídy propojené základní relací. Při vytvoření propojení odvozené relace v modelu se jedná o instanci odvozené i základní relace. V kódu programu můžete přejít na opačný konec odkazu pomocí vlastností vygenerovaných buď základnou, nebo odvozenou třídou.