Sdílet prostřednictvím


Jak: generování souborů z modelu UML

Z modelu UML může generovat kód programu, schémata, dokumenty, zdroje a další artefakty jakéhokoli druhu.Jeden pohodlný způsob generování textové soubory z modelu UML je použití text šablony.Tyto umožňují vložit kód programu uvnitř textu, kterou chcete generovat.

Existují tři hlavní scénáře:

  • Generování souborů z příkazu nabídky nebo speciálního tahu.Definování Visual Studio příkaz, který je k dispozici na modely UML.

  • Generování souborů z aplikace.Můžete napsat aplikaci, která čte modely UML a vytvoří soubory.

  • Generování v době návrhu.Některé funkce aplikace určit pomocí modelu a generovat kód zdroje, atd. v rámci své Visual Studio řešení.

Toto téma končí diskusi o použití generování textu.Další informace naleznete v tématu Kód generace a Text šablony T4.

Generování souborů z příkazu nabídky

Můžete použít Poznámka, auto matický text šablony v příkazu nabídky UML.Kód šablony textu nebo v samostatné dílčí třídy můžete číst zobrazeného v diagramu modelu.

Další informace o těchto funkcích naleznete v následujících tématech:

Přístup znázorněn v následujícím příkladu je vhodná pro generování textu z jednoho modelu po zahájení operace z jednoho z diagramů modelu.Zpracování modelu v rámci samostatných, zvažte použití Visual Studio Modelbus přístup k modelu a jeho prvky.

Ee329480.collapse_all(cs-cz,VS.110).gifPříklad

Chcete-li spustit příklad vytvoření Visual Studio projektu rozšíření (VSIX).Název projektu, který se používá v tomto příkladu je VdmGenerator.V source.extension.vsixmanifest soubor, klepněte na tlačítko Přidání obsahu a pole Typ nastaveno na MEF součást a zdrojová cesta odkazování na aktuální projekt.Další informace o způsobu nastavení tohoto typu projektu viz Postup: definování příkazu nabídky diagramu modelování.

Do projektu přidáte soubor C#, který obsahuje následující kód.Tato třída definuje příkaz nabídky, který se zobrazí na diagramu třídy UML.

using System;
using System.ComponentModel.Composition;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation;
using Microsoft.VisualStudio.Modeling.ExtensionEnablement;

namespace VdmGenerator
{
  [Export(typeof(ICommandExtension))]
  [ClassDesignerExtension]
  public class GenerateVdmFromClasses : ICommandExtension
  {
    [Import] public IDiagramContext DiagramContext { get; set; }
    public void Execute(IMenuCommand command)
    {
      // Initialize the template with the Model Store.
      VdmGen generator = new VdmGen(
             DiagramContext.CurrentDiagram.ModelStore);
      // Generate the text and write it.
      System.IO.File.WriteAllText
        (System.IO.Path.Combine(
            Environment.GetFolderPath(
                Environment.SpecialFolder.Desktop),
            "Generated.txt") 
         , generator.TransformText());
    }
    public void QueryStatus(IMenuCommand command)
    {
      command.Enabled = command.Visible = true;
    }
    public string Text
    { get { return "Generate VDM"; } }
  }
}

Následující soubor je text šablony.Vygeneruje řádek textu pro jednotlivé třídy UML v modelu a řádek pro každý atribut v každé třídě.Kód pro čtení vložené v textu, které jsou odděleny modelu <# ... #>.

Chcete-li vytvořit tento soubor pravým tlačítkem myši na projekt v aplikaci Solution Explorer, přejděte na Přidata klepněte na tlačítko Nové položky.Vyberte předzpracovány Text šablony.Název souboru pro tento příklad by měl být VdmGen.tt.Vlastní nástroj vlastnost souboru by měl být TextTemplatingFilePreprocessor.Další informace o šablonách předem zpracovaný kód textu, viz Spuštění generování textu s T4 Text šablony.

<#@ import namespace="Microsoft.VisualStudio.Uml.Classes" #>
<# 
   foreach (IClass classElement in store.AllInstances<IClass>())
   {
#>
Type <#= classElement.Name #> ::
<#
     foreach (IProperty attribute in classElement.OwnedAttributes)
     {
#>
       <#= attribute.Name #> : <#= 
           attribute.Type == null ? ""
                                  : attribute.Type.Name #> 
<#
     }
   }
#>

Text šablony vygeneruje C# částečné třídy, která se stane součástí z vašeho Visual Studio projektu.V samostatném souboru přidáte jiná částečná deklarace stejné třídy.Tento kód obsahuje šablony přístup k úložišti modelu UML.

using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml;
namespace VdmGenerator
{
    public partial class VdmGen
    {
        private IModelStore store;
        public VdmGen(IModelStore s)
        { store = s; }
    }
}

Chcete-li projekt otestovat, stiskněte F5.Nové instance Visual Studio se spustí.V tomto případě otevřete nebo vytvořte obsahující třídy diagram modelu UML.Některé třídy do diagramu přidat a přidejte některé atributy do každé třídy.Klepněte pravým tlačítkem myši v diagramu a klepněte na příkaz v příkladu Generovat VDM.Příkaz vytvoří soubor C:\Generated.txt.Tento soubor zkontrolujte.Jeho obsah by měl vypadat následující text, ale zobrazí seznam, vlastní třídy a atributy:

Type Class1 ::
          Attribute1 : int 
          Attribute2 : string 
Type Class2 :: 
          Attribute3 : string 

Generování souborů z aplikace

Můžete generovat soubory z aplikace, která čte modelu UML.Pro tento účel je nejvíce pružnější a odolnější metodu přístupu k modelu a jeho prvky Visual Studio Modelbus.

Můžete použít základní rozhraní API pro načtení modelu a předat do textu šablony pomocí stejné techniky jako v předchozí části modelu.Další informace o načítání model, viz Jak: čtení modelu UML v kódu programu.

Generování souborů v době návrhu

Pokud projekt obsahuje standardní způsob interpretace UML jako kód, můžete vytvořit text šablony, které umožňují generovat kód v rámci projektu z modelu UML.Obvykle by mít řešení, které obsahuje projekt modelu UML a jeden nebo více projektů pro kód aplikace.Každý kód projektu může obsahovat několik šablon, které generují program kód, prostředky a konfigurační soubory, obsah modelu na základě.Vývojář, můžete spustit všechny šablony klepnutím Transformace všechny šablony v aplikaci Solution Explorer nástrojů.Ve formě částečné třídy, snadno integrovat ručně napsané částí je obvykle generován kód programu.

A Visual Studio projekt tohoto druhu mohou být distribuovány šablony formuláře tak, aby každý člen týmu je možné vytvářet projekty, které stejným způsobem generování kódu z modelu.Šablona je obvykle součástí balíčku rozšíření, která zahrnuje ověření omezení modelu, aby bylo zajištěno splnění předběžné generování kódu.

Ee329480.collapse_all(cs-cz,VS.110).gifPostup osnovy pro generování souborů

  • Chcete-li přidat šablonu do projektu, vyberte Text šablony v dialogovém okně Přidat nový soubor.Přidání šablony do většiny typů projektu, ale není modelování projektů.

  • Nástroje vlastní vlastnost souboru šablony by měl být TextTemplatingFileGenerator, a přípona názvu souboru musí být .tt.

  • Šablona by měla obsahovat alespoň direktivu výstupu:

    <#@ output extension=".cs" #>

    Nastavte rozšíření podle jazyka projektu.

  • Chcete-li povolit generování kódu šablony pro přístup k modelu, napište <#@ assembly #> směrnic pro sestavení potřebná ke čtení modelu UML.Použití ModelingProject.LoadReadOnly() otevřete model.Další informace naleznete v tématu Jak: čtení modelu UML v kódu programu.

  • Šablona je spuštěn při uložení a po klepnutí na tlačítko Transformace všechny šablony v aplikaci Solution Explorer nástrojů.

  • Další informace o tomto typu šablony, viz Generování kódu návrhu pomocí šablon Text T4.

  • V typickém projektu máte několik šablon, které generují různé soubory ze stejného modelu.První část každé šabloně budou stejné.Chcete-li snížit zdvojení tohoto společné části přesuňte do samostatného textového souboru a potom vyvolat pomocí direktivy <#@include file="common.txt"#> v každé šabloně.

  • Můžete také definovat speciální směrnice procesor, který umožňuje poskytovat parametry procesu generování textu.Další informace naleznete v tématu Přizpůsobení textu transformace T4.

Ee329480.collapse_all(cs-cz,VS.110).gifPříklad

Tento příklad vytvoří třídy C# pro jednotlivé třídy UML ve zdrojovém modelu.

Nastavit řešení programu Visual Studio pro tento příklad

  1. Vytvoření diagramu třídy UML modelování projektu v nové řešení.

    1. V Architektura nabídky, klepněte na tlačítko Nový Diagram.

    2. Vyberte diagramu UML třídy.

    3. Vytvoření nového projektu řešení a modelování podle pokynů.

    4. Některé třídy do diagramu přidáte přetažením třídy UML nástroje z panelu nástrojů.

    5. Uložte soubor.

  2. Projekt C# nebo Visual Basic vytvořte stejné řešení.

    • V aplikaci Solution Explorer klepněte pravým tlačítkem myši řešení, přejděte na Přidata klepněte na tlačítko Nový projekt.Pod Nainstalované šablony, klepněte na tlačítko jazyka Visual Basic nebo Visual C#, a vyberte typ projektu jako Aplikace konzoly.
  3. C# nebo Visual Basic projektu přidáte soubor ve formátu prostého textu.Tento soubor bude obsahovat kód, který je sdílen, chcete-li zapsat několik šablon text.

    • V aplikaci Solution Explorer klepněte pravým tlačítkem myši projekt, přejděte na Přidata klepněte na tlačítko Nové položky.Vyberte textový soubor.

    Vložte text, který je uveden v následující části.

  4. Přidáte soubor šablony Text C# nebo Visual Basic projektu.

    • V aplikaci Solution Explorer klepněte pravým tlačítkem myši projekt, přejděte na Přidata klepněte na tlačítko Nové položky.Vyberte Text šablony.

    Vložte kód, který následuje do textového souboru šablony.

  5. Uložte textový soubor šablony.

  6. Zkontrolujte kód v pomocných souborů.Měl by obsahovat třídu pro jednotlivé třídy UML v modelu.

    1. V projektu aplikace Visual Basic klepněte na Zobrazit všechny soubory v aplikaci Solution Explorer nástrojů.

    2. Rozbalte uzel souboru šablony v aplikaci Solution Explorer.

Ee329480.collapse_all(cs-cz,VS.110).gifObsah sdílené textového souboru

V tomto příkladu soubor se nazývá SharedTemplateCode.txt a je ve stejné složce jako text šablony.

<# /* Common material for inclusion in my model templates */ #>
<# /* hostspecific allows access to the Visual Studio API */ #>
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="Microsoft.VisualStudio.Uml.Interfaces.dll"#>
<#@ assembly name="Microsoft.VisualStudio.ArchitectureTools.Extensibility.dll"#>
<#@ assembly name="EnvDTE" #>
<#@ import namespace="Microsoft.VisualStudio.Uml.Classes" #>
<#@ import namespace="Microsoft.VisualStudio.ArchitectureTools.Extensibility" #>
<#@ import namespace="Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml" #>
<#+  // Note this is a Class Feature Block
///<summary>
/// Text templates are run in a common AppDomain, so 
/// we can cache the model store that we find.
///</summary>
private IModelStore StoreCache
{
  get { return AppDomain.CurrentDomain.GetData("ModelStore") as IModelStore; }
  set { AppDomain.CurrentDomain.SetData("ModelStore", value); } 
}
private bool CacheIsOld()
{
    DateTime? dt = AppDomain.CurrentDomain
           .GetData("latestAccessTime") as DateTime?;
    DateTime t = dt.HasValue ? dt.Value : new DateTime(); 
    DateTime now = DateTime.Now;
    AppDomain.CurrentDomain.SetData("latestAccessTime", now);
    return now.Subtract(t).Seconds > 3;
}

///<summary>
/// Find the UML modeling project in this solution,
/// and load the model.
///</summary>
private IModelStore ModelStore
{
  get 
  {
    // Avoid loading the model for every template:
    if (StoreCache == null || CacheIsOld())
    {
      // Use Visual Studio API to find modeling project:
      EnvDTE.DTE dte = (EnvDTE.DTE) ((IServiceProvider) this.Host)
                       .GetService(typeof(EnvDTE.DTE));
      EnvDTE.Project project = null;
      foreach (EnvDTE.Project p in dte.Solution.Projects)
      {
        if (p.FullName.EndsWith(".modelproj"))
        {
          project = p;
          break;
        }            
      }
      if (project == null) return null;

      // Load UML model into this AppDomain
      // and access model store:
      IModelingProjectReader reader = 
           ModelingProject.LoadReadOnly(project.FullName);
      StoreCache = reader.Store;
    }
    return StoreCache;
  }
}
#>

Ee329480.collapse_all(cs-cz,VS.110).gifObsah textového souboru šablony

Následující text je umístěn v .tt souboru.Tento příklad vytvoří třídy v souboru C# z třídy UML v modelu.Však lze generovat soubory libovolného typu.Jazyk generovaného souboru na jazyk, ve kterém je kód šablony text napsán nesouvisí.

<#@include file="SharedTemplateCode.txt"#>
<#@ output extension=".cs" #>
namespace Test
{
<#
      foreach (IClass c in ModelStore.AllInstances<IClass>())
      {
#>
   public partial class <#=c.Name#>
   {   }
<#
      }
#>
}

Použití textu generace

Skutečné spotřeby modelování je získána při použití modelů navrhnout na úrovni požadavků nebo architektury.Text šablony můžete provést některé úkoly převodu vysoké úrovni nápadů do kódu.V mnoha případech to nevede k přímé korespondence mezi prvky v modelech UML a tříd nebo jiných částí kódu programu.

Kromě toho transformace závisí na problémové domény; neexistuje univerzální mapování mezi modely a kód.

Zde jsou některé příklady generování kódu z modelů:

  • Řádky produktu.Společnost Fabrikamvytvoří a nainstaluje zavazadel na letiště systémy zpracování.Mnohem software je velmi podobné mezi jedné instalace a další, ale konfigurace softwaru závisí na instalaci vaku, jaké zpracování strojního zařízení a jak tyto části jsou propojeny dopravníky.Na začátku smlouvy analytici společnosti Fabrikam projedná požadavky správa letiště a zachytit plán hardwaru pomocí diagramu činnosti UML.Vývojový tým z tohoto modelu vygeneruje konfigurační soubory, program kód, plány a uživatelské dokumenty.Po dokončení práce ruční dodatky a úpravy kódu.Jak mohou získat zkušenosti z jednoho projektu do druhého, mohou rozšířit oblast působnosti generované materiálu.

  • Vzorky.Vývojáři ve společnosti Contoso, Ltd často vytváření webů a návrhu navigační schéma pomocí UML, diagramy tříd.Každé webové stránky je reprezentována třídou a sdružení představují navigační odkazy.Vývojáři vytvářet mnohem kód webového serveru z modelu.Každá webová stránka odpovídá několik tříd a položky souboru prostředků.Tato metoda má výhody, které odpovídá jeden vzorek, takže spolehlivější a flexibilní než kód rukou konstrukce každé stránky.Vzorek je v šablonách, generování modelu se používá k zachycení proměnné aspekty.

  • Schémata.ABC pojištění má tisíce systémů po celém světě.Tyto systémy používají různých databází, jazyky a rozhraní.Architektura centrální tým publikuje interně modely obchodní koncepty a procesy.Z těchto modelů místní týmy generovat částí jejich databáze a výměnu schémata, prohlášení v kódu programu a tak dále.Grafické znázornění modely pomáhá týmům projednat návrhy.Týmy vytvořit více diagramů, které zobrazit dílčí model, které platí pro různé oblasti podnikání.Také používají barevné zvýraznění oblastí, mohou se změnit.

Důležité techniky pro generování artefakty

V předchozích příkladech modely jsou používány pro účely rozdílné obchodní závislé a výklad modelování prvky jako třídy a činnosti se liší od jedné aplikace do druhé.Tyto techniky jsou užitečné při generování artefakty z modelů.

  • Profily.I v rámci jedné obchodní oblasti výklad typu prvku se může lišit.Například na diagramu webu některé třídy mohou představovat webové stránky a ostatní představují bloky obsahu.Chcete-li usnadnit uživatelům zaznamenávat tyto rozdíly, definujte stereotypy.Stereotypy umožňuje připojit další vlastnosti, které se vztahuje na prvky tohoto druhu.Stereotypy jsou dodávány v rámci profilů.Další informace naleznete v tématu Postup: definování profilu rozšíření UML.

    Kód šablony je snadný přístup Stereotypy, které jsou definovány u objektu.Příklad:

    public bool HasStereotype(IClass c, string profile, string stereo)
    { return c.AppliedStereotypes.Any
       (s => s.Profile == profile && s.Name == stereo ); }
    
  • Modely s.Pro každý účel jsou platné všechny modely, které můžete vytvořit.Například v modelech zavazadel letiště společnosti Ramo, je nesprávné, zobrazí se změnami stůl bez odchozí dopravníku.Můžete definovat ověření funkce, které pomáhají uživatelům dodržovat tato omezení.Další informace naleznete v tématu Postup: definovat omezení ověření pro modely UML.

  • Ruční změny.Pouze některé soubory řešení mohou být generovány z modelu.Ve většině případů potřebujete přidat nebo upravit ručně generovaného obsahu.Je však důležité, že tyto změny by měla být zachována při dalším spuštění transformační šablonu.

    Kde šablony vygenerovat kód v .NET jazyky, měla generují částečné třídy, takže vývojáři mohou přidat metody a kód.Je také užitečné pro generování jednotlivých tříd jako dvojice: základní abstraktní třída obsahující metody a zdědění třídy, která obsahuje pouze konstruktor.To umožňuje vývojářům přepsat metody.Chcete-li povolit přepsání inicializace, tomu zvláštní metody namísto v konstruktory.

    Pokud šablona generuje XML a další typy výstupu, může být obtížně oddělit obsah ručně z generovaného obsahu.Jednou z možností je vytvoření úkolu v procesu vytváření, které spojuje dva soubory.Jinou metodou je pro vývojáře upravit místní kopie generování šablony.

  • Přesuňte kód do samostatných sestavení.Nedoporučujeme psaní kódu velké subjekty v šablonách.Je vhodné oddělit od výpočtu generovaného obsahu a text šablony dobře nejsou podporovány pro úpravy kódu.

    Místo toho máte provést výpočty podstatné pro generování textu sestavení těchto funkcí v samostatných sestavení a volat jeho metody ze šablony.