Začínáme s jazyky specifickými pro doménu
Toto téma vysvětluje základní koncepty při definování a použití jazyka DSL (domain-specific language) vytvořeného pomocí sady Modeling SDK pro Visual Studio.
Poznámka:
Sada SDK pro transformaci textových šablon a sada Visual Studio Modeling SDK se nainstalují automaticky při instalaci konkrétních funkcí sady Visual Studio. Další podrobnosti najdete v tomto blogovém příspěvku.
Pokud s seznamy DSL začínáte, doporučujeme pracovat v testovacím prostředí nástrojů DSL, které najdete na tomto webu: Sada SDK pro vizualizaci a modelování.
Co můžete dělat s jazykem specifickým pro doménu?
Jazyk specifický pro doménu je notace, obvykle grafická, která je navržená pro konkrétní účel. Naproti tomu jazyky, jako je UML, jsou pro obecné účely. V DSL můžete definovat typy prvků modelu a jejich relací a způsob jejich prezentace na obrazovce.
Když jste navrhli DSL, můžete ho distribuovat jako součást balíčku visual studio Integration Extension (VSIX). Uživatelé pracují s DSL v sadě Visual Studio:
Zápis je pouze součástí DSL. Společně s zápisem obsahuje balíček VSIX nástroje, které můžou uživatelé použít, aby jim pomohli upravovat a generovat materiál ze svých modelů.
Jednou z hlavních aplikací seznamů DSLS je generování kódu programu, konfiguračních souborů a dalších artefaktů. Zejména ve velkých projektech a produktových řadách, kde se vytvoří několik variant produktu, generování mnoha proměnných aspektů z seznamů DSLS může přinést velký nárůst spolehlivosti a velmi rychlou reakci na změny požadavků.
Zbytek tohoto přehledu je návod, který představuje základní operace vytváření a používání jazyka specifického pro doménu v sadě Visual Studio.
Požadavky
Chcete-li definovat DSL, musíte mít nainstalované následující součásti:
Komponenta | Odkaz |
---|---|
Visual Studio | http://go.microsoft.com/fwlink/?LinkId=185579 |
Visual Studio SDK | https://go.microsoft.com/fwlink/?linkid=2166172 |
Modeling SDK for Visual Studio |
Poznámka:
Komponenta Transformace textové šablony se automaticky nainstaluje jako součást sady funkcí vývoje rozšíření sady Visual Studio. Můžete ho také nainstalovat z karty Jednotlivé komponenty Instalační program pro Visual Studio v kategorii sad SDK, knihoven a architektur. Nainstalujte komponentu Modeling SDK z karty Jednotlivé komponenty .
Vytvoření řešení DSL
Pokud chcete vytvořit nový jazyk specifický pro doménu, vytvoříte nové řešení sady Visual Studio pomocí šablony projektu Pro konkrétní doménu.
V nabídce Soubor přejděte na příkaz Nový a klepněte na tlačítko Projekt.
V části Typy projektů rozbalte uzel Jiné typy projektů a klepněte na tlačítko Rozšiřitelnost.
Klikněte na Návrhář jazyka specifický pro doménu.
Do pole Název zadejte FamilyTree. Klikněte na OK.
Otevře se Průvodce jazykem specifickým pro doménu a zobrazí seznam řešení DSL šablony.
Kliknutím na každou šablonu zobrazíte popis.
Šablony jsou užitečné výchozí body. Každý z nich poskytuje kompletní funkční DSL, který můžete upravit tak, aby vyhovoval vašim potřebám. Obvykle byste zvolili šablonu, která je nejblíže tomu, co chcete vytvořit.
Pro účely tohoto názorného postupu zvolte šablonu Minimální jazyk .
Na příslušné stránce průvodce zadejte příponu názvu souboru dsl. Toto je přípona, kterou budou používat soubory obsahující instance vašeho DSL.
Zvolte rozšíření, které není přidružené k žádné aplikaci v počítači nebo v libovolném počítači, do kterého chcete nainstalovat DSL. Například docx a htm by byly nepřijatelné přípony názvů souborů.
Průvodce vás upozorní, pokud se zadané rozšíření používá jako DSL. Zvažte použití jiné přípony názvu souboru. Experimentální instanci sady Visual Studio SDK můžete také resetovat, abyste vypnuli staré experimentální návrháře. V nabídce Start systému Windows zadejte resetování sady Visual Studio a spusťte příkaz Obnovit experimentální instanci sady Microsoft Visual Studio odpovídající vaší verzi sady Visual Studio.
Zkontrolujte ostatní stránky a klikněte na tlačítko Dokončit.
Vygeneruje se řešení, které obsahuje dva projekty. Mají název Dsl a DslPackage. Otevře se soubor diagramu s názvem DslDefinition.dsl.
Poznámka:
Většina kódu, který můžete vidět ve složkách ve dvou projektech, se generuje z DslDefinition.dsl. Z tohoto důvodu se většina úprav dsl provádí v tomto souboru.
Uživatelské rozhraní se teď podobá následujícímu obrázku.
Toto řešení definuje jazyk specifický pro doménu. Další informace naleznete v tématu Přehled uživatelského rozhraní nástroje pro konkrétní doménu.
Důležité části řešení DSL
Všimněte si následujících aspektů nového řešení:
Dsl\DslDefinition.dsl Toto je soubor, který uvidíte při vytváření řešení DSL. Téměř veškerý kód v řešení je generován z tohoto souboru a většina změn, které provedete v definici DSL, jsou zde provedeny. Další informace naleznete v tématu Práce s diagramem definice DSL.
Projekt Dsl Tento projekt obsahuje kód, který definuje jazyk specifický pro doménu.
Projekt DslPackage Tento projekt obsahuje kód, který umožňuje otevření a úpravu instancí DSL v sadě Visual Studio.
Spuštění DSL
Řešení DSL můžete spustit hned, jak jste ho vytvořili. Později můžete definici DSL upravit postupně a po každé změně znovu spustit řešení.
Experimentování s DSL
Na panelu nástrojů Průzkumník řešení klikněte na Transformovat všechny šablony. Tím se vygeneruje většina zdrojového kódu z DslDefinition.dsl.
Poznámka:
Kdykoli změníte DslDefinition.dsl, musíte před opětovnou sestavením řešení kliknout na Transformovat všechny šablony . Tento krok můžete automatizovat. Další informace naleznete v tématu Automatizace transformace všech šablon.
Stiskněte klávesu F5 nebo v nabídce Ladění klepněte na tlačítko Spustit ladění.
DSL sestaví a nainstaluje se v experimentální instanci sady Visual Studio.
Spustí se experimentální instance sady Visual Studio. Experimentální instance přebírá nastavení z samostatného podstromu registru, kde jsou rozšíření sady Visual Studio zaregistrovaná pro účely ladění. Normální instance sady Visual Studio nemají přístup k rozšířením, která jsou tam zaregistrovaná.
V experimentální instanci sady Visual Studio otevřete soubor modelu s názvem Test z Průzkumník řešení.
- nebo -
Klepněte pravým tlačítkem myši na projekt Ladění, přejděte na příkaz Přidat a klepněte na položku. V dialogovém okně Přidat položku vyberte typ souboru DSL.
Soubor modelu se otevře jako prázdný diagram.
Panel nástrojů se otevře a zobrazí nástroje vhodné pro typ diagramu.
Pomocí nástrojů můžete v diagramu vytvářet obrazce a spojnice.
Obrazce vytvoříte přetažením z nástroje Příklad obrazce do diagramu.
Chcete-li propojit dva obrazce, klikněte na nástroj Příklad spojnice, klikněte na první obrazec a potom klikněte na druhý obrazec.
Kliknutím na popisky obrazců je můžete změnit.
Vaše experimentální sada Visual Studio bude vypadat podobně jako v následujícím příkladu:
Obsah modelu
Obsah souboru, který je instancí DSL, se nazývá model. Model obsahuje prvky modelu a propojení mezi prvky. Definice DSL určuje, jaké typy prvků modelu a propojení mohou v modelu existovat. Například v DSL vytvořeném ze šablony Minimální jazyk existuje jeden typ prvku modelu a jeden typ odkazu.
Definice DSL může určit, jak se model zobrazuje v diagramu. Můžete si vybrat z různých stylů obrazců a spojnic. Můžete určit, že se některé obrazce zobrazí uvnitř jiných obrazců.
Model můžete během úprav modelu zobrazit jako strom v zobrazení Průzkumníka . Při přidávání obrazců do diagramu se prvky modelu zobrazí také v průzkumníku. Průzkumníka je možné použít i v případě, že neexistuje žádný diagram.
Pokud v instanci ladění sady Visual Studio nevidíte Průzkumníka, přejděte v nabídce Zobrazení na jiný systém Windows a potom klikněte na <Příkaz Průzkumníka jazyků>.
Rozhraní API vašeho DSL
Vaše DSL generuje rozhraní API, které umožňuje číst a aktualizovat modely, které jsou instancemi DSL. Jednou z aplikací rozhraní API je generování textových souborů z modelu. Další informace naleznete v tématu Generování kódu v době návrhu pomocí textových šablon T4.
V řešení ladění otevřete soubory šablony s příponou .tt. Tyto ukázky demonstrují, jak můžete generovat text z modelů, a umožňují otestovat rozhraní API vašeho DSL. Jedna z ukázek je napsaná v jazyce Visual Basic, druhá v jazyce Visual C#.
Pod každým souborem šablony je soubor, který generuje. Rozbalte soubor šablony v Průzkumník řešení a otevřete vygenerovaný soubor.
Soubor šablony obsahuje krátký segment kódu, který obsahuje seznam všech prvků v modelu.
Vygenerovaný soubor obsahuje výsledek.
Když změníte soubor modelu, uvidíte po opětovném vygenerování souborů odpovídající změny ve vygenerovaných souborech.
Opětovné vygenerování textových souborů po změně souboru modelu
V experimentální instanci sady Visual Studio uložte soubor modelu.
Ujistěte se, že parametr názvu souboru v každém souboru .tt odkazuje na soubor modelu, který používáte pro experimenty. Uložte soubor .tt.
Na panelu nástrojů Průzkumník řešení klikněte na Transformovat všechny šablony.
- nebo -
Klikněte pravým tlačítkem myši na šablony, které chcete znovu vygenerovat, a potom klepněte na příkaz Spustit vlastní nástroj.
Do projektu můžete přidat libovolný počet souborů textových šablon. Každá šablona vygeneruje jeden soubor výsledků.
Poznámka:
Když změníte definici DSL, kód ukázkové textové šablony nebude fungovat, pokud ji neaktualizujete.
Další informace naleznete v tématu Generování kódu z jazyka specifického pro doménu a psaní kódu pro přizpůsobení jazyka specifického pro doménu.
Přizpůsobení DSL
Pokud chcete upravit definici DSL, zavřete experimentální instanci a aktualizujte definici v hlavní instanci sady Visual Studio.
Poznámka:
Po úpravě definice DSL můžete přijít o informace v testovacích modelech, které jste vytvořili pomocí předchozích verzí. Například řešení ladění obsahuje soubor s názvem Ukázka, který obsahuje některé obrazce a spojnice. Jakmile začnete vyvíjet definici DSL, nebudou viditelné a při uložení souboru budou ztraceny.
Pro dsl můžete vytvořit širokou škálu rozšíření. Následující příklady vám poskytnou představu o možnostech.
Po každé změně uložte definici DSL, klepněte na tlačítko Transformovat všechny šablony v Průzkumník řešení a potom stisknutím klávesy F5 experimentujte se změněnou DSL.
Přejmenování typů a nástrojů
Přejmenujte existující třídy a relace domény. Například počínaje definicí Dsl vytvořenou ze šablony Minimální jazyk můžete provést následující operace přejmenování, aby DSL představovala rodinné stromy.
Přejmenování doménových tříd, relací a nástrojů
V diagramu DslDefinition přejmenujte ExampleModel na FamilyTreeModel, ExampleElement na Person, Targets to Parents a Sources to Children. Kliknutím na každý popisek ho můžete změnit.
Přejmenujte element a nástroje konektoru.
Kliknutím na kartu pod Průzkumník řešení otevřete okno Průzkumníka DSL. Pokud ho nevidíte, přejděte v nabídce Zobrazení na jiný systém Windows a klepněte na tlačítko DSL Explorer. Průzkumník DSL je viditelný pouze v případech, kdy je aktivním oknem diagram definice DSL.
Otevřete okno Vlastnosti a umístěte ho tak, abyste viděli Průzkumníka DSL a vlastnosti najednou.
V Průzkumníku DSL rozbalte editor, karty nástrojů, <dsl> a potom Nástroje.
Klikněte na ExampleElement. Toto je položka panelu nástrojů, která slouží k vytváření prvků.
V okno Vlastnosti změňte vlastnost Jméno na Person.
Všimněte si, že vlastnost Titulek se také změní.
Stejným způsobem změňte název nástroje ExampleConnector na ParentLink. Upravte vlastnost Caption tak, aby nebyla kopií vlastnosti Name. Zadejte například nadřazený odkaz.
Znovu sestavte DSL.
Uložte soubor definice DSL.
Na panelu nástrojů Průzkumník řešení klikněte na Transformovat všechny šablony.
Stiskněte klávesu F5. Počkejte, až se zobrazí experimentální instance sady Visual Studio.
V řešení ladění v experimentální instanci sady Visual Studio otevřete soubor testovacího modelu. Přetáhněte na něj prvky ze sady nástrojů. Všimněte si, že se změnily titulky nástrojů a názvy typů v Průzkumníku DSL.
Uložte soubor modelu.
Otevřete soubor .tt a nahraďte výskyty starého typu a názvů vlastností novými názvy.
Ujistěte se, že název souboru zadaný v souboru .tt určuje váš testovací model.
Uložte soubor .tt. Otevřete vygenerovaný soubor, abyste viděli výsledek spuštění kódu v souboru .tt. Ověřte správnost.
Přidání vlastností domény do tříd
Přidejte vlastnosti do třídy domény, například představující roky narození a smrt osoby.
Chcete-li, aby byly nové vlastnosti viditelné v diagramu, musíte přidat dekorátory do obrazce, který zobrazuje prvek modelu. Vlastnosti musíte také mapovat na dekorátory.
Přidání vlastností a jejich zobrazení
Přidejte vlastnosti.
V diagramu definice DSL klepněte pravým tlačítkem myši na třídu domény Person , přejděte na příkaz Přidat a klepněte na položku Domain Property.
Zadejte seznam nových názvů vlastností, například Narození a Smrt. Po každém z nich stiskněte Enter .
Přidejte dekorátory, které zobrazí vlastnosti v obrazci.
Sledujte šedou čáru, která se rozšiřuje z třídy domény Person na druhou stranu diagramu. Toto je mapování prvků diagramu. Propojuje třídu domény s třídou obrazce.
Klikněte pravým tlačítkem myši na tuto třídu obrazce, přejděte na příkaz Přidat a potom klikněte na příkaz Dekorátor textu.
Přidejte dva dekorátory s názvy, jako jsou BirthDecorator a DeathDecorator.
Vyberte každý nový dekorátor a v okno Vlastnosti nastavte pole Pozice. Určuje, kde se na obrazci zobrazí hodnota vlastnosti domény. Například nastavte InnerBottomLeft a InnerBottomRight.
Namapujte dekorátory na vlastnosti.
Otevřete okno s podrobnostmi DSL. Obvykle je na kartě vedle okna Výstup. Pokud ho nevidíte, v nabídce Zobrazení přejděte na příkaz Ostatní okna a klepněte na tlačítko DSL Podrobnosti.
V diagramu definice DSL klikněte na čáru, která spojuje třídu domény Person s třídou obrazce.
V DSL Details, on the Decorator Maps tab, click the check box on an unmapped decorator. V zobrazení vlastnosti vyberte vlastnost domény, na kterou chcete mapovat. Například namapovat BirthDecorator na Birth.
Uložte DSL, klikněte na Transformovat všechny šablony a stiskněte klávesu F5.
V ukázkovém diagramu modelu ověřte, že teď můžete kliknout na zvolené pozice a zadat do nich hodnoty. Kromě toho, když vyberete obrazec Osoba, okno Vlastnosti zobrazí nové vlastnosti Narození a Smrt.
V souboru .tt můžete přidat kód, který získá vlastnosti každé osoby.
Definování nových tříd
Do modelu můžete přidat třídy domény a relace. Můžete například vytvořit novou třídu, která bude reprezentovat města, a nový vztah, který bude představovat, že osoba žila ve městě.
Pokud chcete, aby různé typy byly v diagramu modelu odlišné, můžete třídy domény mapovat na různé druhy obrazců nebo na obrazce s různými geometrií a barvami.
Přidání a zobrazení nové třídy domény
Přidejte třídu domény a nastavte ji jako podřízenou kořen modelu.
V diagramu definice DSL klepněte na nástroj Embedding Relationship , klepněte na kořenovou třídu FamilyTreeModel a potom klikněte do prázdné části diagramu.
Zobrazí se nová třída domény, která je připojena k FamilyTreeModel s vloženým vztahem.
Nastavte jeho název, například Město.
Poznámka:
Každá třída domény s výjimkou kořenového adresáře modelu musí být cílem alespoň jedné relace vložení, nebo musí dědit z třídy, která je cílem vkládání. Z tohoto důvodu je často vhodné vytvořit třídu domény pomocí nástroje Embedding Relationship.
Přidejte do nové třídy vlastnost domény, například Name.
Přidejte vztah odkazu mezi osobou a městem.
Klikněte na nástroj Referenční vztah, klepněte na položku Osoba a potom klepněte na tlačítko Město.
Poznámka:
Relace odkazů představují křížové odkazy z jedné části stromu modelu do jiné.
Přidejte obrazec, který bude reprezentovat města v diagramech modelu.
Přetáhněte obrazec geometrie z panelu nástrojů do diagramu a přejmenujte ho, například TownShape.
V okno Vlastnosti nastavte pole Vzhled nového obrazce, jako je barva výplně a geometrie.
Přidejte dekorátor, který zobrazí název města a přejmenuje ho NameDecorator. Nastavte jeho vlastnost Position.
Namapujte třídu domény města na TownShape.
Klikněte na nástroj Mapa elementů diagramu, potom klikněte na třídu domény města a potom na třídu obrazce TownShape.
Na kartě Mapy dekorátoru okna s podrobnostmi DSL s vybraným konektorem mapy zkontrolujte NameDecorator a nastavte Zobrazovanou vlastnost na Název.
Vytvořte spojnici, která zobrazí vztah mezi osobami a městy.
Přetáhněte spojnici ze sady nástrojů do diagramu. Přejmenujte ho a nastavte jeho vlastnosti vzhledu.
Pomocí nástroje Mapování prvků diagramu propojíte nový spojnice se vztahem mezi osobou a městem.
Vytvořte nástroj prvku pro vytvoření nového města.
V Průzkumníku DSL rozbalte editor a potom karty panelu nástrojů.
Klikněte pravým tlačítkem myši na váš DSL> a potom klepněte na tlačítko Přidat nový prvek nástroj.<
Nastavte vlastnost Name nového nástroje a nastavte jeho vlastnost Class na Město.
Nastavte vlastnost Ikona panelu nástrojů. Klikněte na [...] a v poli Název souboru vyberte soubor ikony.
Vytvořte nástroj konektoru pro vytvoření propojení mezi městy a lidmi.
Klepněte pravým tlačítkem myši na <dsl> a potom klepněte na tlačítko Přidat nový konektor nástroj.
Nastavte vlastnost Name nového nástroje.
Ve vlastnosti ConnectionBuilder vyberte tvůrce, který obsahuje název vztahu Person-Town.
Nastavte ikonu panelu nástrojů.
Uložte definici DSL, klikněte na transformovat všechny šablony a stiskněte klávesu F5.
V experimentální instanci sady Visual Studio otevřete soubor testovacího modelu. Pomocí nových nástrojů můžete vytvářet města a vazby mezi městy a osobami. Všimněte si, že můžete vytvořit pouze propojení mezi správnými typy elementu.
Vytvořte kód, ve kterém je uvedeno město, ve kterém žije každý člověk. Textové šablony jsou jedním z míst, kde můžete takový kód spustit. Můžete například upravit existující soubor Sample.tt v řešení ladění tak, aby obsahoval následující kód:
<#@ template inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation" debug="true" #> <#@ output extension=".txt" #> <#@ FamilyTree processor="FamilyTreeDirectiveProcessor" requires="fileName='Sample.ftree'" #> <# foreach (Person person in this.FamilyTreeModel.People) { #> <#= person.Name #><#if (person.Town != null) {#> of <#= person.Town.Name #> <#}#> <# foreach (Person child in person.Children) { #> <#= child.Name #> <# } } #>
Když soubor *.tt uložíte, vytvoří se podřízený soubor, který bude obsahovat seznam osob a jejich bydliště. Další informace naleznete v tématu Generování kódu z jazyka specifického pro doménu.
Ověřování a příkazy
Tuto DSL můžete dále vyvinout přidáním omezení ověřování. Tato omezení jsou metody, které můžete definovat, které zajišťují, že je model ve správném stavu. Můžete například definovat omezení, abyste měli jistotu, že datum narození dítěte je pozdější než datum narození jeho rodičů. Funkce ověření zobrazí upozornění, pokud se uživatel DSL pokusí uložit model, který přeruší některá omezení. Další informace naleznete v tématu Ověřování v jazyce specifickém pro doménu.
Můžete také definovat příkazy nabídky, které může uživatel vyvolat. Příkazy můžou model upravit. Můžou také pracovat s jinými modely v sadě Visual Studio a s externími prostředky. Další informace naleznete v tématu Postupy: Úprava standardního příkazu nabídky.
Nasazení DSL
Pokud chcete ostatním uživatelům povolit používání jazyka specifického pro doménu, distribuujete soubor rozšíření sady Visual Studio (VSIX). Tato možnost se vytvoří při sestavování řešení DSL.
Vyhledejte soubor .vsix ve složce bin vašeho řešení. Zkopírujte ho do počítače, na který ho chcete nainstalovat. V tomto počítači poklikejte na soubor VSIX. DSL lze použít ve všech instancích sady Visual Studio v tomto počítači.
Stejný postup můžete použít k instalaci DSL do vlastního počítače, abyste nemuseli používat experimentální instanci sady Visual Studio.
Další informace najdete v tématu Nasazení jazykových řešení specifických pro doménu.
Odebrání starých experimentálních seznamů DSLS
Pokud jste už vytvořili experimentální seznamy DSLS, které už nechcete, můžete je z počítače odebrat resetováním experimentální instance sady Visual Studio.
Tím se z počítače odeberou všechny experimentální seznamy DSL a další experimentální rozšíření sady Visual Studio. Jedná se o rozšíření, která se spustila v režimu ladění.
Tento postup neodebere seznamy DSLS ani jiná rozšíření sady Visual Studio, která byla plně nainstalována spuštěním souboru VSIX.
Resetování experimentální instance sady Visual Studio
V nabídce Start systému Windows zadejte resetování sady Visual Studio a spusťte příkaz Obnovit experimentální instanci sady Microsoft Visual Studio odpovídající vaší verzi sady Visual Studio.
Znovu sestavte všechny experimentální seznamy DSLS nebo jiná experimentální rozšíření sady Visual Studio, která stále chcete použít.