Sdílet prostřednictvím


Porozumění modelům, třídám a vztahů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 with swimlane

Když vyberete položku v definici DSL, a to buď v diagramu nebo v PRŮZKUMNÍKu DSL, zobrazí se informace o ní v okno Vlastnosti. Další informace mohou být zobrazeny v okně s podrobnostmi DSL.

Modely jsou instancemi seznamů DSLS.

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.

Instance model of generated 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.

Embedding and Reference relationships

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, Název 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ásobená města, 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:

  • Hlavní zobrazení a zobrazení odkazů 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ů.

  • Sbalení nebo rozbalení tříd pomocí ikony v pravém horním rohu každého obrazce

  • Sbalte části stromu kliknutím na znaménko minus (-) v dolní části třídy domény.

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 Připojení ory. Dědičnost musí zůstat ve stejné skupině. Obrazec nemůže dědit z třídy domény.

Vztahy mezi doménou

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, jaké třídy 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.

Existují dva druhy vztahů mezi doménou: vkládání relací a referenčních relací. 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ů. Vztah vkládání 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 zahrnutí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é vkládání MusicHasArtists do třídy Interpret, jehož 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 je model uložen do souboru ve formuláři XML, vložené elementy jsou vnořené do jejich nadřazených prvků, pokud jste serializaci přizpůsobili.

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.

Generated explorer of DSL

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

Pokud chcete zobrazit hodnoty vlastností domény elementu, uživatel vybere prvek, a to buď 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.

Role

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. Cílovou rolí je čára mezi vztahem domény a třídou domény Album .

Roles and properties.

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 při vytváření řešení DSL má vygenerovaná třída Publisher vlastnost Catalog, která je kolekce 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.

Multiplicities

Násobení určuje, kolik prvků může mít stejnou roli v relaci domény. V příkladu nastavení násobnosti nula na N (0..*) u role Katalogu určuje, že každá instance třídy domény Publisheru může mít tolik odkazů na relaci PublisherCatalog, kolik chcete dát.

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 Popis
0..* (nula na 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 mezi doménou 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 příkaz Zobrazit jako třídu. Zobrazí se další pole třídy. Pak se k němu můžete připojit relace.

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

Odvozený vztah se specializuje na 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.