Aracılığıyla paylaş


Bir UML Modeli'nden Dosyalar Nasıl Oluşturulur

UML modelden program kodu, şemalar, belgeler, kaynaklar ve diğer herhangi bir türdeki yapıları oluşturabilirsiniz.UML modelden metin dosyaları oluşturmanın bir uygun yöntemi metin şablonları kullanmaktır.Bunlar oluşturmak istediğiniz metinin içine program kodu katıştırmanıza olanak tanır.

Başlıca üç senaryo vardır:

  • Hareketten veya Menü komutundan dosyaları oluşturma.UML modellerde kullanılabilir olan Visual Studio komutu tanımlarsınız.

  • Bir uygulamadan dosyaları oluşturma.UML modellerini okuyan ve dosyaları oluşturan bir uygulama yazarsınız.

  • Tasarım zamanında oluşturma.Uygulamanızın işlevselliğinin bir kısmını tanımlamak, kod, kaynak ve Visual Studio çözümünüzün içindekileri oluşturmak için model kullanırsınız.

Bu konu metin oluşturma nasıl kullanılır'ın tartışması ile sona erer.Daha fazla bilgi için bkz. Kod oluşturma ve T4 metin şablonları.

Menü komutundan dosyaları oluşturma

UML menü komutu içinde önişlem metin şablonlarını kullanabilirsiniz.Metin şablonu içinde veya ayrı kısmi bir sınıfta diyagram tarafından görüntülenen modeli okuyabilirsiniz.

Bu özellikler hakkında daha fazla bilgi için aşağıdaki konuları okuyun:

İşlemi model diyagramlarınızın birinden başlattığınız zaman aşağıdaki örnekte gösterilen yaklaşım tek bir modelden metin oluşturmak için uygundur.Modeli ayrı bir bağlamda işlemek için modele ve onun öğelerine erişmek üzere Visual Studio Modelbus kullanmayı düşünün.

Ee329480.collapse_all(tr-tr,VS.110).gifÖrnek

Bu örneği çalıştırmak için Visual StudioExtension (VSIX) projesi oluşturun.Bu örnekte kullanılan projenin adı VdmGenerator'dır.source.extension.vsixmanifest dosyasında, İçerik Ekle'ye tıklayın ve tür alanını MEF Bileşeni'ne ve geçerli olan projeye başvuran kaynak yoluna ayarlayın.Bu tür projelerin kurulumu hakkında daha fazla bilgi için bkz. Nasıl yapılır: Modelleme Diyagramında Menü Komutu Tanımlama.

Aşağıdaki kodu içeren C# dosyasını projeye ekleyin.Bu sınıf, UML sınıf diyagramında görünecek menü komutunu tanımlar.

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"; } }
  }
}

Aşağıdaki dosya metin şablondur.Modeldeki her UML sınıf için metin satırı ve her sınıftaki her öznitelik için satır oluşturur.Modeli okumak için kod <# ... #> tarafından ayrılmış metine katıştırılmıştır.

Bu dosyayı oluşturmak için Çözüm Gezgini'ndeki projenin üzerinde sağ tıklayın, Ekle'nin üzerine gelin ve sonra Yeni Öğe'ye tıklayın.Önişlenmiş Metin Şablonu'nu seçin.Bu örnek için dosya adı VdmGen.tt olmalıdır.Dosyanın Özel Araç özelliği TextTemplatingFilePreprocessor olmalıdır.Önişlenmiş metin şablonları hakkında daha fazla bilgi için bkz. T4 metin şablonlarıyla çalışma zamanı metin oluşturma.

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

Metin şablonu Visual Studio projenizin bir parçası olan C# kısmi sınıfını oluşturur.Ayrı bir dosyada aynı sınıfın başka kısmi bildirimini ekleyin.Bu kod UML model deposuna erişim ile şablon sağlar:

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

Projeyi test etmek için F5'e basın.Visual Studio'nun yeni örneği başlayacaktır.Bu örnekte sınıf diyagramını içeren UML modeli açın veya oluşturun.Diyagrama bazı sınıflar ve her sınıfa bazı öznitelikler ekleyin.Diyagramda sağ tıklayın ve sonra VDM Oluştur örnek komutuna tıklayın.Komut C:\Generated.txt dosyası oluşturur.Bu dosyayı inceleyin.Dosyanın içeriği aşağıdaki metine benzer olmalıdır ancak o sizin kendi sınıflarınızı ve özniteliklerinizi listeleyecektir:

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

Bir Uygulamadan Dosyalar Oluşturma

UML modeli okuyan bir uygulamadan dosyalar oluşturabilirsiniz.Bu amaçla, modele ve onun öğelerine erişmenin en esnek ve sağlam yöntemi Visual Studio Modelbus'tır.

Ayrıca modeli yüklemek için temel API'yı kullanabilir ve önceki bölümdeki aynı teknikleri kullanarak modeli metin şablonlarına geçirebilirsiniz.Bir modeli yüklemek hakkında daha fazla bilgi için bkz. Program Kodundaki UML Modeli Nasıl Okunur.

Tasarım Zamanında Dosyalar Oluşturma

Eğer projenizin UML'i kod olarak yorumlayan standart bir yöntemi varsa projenizin içinde UML modelden kod oluşturmanıza izin veren metin şablonları oluşturabilirsiniz.Genellikle, UML model projesini ve uygulama kodu için bir veya daha çok projeyi içeren çözüme sahip olursunuz.Her kod projesi modelin içeriğine dayalı program kodu, kaynaklar ve yapılandırma dosyaları oluşturan birkaç şablon içerebilir.Geliştirici, Çözüm Gezgini araç çubuğunda Tüm Şablonları Dönüştür'e tıklayarak bütün şablonları çalıştırabilir.Program kodu, genellikle el ile yazılmış bölümleri tümleştirmeyi kolaylaştırmak için parçalı sınıflar formunda oluşturulur.

Bu türden bir Visual Studio projesi şablon formunda dağıtılabilir, böylelikle ekibin her üyesi modelden aynı şekilde kod üreten projeler oluşturabilir.Genellikle şablon, kod oluşturmanın önkoşullarının karşılandığından emin olmak için model üzerinde doğrulama kısıtlamaları içeren uzantı paketinin bir parçasıdır.

Ee329480.collapse_all(tr-tr,VS.110).gifDosyaları oluşturmak için anahat yordamı

  • Projeye şablon eklemek için Yeni Dosya Ekle iletişim kutusunda Metin Şablonu'nu şeçin.Projenin çoğu türüne şablon ekleyebilirsiniz ancak modelleme projelerine ekleyemezsiniz.

  • Şablon dosyasının Özel Araçlar özelliği TextTemplatingFileGenerator olmalıdır ve dosya adının uzantısı .tt olmalıdır.

  • Şablonun en az bir çıkış yönergesi olmalıdır:

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

    Uzantı alanını projenizin diline göre ayarlayın.

  • Modele erişmek üzere şablonunuzda kod oluşturmaya izin vermek amacıyla, UML modeli okumak için gereken derlemeler için <#@ assembly #> yönergelerini yazın.Modeli açmak için ModelingProject.LoadReadOnly() kullanın.Daha fazla bilgi için bkz. Program Kodundaki UML Modeli Nasıl Okunur.

  • Şablon, onu kaydettiğinizde ve Çözüm Gezgini araç çubuğunda Tüm Şablonları Dönüştür'e tıkladığınızda yürütülür.

  • Bu tür şablonlar hakkında daha fazla bilgi için bkz. T4 metin şablonları kullanarak tasarım zamanı kod oluşturma.

  • Tipik bir projede, aynı modelden farklı dosyalar oluşturan birden çok şablonunuz olacaktır.Her şablonun ilk bölümü aynı olacaktır.Bu yinelemeyi azaltmak için, ortak bölümleri ayrı metin dosyalarına taşıyın ve sonra her şablondaki <#@include file="common.txt"#> yönergesini kullanarak onu çağırın.

  • Ayrıca metin oluşturma işlemine parametreler sağlamanıza izin veren özelleştirilmiş yönerge işlemcisi tanımlayabilirsiniz.Daha fazla bilgi için bkz. T4 metin dönüştürme özelleştirme.

Ee329480.collapse_all(tr-tr,VS.110).gifÖrnek

Bu örnek, kaynak modelindeki her UML sınıf için C# sınıfı oluşturur.

Bu örnek için Visual Studio çözümü ayarlamak için

  1. Yeni çözümdeki modelleme projesinde UML sınıf diyagramı oluşturun.

    1. Mimari menüsünde Yeni Diyagram'a tıklayın.

    2. UML Sınıfı Diyagramı'nı seçin.

    3. Yeni bir çözüm ve modelleme projesi oluşturmak için istemleri izleyin.

    4. Araç kutusundan UML Sınıf aracını sürükleyerek bazı sınıfları diyagrama ekleyin.

    5. Dosyayı kaydedin.

  2. Aynı çözüm içinde C# veya Visual Basic projesi oluşturun.

    • Çözüm Gezgini'nde, çözüm üzerinde sağ tıklayın, Ekle'ye gelin, ve sonra Yeni Proje'ye tıklayın.Yüklü şablonlar altında Visual Basic veya Visual C#'a tıklayın ve sonra Konsol uygulaması gibi bir proje türü seçin.
  3. C# veya Visual Basic projesine düz metin dosyası ekleyin..Bu dosya, eğer birkaç metin şablonuna yazmak istiyorsanız paylaşılan kodu içerir.

    • Çözüm Gezgini'nde, proje üzerinde sağ tıklayın, Ekle'ye gelin, ve sonra Yeni Öğe'yi seçin.Metin Dosyası'nı seçin.

    Aşağıdaki bölümde gösterilen metini ekleyin.

  4. C# veya Visual Basic projesine Metin Şablonu dosyasını ekleyin..

    • Çözüm Gezgini'nde, proje üzerinde sağ tıklayın, Ekle'ye gelin, ve sonra Yeni Öğe'yi seçin.Metin Şablonu'nu seçin.

    Metin şablon dosyasına aşağıdaki kodu ekleyin.

  5. Metin şablonu dosyasını kaydedin.

  6. Yardımcı dosyanızdaki kodu inceleyin.Modeldeki her UML sınıf için bir sınıf içermelidir.

    1. Bir Visual Basic projesinde, Çözüm Gezgini araç çubuğundaki Tüm Dosyaları Göster'e tıklayın.

    2. Çözüm Gezgini'ndeki şablon dosyası düğümünü genişletin.

Ee329480.collapse_all(tr-tr,VS.110).gifPaylaşılan metin dosyasının içeriği

Bu örnekte, dosya SharedTemplateCode.txt olarak adlandırılır ve metin şablonları gibi aynı klasördedir.

<# /* 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(tr-tr,VS.110).gifMetin şablonu dosyasının içeriği

Aşağıdaki metin .tt dosyasına yerleştirilir.Bu örnek, modeldeki UML sınıflardan C# dosyasında sınıflar oluşturur.Ancak, herhangi türde dosyalar oluşturabilirsiniz.Oluşturulan dosyanın dili metin şablonu kodunun yazılı olduğu dille ilgili değildir.

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

Metin Oluşturma Nasıl Kullanılır

Modellemenin gerçek gücü, modelleri gereksinimler veya mimari düzeyinde tasarlamak için kullandığınız zaman elde edilir.Metin şablonlarını, üst düzey fikirleri koda dönüştürme işinin bir kısmını yapmak için kullanabilirsiniz.Çoğu durumda bu, UML modellerdeki öğeler ve sınıflar veya program kodunun diğer bölümleri arasında bire bir yazışmaya neden olmaz.

Ayrıca dönüşüm probleminizin etki alanına bağlıdır; modeller ve kod arasında evrensel eşleme yoktur.

Modellerden kod oluşturma örneklerinin bazıları şunlardır:

  • Ürün Hatları.Fabrikam, Inc.Havaalanı bagaj işleme sistemlerini oluşturur ve yükler.Yazılımın çoğu bir yükleme ve sonraki arasında çok benzerdir, ancak yazılım yapılandırması hangi çanta işleme makinesinin yüklendiğine ve bu parçaların taşıyıcı bant tarafından nasıl bağlandığına bağlıdır.Anlaşmanın başında, Fabrikam analistleri gereksinimleri havaalanı yönetimi ile tartışır ve UML etkinlik diyagramını kullanarak donanım planını oluşturur.Geliştirme ekibi bu modelden yapılandırma dosyalarını, program kodunu, planları ve kullanıcı belgelerini oluşturur.El ile eklemeler ve kodda ayarlamalar ile işi tamamlarlar.Bir işten sonrakine tecrübe kazandıkça oluşturulan malzemenin kapsamını genişletirler.

  • Desenler.Contoso Ltd'deki geliştiriciler, genellikle Web sitelerini oluşturur ve UML sınıf diyagramlarını kullanarak gezinti şemasını tasarlar.Her Web sayfası sınıf tarafından gösterilir ve ilişkilendirmeler gezinti bağlantılarını gösterir.Geliştiriciler, Web sitesinin kodunun çoğunu modelden oluştururlar.Her Web sayfası birkaç sınıfa ve kaynak dosyası girişlerine karşılık gelir.Bu yöntem, her sayfanın yapımını tek bir desene uyduran ve onu elle yazılmış koddan daha güvenilir ve esnek kılan yararları vardır.Model, değişken yönlerini yakalamak için kullanılırken desen şablon oluşturma içindedir.

  • Şemalar.Bellek Bilgisayar'ın dünya çapında binlerce sistemi vardır.Bu sistemler farklı veritabanları, diller ve arabirimleri kullanır.Merkezi mimari ekibi iş kavramları ve işlemler modellerini dahili olarak yayımlar.Yerel ekipler bu modellerden veritabanlarının ve değişim şemalarının bölümlerini, program kodundaki bildirimleri ve benzerlerini oluşturur.Modellerin grafik sunumu ekiplerin teklifleri tartışmasına yardım eder.Ekipler, farklı iş alanlarına uygulanan modellerin alt kümelerini gösteren birden çok diyagramlar oluşturur.Ayrıca değiştirilecek alanları vurgulamak için renk kullanırlar.

Yapıları oluşturmak için önemli teknikler

Önceki örneklerde, modeller farklı iş bağımlı amaçlar için ve bir uygulamadan diğerine değişen sınıflar ve etkinlikler gibi modelleme öğelerinin yorumlanması için kullanılır.Aşağıdaki teknikler modellerden yapılar oluşturduğunuz zaman yararlıdır.

  • Profiller.Bir iş alanının içinde bile bir öğe türünün yorumu değişebilir.Örneğin bir Web sitesi diyagramında, bazı sınıflar Web sayfalarını ve diğerleri içerik bloklarını gösterir.Bu farklılıkları kaydetmeyi kullanıcılar için kolaylaştırmak amacıyla stereotipleri tanımlayın.Ayrıca stereotipler, bu türden öğelere uygulanan ek özellikleri iliştirmeyi olası kılar.Stereotipler profiller içinde paketlenirler.Daha fazla bilgi için bkz. UML Genişletmek için Profil Nasıl Tanımlanır.

    Şablon kodunda, bir nesne üzerinde tanımlanmış stereotiplere ulaşmayı kolaylaştırır.Örne?in:

    public bool HasStereotype(IClass c, string profile, string stereo)
    { return c.AppliedStereotypes.Any
       (s => s.Profile == profile && s.Name == stereo ); }
    
  • Kısıtlanmış modeller.Oluşturabileceğiniz tüm modellerin her amaç için geçerli olduğunu not edin.Örneğin, Fabrikam havaalanı bagaj modellerinde giden taşıyıcı olmadan kontrol tezgahına sahip olmak yanlış olacaktır.Bu kısıtlamaları gözlemek için kullanıcılara yardım eden doğrulama işlevlerini tanımlayabilirsiniz.Daha fazla bilgi için bkz. UML Modelleri için Doğrulama Kısıtlamaları Nasıl Tanımlanır.

  • El ile olan değişiklikleri koruma.Çözüm dosyalarının yalnızca bazıları modelden oluşturulabilir.Çoğu durumda, el ile oluşturulan içeriği ekleyebilmeniz ve ayarlayabilmeniz gerekir.Ancak, şablon dönüşümü tekrar çalıştırıldığında bu el ile yapılan değişikliklerin korunur olması önemlidir.

    .NET dillerinde şablonlarınızın kodu oluşturduğu yerde geliştiricilerin yöntemler ve kod ekleyebilmesi için parçalı sınıflar oluşturmalılar.Her sınıfı çift olarak oluşturmak da kullanışlıdır: yöntemleri içeren soyut temel sınıf ve yalnızca oluşturucuyu içeren türetilen bir sınıf.Bu, geliştiricilerin yöntemleri geçersiz kılmasına izin verir.Geçersiz kılınacak başlatmaye izin vermek için, oluşturucular yerine ayrı yöntemlerde yapılır.

    Şablonun XML ve diğer tür çıktıları oluşturduğu yerde el ile olan içeriği oluşturulan içerikten ayrı tutmak daha zor olabilir.Bir yöntem, iki dosyayı birleştiren yapı işleminde görev oluşturmak içindir.Diğer yöntem, oluşturma şablonunun yerel kopyasını ayarlamak amacıyla geliştiriciler içindir.

  • Kodu ayrı derlemeler içine taşıyın.Şablonlarda büyük gövdelerde kod yazmak önerilmez.Oluşturulan içeriği hesaplamadan ayrı tutmak tercih edilir ve metin şablonları kod düzenlemek için iyi desteklenmez.

    Bunun yerine, eğer metin oluşturmak için önemli hesaplamalar yapmak zorundaysanız, bu işlevleri ayrı bir derleyicide oluşturun ve şablondan onun yöntemlerini çağırın.