Udostępnij za pośrednictwem


Porady: generowanie plików z modelu UML

Od modelu UML można wygenerować kodu programu, schematy, dokumenty, zasobów i innych artefakty wszelkiego rodzaju.Jeden wygodną metodą generowania plików tekstowych z modelu UML jest wykorzystanie Szablony tekst.Umożliwiają one osadzić kod programu wewnątrz tekstu, który chcesz wygenerować.

Istnieją trzy główne scenariusze:

  • Generowanie plików polecenia menu lub gestu.Można zdefiniować Visual Studio polecenia, które jest dostępne w modelach UML.

  • Generowanie plików z aplikacji.Można napisać aplikację, który czyta modeli UML i generuje pliki.

  • Generowanie w czasie projektowania.Korzystanie z modelu, aby zdefiniować niektóre funkcje aplikacji i generowania kodu, zasoby, i tak dalej w sieci Visual Studio roztworu.

W tym temacie kończy się na dyskusji z jak używać generacji tekst.Aby uzyskać więcej informacji, zobacz Generowanie kodu i szablony tekstowe T4.

Generowanie plików polecenia menu

Można użyć preprocesorem szablony tekstu wewnątrz polecenia menu UML.Kodem szablonu tekstu lub w osobnej klasy częściowe można odczytać modelu, który jest wyświetlany przez diagram.

Aby uzyskać więcej informacji o tych funkcjach przeczytaj następujące tematy:

Podejście pokazano w poniższym przykładzie jest odpowiednia do generowania tekstu z jednego modelu, po zainicjowaniu operacji z jednej z diagramami modelu.Do przetworzenia modelu w kontekście oddzielnych, należy rozważyć użycie Programu Visual Studio Modelbus dostęp do modelu i jej elementów.

Przykład

Aby uruchomić ten przykład, utworzyć Visual Studio projektu rozszerzenie (VSIX).Nazwa projektu, który jest używany w tym przykładzie jest VdmGenerator.W source.extension.vsixmanifest pliku, kliknij przycisk Dodaj zawartość i ustawić pole typu MEF składnika i ścieżki źródłowej, odwoływanie się do bieżącego projektu.Aby uzyskać więcej informacji o sposobach konfigurowania tego typu projektu, zobacz Porady: definiowanie polecenia menu na diagramie modelowania.

Dodawanie do projektu pliku C#, która zawiera poniższy kod.Ta klasa definiuje polecenia menu, która będzie wyświetlana na diagramie klasy 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"; } }
  }
}

Następujący plik jest szablon tekstu.Generuje wiersz tekstu dla każdej klasy UML w modelu i jeden wiersz dla każdego atrybutu w każdej klasie.Kod do czytania modelu jest osadzony w tekście, wyznaczoną przez <# ... #>.

Aby utworzyć ten plik, kliknij prawym przyciskiem myszy projekt w oknie Solution Explorer, wskaż polecenie Dodaj, a następnie kliknij przycisk Nowego elementu.Wybierz Preprocessed tekst szablonu.Nazwa pliku, w tym przykładzie powinna być VdmGen.tt.Niestandardowego narzędzia właściwość pliku powinna być TextTemplatingFilePreprocessor.Aby uzyskać więcej informacji na temat szablonów wstępnie przetworzony format tekstu, zobacz Generowanie tekstu czasu wykonywania przy użyciu szablonów tekstowych T4.

<#@ 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 #> 
<#
     } 
   }
#>

Szablon tekst generuje C# częściowej klasy, która staje się częścią z programu Visual Studio projektu.W oddzielnym pliku należy dodać inna częściowa deklaracja tej samej klasy.Ten kod zawiera szablon z dostępu do magazynu modelu UML:

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

Aby przetestować projekt, naciśnij klawisz F5.Nowe wystąpienie Visual Studio zostanie uruchomiony.W tym wypadku Otwórz lub Utwórz model UML zawierający diagram klasy.Dodać niektóre klasy do diagramu i dodać do każdej klasy niektóre atrybuty.Kliknij prawym przyciskiem myszy na diagramie, a następnie kliknij polecenie przykładowe VDM generowania.Polecenie tworzy plik C:\Generated.txt.Sprawdzenie tego pliku.Jego zawartość powinna przypominają następujący tekst, ale zamieści swoje własne klasy i atrybuty:

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

Generowanie plików z aplikacji

Pliki można wygenerować z aplikacji, która odczytuje modelu UML.W tym celu najbardziej elastyczne i efektywne metody dostępu do modelu i jej elementów jest Programu Visual Studio Modelbus.

Można również załadować modelu za pomocą podstawowego interfejsu API i przekazać modelu szablony tekstu przy użyciu tych samych technik jak w poprzedniej sekcji.Aby uzyskać więcej informacji na temat ładowania modelu, zobacz Porady: odczytywanie modelu UML w kodzie programu.

Generowanie plików w czasie projektowania

Jeżeli projekt zawiera standardową metodę interpretacji UML jako kod, można utworzyć szablony tekstu, które umożliwiają generowanie kodu w ramach projektu z modelu UML.Zazwyczaj miałoby rozwiązanie, które zawiera projekt modelu UML i jeden lub więcej projektów dla kodu aplikacji.Każdy projekt kod może zawierać kilka szablonów, które generują pliki kodu, zasoby i konfigurację programu, na podstawie zawartości modelu.Deweloper można uruchomić wszystkie szablony, klikając Transform wszystkie szablony na pasku narzędziowym panelu Solution Explorer.Kod programu jest zazwyczaj wygenerowanej w formularzu częściowe klas, aby ułatwić integrację części napisany ręcznie.

A Visual Studio projektu tego rodzaju mogą być rozprowadzane w postaci szablonu, tak aby każdy członek zespołu jest możliwość tworzenia projektów generujących kod z modelu w taki sam sposób.Zwykle szablon jest częścią pakietu rozszerzenia, zawierający ograniczeń sprawdzania poprawności modelu w celu zapewnienia, że spełnione są warunki wstępne generowanie kodu.

Procedura konspektu do generowania plików

  • Aby dodać szablon projektu, zaznacz Tekst szablonu w oknie dialogowym Dodaj nowy plik.Można dodać szablon do większości typów projektu, ale nie Modelowanie projektów.

  • Właściwość narzędzia niestandardowy plik szablonu powinny być TextTemplatingFileGenerator, i rozszerzenie nazwy pliku powinna być .tt.

  • Szablon musi mieć co najmniej dyrektywy wyjściowej:

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

    Ustaw pole rozszerzenie, zgodnie z językiem projektu.

  • Aby umożliwić generowania kodu w szablonie, dostęp do modelu, należy napisać <#@ assembly #> dyrektyw dla zespołów, potrzebne do odczytywania modelu UML.Użyj ModelingProject.LoadReadOnly() , aby otworzyć model.Aby uzyskać więcej informacji, zobacz Porady: odczytywanie modelu UML w kodzie programu.

  • Szablon jest wykonywany podczas zapisywania i po kliknięciu przycisku Transform wszystkie szablony na pasku narzędziowym panelu Solution Explorer.

  • Aby uzyskać więcej informacji na temat tego typu szablonu, zobacz Generowanie kodu czasu projektowania przy użyciu szablonów tekstowych T4.

  • W typowym projekcie będzie mieć kilka szablonów, które generują różnych plików z tego samego modelu.Pierwsza część każdego szablonu będzie taka sama.W celu zmniejszenia tego duplikowania, przesuń części wspólnej oddzielnego pliku tekstowego, a następnie wywołać przy użyciu dyrektywy <#@include file="common.txt"#> w szablonie.

  • Można także zdefiniować specjalistyczne, dyrektywa procesor, który pozwala Ci na dostarczanie parametry procesu generowania tekstu.Aby uzyskać więcej informacji, zobacz Dopasowanie transformacji tekstu T4.

Przykład

Ten przykład generuje klasy C# dla każdej klasy UML w modelu źródłowym.

Aby skonfigurować rozwiązania programu Visual Studio, w tym przykładzie

  1. Tworzenie diagramu UML klasy w projekcie modelowania w nowe rozwiązanie.

    1. W architektury menu, kliknij przycisk Nowy Diagram.

    2. Wybierz Diagram UML w klasie.

    3. Postępuj według wskazówek, aby utworzyć nowy projekt roztworu i modelowania.

    4. Niektóre klasy można dodać do diagramu, przeciągając narzędzie klasy UML z przybornika.

    5. Zapisz plik.

  2. Utwórz projekt C# lub Visual Basic, w tym samym roztworze.

    • W oknie Solution Explorer, kliknij prawym przyciskiem myszy roztwór, wskaż polecenie Dodaj, a następnie kliknij przycisk Nowy projekt.W obszarze Zainstalowane szablony, kliknij przycisk języka Visual Basic lub Visual C#, i wybierz typ projektu takich jak Aplikacji konsoli.
  3. C# lub projektu języka Visual Basic, należy dodać plik zwykły tekst.Ten plik będzie zawierać kod, który jest udostępniony, jeśli chcesz zapisać kilka szablonów tekstu.

    • W oknie Solution Explorer, kliknij prawym przyciskiem myszy projekt, wskaż polecenie Dodaj, a następnie kliknij przycisk Nowego elementu.Wybierz plik tekstowy.

    Wstaw tekst, który jest pokazane w poniższej sekcji.

  4. C# lub projektu języka Visual Basic, należy dodać plik szablonu tekst.

    • W oknie Solution Explorer, kliknij prawym przyciskiem myszy projekt, wskaż polecenie Dodaj, a następnie kliknij przycisk Nowego elementu.Wybierz tekst szablonu.

    Wstawianie kodu, która następuje w tekstowym pliku szablonu.

  5. Zapisz plik szablonu tekstu.

  6. Sprawdź kod w pliku pomocniczych.Powinna ona zawierać klasy dla każdej klasy UML w modelu.

    1. W projekcie programu Visual Basic, kliknij przycisk Pokaż wszystkie pliki na pasku narzędziowym panelu Solution Explorer.

    2. Rozwiń węzeł pliku szablonu w oknie Solution Explorer.

Zawartość pliku tekstowego udostępnionych

W tym przykładzie plik nosi nazwę SharedTemplateCode.txt, i jest w tym samym folderze co szablony tekstu.

<# /* 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;
  }
}
#>

Zawartość pliku szablonu tekstu

Następujący tekst jest umieszczany w .tt pliku.Ten przykład generuje klas w pliku C# klasy UML w modelu.Jednakże można generować pliki dowolnego typu.Język wygenerowany plik nie jest powiązany z języka, w którym jest napisany kod szablonu tekstu.

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

Jak używać generowanie tekstu

Prawdziwy potencjał modelowania jest uzyskiwane, gdy modele są używane do projektowania na poziomie wymagania lub architektury.Szablony tekstu można użyć do niektórych prac konwertowania wysokiego szczebla pomysły na kod.W wielu przypadkach to nie prowadzi do odpowiedniooci między elementami w modelach UML i klas lub innych części kodu programu.

Ponadto przekształcenie zależy od domeny problemu; Brak powszechnej mapowania między modelami i kodu.

Oto kilka przykładów generowania kodu z modeli:

  • Linie produktów.Firma Fabrikam, Inc.Tworzy i instaluje systemów obsługi bagażu portu lotniczego.Duża część oprogramowania jest bardzo podobne między jedną instalację i następnych, ale konfiguracja oprogramowania zależy od jakie worek obsługi maszyny jest zainstalowany i jak te części są wzajemnie połączone przez przenośnikowe.Na początku kontraktu, analitycy firmy Fabrikam omawiać wymagania, zarządzania portu lotniczego i przechwytywania plan sprzętu przy użyciu diagram aktywności UML.Z tego modelu zespół projektowy generuje pliki konfiguracyjne, kod programu, plany i dokumenty użytkownika.Wykonywania pracy przez dodatki ręczne i dostosowań do kodu.Po zdobyciu doświadczeniu z jednego zadania na następny, one rozszerzyć zakres generowanych materiału.

  • Wzorce.Deweloperzy z Contoso, Ltd. często konstruowania witryn sieci Web i projektowania systemu nawigacji za pomocą diagramów klas UML.Każda strona sieci Web jest reprezentowany przez klasę i stowarzyszenia reprezentującego łącza nawigacji.Deweloperzy generować wiele kod witryny sieci Web z modelu.Każda strona sieci Web odpowiada kilka klas i wpisy w pliku zasobów.Metoda ta ma korzyści, które budowy każdej ze stron jest zgodny z pojedynczego wzorca, staje się bardziej niezawodne i bardziej elastyczne niż kod napisany ręcznie.Wzorzec jest w szablonach wytwórczych, podczas gdy model jest używany do przechwytywania aspektów zmiennej.

  • Schematy.Firma Agencja ubezpieczeń ma tysiące systemów na całym świecie.Te systemy używają różnych baz danych, języków i interfejsów.Członek zespołu architektury centralnej wewnętrznie publikuje modeli biznesowych koncepcji i procesów.Z tych modeli drużyn wygenerować części ich schematy bazy danych i wymiany, deklaracje w kodzie programu i tak dalej.Graficzna prezentacja modeli pomaga zespołom omówienia propozycji.Zespoły tworzyć wiele diagramów, które pokazują podzbiory modelu, które stosuje się do poszczególnych obszarów działalności.Za pomocą kolorów one także wyróżniać obszary podlegające zmianom.

Ważne techniki generowania artefakty

W poprzednich przykładach modele są używane do różnych celów zależnych od działalności i interpretacji modelowania elementów, takich jak klasy i działalności różni się od jednej aplikacji do innej.Następujące techniki są przydatne podczas generowania artefakty z modeli.

  • Profile.Nawet w obrębie obszaru jednej firmie interpretacji typu element może się różnić.Na przykład na diagram witryny sieci Web niektóre klasy może reprezentować stron sieci Web, a inni reprezentują bloki zawartości.Aby ułatwić użytkownikom zarejestrować te podziały, należy zdefiniować stereotypów.Stereotypy również umożliwiać dołączyć dodatkowe właściwości, które stosuje się do elementów tego rodzaju.Stereotypy są dostarczane w pakietach zawartych w profilach.Aby uzyskać więcej informacji, zobacz Porady: definiowanie profilu w celu rozszerzenia UML.

    W kodzie szablonu jest łatwy dostęp stereotypów, które są zdefiniowane w obiekcie.Na przykład:

    public bool HasStereotype(IClass c, string profile, string stereo)
    { return c.AppliedStereotypes.Any
       (s => s.Profile == profile && s.Name == stereo ); }
    
  • Ograniczone modele.Nie wszystkie modele, które można utworzyć są prawidłowe dla każdego celu.Na przykład w modelach bagażu port lotniczy firmy Fabrikam, byłoby niepoprawne mają biurko wyboru bez przenośnika wychodzących.Można zdefiniować funkcje sprawdzania poprawności, które pomagają użytkownikom do przestrzegania tych ograniczeń.Aby uzyskać więcej informacji, zobacz Porady: definiowanie ograniczeń walidacji dla modeli UML.

  • Zachowaj zmiany ręcznie.Tylko niektóre pliki rozwiązania mogą być generowane z modelu.W większości przypadków należy będą mogli dodawać ani ręcznie dopasować wygenerowanej zawartości.Jednakże jest ważne, że te ręcznej zmiany powinny zostać zachowane podczas transformacji szablonu jest uruchamiany ponownie.

    Gdzie szablonów generowania kodu w .NET języków, powinien generować częściowe klas, dzięki czemu deweloperzy można dodać metod i kodu.Jest również przydatne do generowania każdej klasy jako parę: abstrakcyjna klasa podstawowa, która zawiera metody i dziedziczące klasy, który zawiera tylko konstruktora.Dzięki temu programiści zastąpić metody.Aby umożliwić inicjowanie zastąpienie, go odbywa się w oddzielnych metody, zamiast w konstruktorów.

    W przypadku, gdy szablon generuje XML i innych typów danych wyjściowych, może być bardziej utrudnić utrzymanie zawartości ręczne oddzielnie od wygenerowanej zawartości.Jedną z metod jest proces kompilacji, który łączy dwa pliki, należy utworzyć zadanie.Inną metodą jest dla deweloperów dopasować lokalną kopię generowania szablonu.

  • Przenieś kod do oddzielnych zespołów.Nie zaleca się zapisywanie dużych organów kodu w szablonach.Zaleca się przechowywać oddzielnie od obliczeń wygenerowanej zawartości i tekst szablony nie są również dostępne do edycji kodu.

    Zamiast tego Jeśli trzeba wykonać znaczne obliczeń, aby wygenerować tekstu zbudować te funkcje w zestawie oddzielnych i wywołanie jej metod z szablonu.