كيفية القيام بما يلي: إنشاء ملفات من طراز UML

من طراز UML ، يمكنك إنشاء تعليمات برمجية لبرنامج, مخططات, مستندات, موارد, و عناصر ملموسة أخرى من أي نوع. أحد الأساليب المناسبة لإنشاء ملفات نصية من طراز UML هي استخدام قوالب النص . هذه تسمح لك بتضمين التعليمات البرمجية داخل النص الذي تريد إنشاءه.

هناك ثلاث وحدات سيناريو أساسية:

  • إنشاء ملفات من أمر قائمة أو إيماءة. تقوم أنت بتعريف أمر Visual Studio الذي يتوفر في طرازات UML.

  • إنشاء ملفات من تطبيق. أنت تقوم بكتابة تطبيق يقرأ طرازات UML ويقوم بإنشاء الملفات.

  • الإنشاء في وقت التصميم. استخدام طرازًا لتعريف بعض من وظائف التطبيق الخاص بك, ثم إنشاء تعليمات برمجية، موارد وما إلى ذلك ضمن حل Visual Studio الخاص بك.

ينتهي هذا الموضوع بمناقشة حول كيفية استخدام إنشاء النص . لمزيد من المعلومات، راجع إنشاء تعليمات برمجية وقوالب النص.

ملاحظة

بالإضافة إلى الأساليب المذكورة في هذا الموضوع, أدوات قوة هندسة Visual Studio 2010 توفّر أدوات متخصصة للمزامنة ثنائية الاتجاه بين التعليمات البرمجية للبرنامج و طرازات UML. يمكنك تنزيل هذه الأدوات من معرض عبر الإنترنت. في القائمة أدوات، انقر فوق مدير الملحق, انقر فوق معرض عبر الإنترنتثم استخدم أداة البحث للبحث عن " أدوات قوة هندسة ".

إنشاء ملفات من أمر قائمة

يمكنك استخدام قوالب نص المعالجة المسبقة ضمن أمر قائمة UML. ضمن التعليمات البرمجية لقالب النص أو في فئة جزئية منفصلة يمكنك قراءة الطراز الذي يتم عرضه عن طريق المخطط.

لمزيدٍ من المعلومات حول إستخدام هذه الميزات ، راجع المواضيع التالية:

الأسلوب الموضّح في المثال التالي مناسب لإنشاء نص نموذج مفرد, عند بدء العملية من أحد الرسومات التخطيطية لطراز. لمعالجة نموذج في سياق منفصل حاول استخدام Visual Studio Modelbus للوصول للطراز و عناصره.

المثال

لتشغيل هذا المثال, قم بإنشاء مشروع ملحق Visual Studio (VSIX). اسم المشروع المستخدام في هذا المثال هو VdmGenerator. في ملف source.extension.vsixmanifest ، انقر فوق إضافة محتوى و عيّن حقل النوع إلى مكوّن MEF ومسار المصدر يرجع إلى المشروع الحالي. للحصول على مزيد من المعلومات حول كيفية إعداد هذا النوع من المشروع, راجع كيفية القيام بما يلي: تعريف أمر قائمة على مخطط طراز.

أضف للمشروع ملف C# يحتوي على التعليمات البرمجية التالية. هذه الفئة تعرّف أمر قائمة يظهر على مخطط فئة 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
             (@"c:\Generated.txt", generator.TransformText());
    }
    public void QueryStatus(IMenuCommand command)
    {
      command.Enabled = command.Visible = true;
    }
    public string Text
    { get { return "Generate VDM"; } }
  }
}

الملف التالي هو قالب النص. يقوم بإنشاء سطر من النص لكل فئة UML في الطراز, و سطر لكل سمة في كل فئة. التعليمات البرمجية لقراءة الطراز يتم تضمينها في النص ، محددة بواسطة <# ... #>.

لإنشاء هذا الملف, انقر يمينا فوق المشروع في "مستكشف الحلول"، أشر إلى إضافة، ثم انقر فوق عنصر جديد. حدد قالب نص معالج مسبقا. اسم الملف لهذا المثال يجب أن يكون VdmGen.tt. خاصية أداة مخصصة للملف يجب أن تكون TextTemplatingFilePreprocessor. للحصول على مزيد من المعلومات حول قوالب لانص المعالجة مسبقا، راجع إنشاء ملفات نصية في وقت التشغيل بواسطة باستخدام Preprocessed قوالب نص.

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

قالب النص يقوم بإنشاء فئة C# جزئية, التي تصبح جزءاً من مشروع Visual Studio الخاص بك. في ملف منفصل, قم بإضافة تعريف جزئي آخر من نفس الفئة. هذه التعليمات البرمجية تزود القالب بحق الوصول إلى مخزن طراز UML:

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

لاختبار المشروع, اضغط F5. مثيل جديد من Visual Studio سيبدأ. في هذا المثيل, افتح أو أنشئ طراز UML يحتوي على مخطط فئة. أضف بعض الفئات للمخطط، و أضف بعض السمات لكل فئة. انقر بزر الماوس الأيمن فوق الرسم التخطيطي ثم انقر فوق أمر المثال الأمر إنشاء VDM. الأمر ينشئ الملف C:\Generated.txt. قم بفحص هذا الملف. محتوياته يجب أن تشابه النص التالي, ولكنه سيقوم بسرد الفئات و السمات الخاصة بك:

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

إنشاء ملفات من تطبيق

يمكنك إنشاء ملفات من تطبيق يقرأ طراز UML. لهذا الغرض, الأسلوب الأكثر مرونة و قوة للوصول إلى الطراز و عناصره هو Visual Studio Modelbus.

يمكنك أيضاً استخدام API الأساسي لتحميل الطراز, و تمرير الطراز إلى قوالب نص باستخدام نفس الأساليب كما هو موضح في المقطع السابق. لمزيد من المعلومات حول تحميل طراز راجع كيفية القيام بما يلي: قراءة طراز UML في التعليمات البرمجية للبرنامج.

إنشاء ملفات في وقت التصميم

إذا كان المشروع الخص بك له أسلوب قياسي في تفسير UML كتعليمات برمجية ، يمكنك إنشاء قوالب نص تتيح لك إنشاء تعليمات برمجية داخل المشروع من طراز UML. عادةً صواب قد يكون لديك حل يحتوي على مشروع طراز UML, و مشروع أو أكثر للتعليمات البرمجية للتطبيق. قد يحتوي كل مشروع تعليمات برمجية على العديد من القوالب التي تنشئ التعليمات البرمجية و الموارد و ملفات تكوين البرنامج استناداً إلى محتويات الطراز. يمكن للمطور تشغيل كافة القوالب بالنقر فوق تحويل كافة القوالب في شريط أدوات "مستكشف الحلول". يتم عادةً إنشاء التعليمات البرمجية لبرنامج في شكل فئات جزئية لتسهيل دمج الأجزاء المكتوبة يدوياً.

مشروع Visual Studio من هذا النوع يمكن توزيعه في شكل قالب، بحيث يكون لكل عضو فريق القابلية لإنشاء المشاريع التي تنشئ تعليمات برمجية من طراز بنفس الطريقة. عادةً ما يكون القالب جزءًا من حزمة ملحق تتضمن قيود التحقق من الصحة للطراز للتأكد من استيفاء الشروط الأولية لإنشاء التعليمات البرمجية.

ملاحظة

أدوات مزامنة عناصر المشروع باستخدام UML تتوفر في "أدوات قوة البناء" Visual Studio . يمكن تحميل هذه الأدوات باستخدام مدير ملحقات Visual Studio. في القائمة أدوات انقر فوق مدير الملحقات، ومن ثم انقر فوق معرض عبر الإنترنت ثم استخدام أداة البحث.

إجراء المخطط التفصيلي من أجل إنشاء ملفات

  • لإضافة قالب إلى مشروع, حدد قالب نص في مربع الحوار "إضافة ملف جديد". يمكنك إضافة قالب إلى معظم أنواع المشروع ولكن ليس مشاريع الطراز.

  • خاصية "أدوات مخصصة" لملف القالب يجب أن تكون TextTemplatingFileGenerator و يجب أن يكون ملحق اسم الملف .tt.

  • القالب يجب أن يكون له على الأقل توجيه إخراج:

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

    عيّن حقل الملحق طبقًا للغة المشروع الخاص بك.

  • للسماح بإنشاء التعليمات البرمجية في القالب الخاص بك للوصول إلى الطراز, اكتب توجيهات <#@ assembly #> للتجميعات المطلوبة لقراءة طراز UML. استخدام ModelingProject.LoadReadOnly() لفتح الطراز. لمزيد من المعلومات، راجع كيفية القيام بما يلي: قراءة طراز UML في التعليمات البرمجية للبرنامج.

  • يتم تنفيذ القالب عندما تقوم بحفظه و عند النقر فوق تحويل كافة القوالب في شريط أدوات "مستكشف الحلول".

  • للحصول على مزيد من المعلومات حول هذا النوع من القوالب, راجع إنشاء التعليمة البرمجية في مشروع ‏‫Visual Studio.

  • في مشروع نموذجي, سيكون لديك العديد من القوالب التي تنشئ ملفات مختلفة من نفس الطراز. الجزء الأول من كل قالب سيكون هو نفسه. لتقليل هذا التكرار, انقل الأجزاء الشائعة إلى ملف نص منفصل, ومن ثم استدعائه باستخدام التوجيه <#@include file="common.txt"#> في كل قالب.

  • يمكنك أيضاً تعريف معالج موجّه متخصص يسمح لك بتوفير معاملات لعملية تكوين النص. لمزيد من المعلومات، راجع تخصيص تحويل نص.

المثال

ينشئ هذا المثال فئة C# لكل فئة UML في الطراز المصدر.

لإعداد حل Visual Studio لهذا المثال

  1. أنشئ مخطط فئة UML في مشروع طراز في حل جديد.

    1. في القائمة بنية ، انقر فوق مخطط جديد .

    2. حدد مخطط فئة UML .

    3. اتبع المطالبات لإنشاء حل جديد و مشروع طراز جديد.

    4. أضف بعض الفئات إلى الرسم التخطيطي بواسطة سحب أداة "فئة UML" من مربع الأدوات.

    5. احفظ الملف.

  2. أنشئ مشروع C# أو Visual Basic في نفس الحل.

    • في "مستكشف الحلول", انقر يمينا فوق الحل، أشر إلى إضافة، ثم انقر فوق مشروع جديد. تحت القوالب المثبتة، انقر فوق Visual Basic أو Visual C# ، ثم حدد نوع مشروع مثل تطبيق وحدة التحكم.
  3. أضف ملف نص عادي إلى مشروع C# أو Visual Basic. يحتوي هذا الملف على التعليمات البرمجية التي تتم مشاركتها إذا كنت تريد كتابة العديد من قوالب النص.

    • في "مستكشف الحلول", انقر يمينا فوق المشروع، أشر إلى إضافة، ثم انقر فوق عنصر جديد. حدد ملف نص .

    أدرج النص الذي يظهر في المقطع التالي.

  4. أضف قالب نص عادي إلى مشروع C# أو Visual Basic.

    • في "مستكشف الحلول", انقر يمينا فوق المشروع، أشر إلى إضافة، ثم انقر فوق عنصر جديد. حدد قالب نص .

    أدرج التعليمات البرمجية التالية في ملف قالب النص.

  5. احفظ ملف قالب النص.

  6. افحص التعليمات البرمجية الموجودة في الملف الفرعي. يجب أن يحتوي على فئة لكل فئة UML في الطراز.

    1. في مشروع Visual Basic، انقر فوق إظهار كافة الملفات في شريط أدوات "مستكشف الحلول".

    2. قم بتوسيع عقدة ملف القالب في "مستكشف الحلول".

محتوى ملف النص المشترك

في هذا المثال، الملف يسمى SharedTemplateCode.txt ، ويكون في نفس المجلد مثل قوالب النص.

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

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

محتوى ملف قالب النص

الملف التالي يتم وضعه في الملف .tt . هذا المثال ينشئ فئات في ملف C# من فئات UML في الطراز. ومع ذلك، يمكن إنشاء ملفات من أي نوع. لغة الملف الذي تم إنشاؤه غير مرتبطة باللغة التي يتم كتابة التعليمات البرمجية لقالب النص بها.

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

كيفية استخدام إنشاء النص

الطاقة الحقيقية لبناء طراز يتم الحصول عليها عند استخدام الطرازات للتصميم في مستوى المتطلبات أو البنية. يمكنك استخدام قوالب النص لتنفيذ بعض أعمال تحويل الأفكار عالية المستوى إلى تعليمات برمجية. في كثير من الحالات، لا يؤدي هذا إلى مراسلات رأس-برأس بين العناصر في طرازات و فئات UML أو أجزاء أخرى من التعليمات البرمجية للبرنامج.

علاوة على ذلك، يعتمد التحويل على مجال المشكلة; لا يوجد أي تعيين عالمي بين الطرازات و التعليمات البرمجية.

فيما يلي بعض الأمثلة لإنشاء تعليمات برمجية من طرازات:

  • خطوط المنتج. شركة القمر المنير, Inc. يبني و تثبيت أنظمة hوling دواليب المطار. الكثير من البرامج مشابهة جداً بين تثبيت واحد و التالي, ولكن تكوين البرامج يعتمد على تثبيت مجموعة ما من ماكينات معالجة الحقائب و كيفية ربط هذه الأجزاء بواسطة أحزمة ناقلة. عند بداية العقد, محللو Fabrikam يقومون بمناقشة المتطلبات مع إدارة المطار و التقاط خطة الأجهزة باستخدام مخطط نشاط UML. من هذا الطراز, يقوم فريق التطوير بإنشاء ملفات التكوين, و التعليمات البرمجية للبرنامج, و الخطط, و مستندات المستخدم. يقومون بإكمال العمل بواسطة الإضافات و التعديلات اليدوية للتعليمات البرمجية. أثناء اكتسابهم للخبرة من مهمة واحدة إلى التالية، فإنهم يوسعون نطاق المواد التي تم إنشاؤها.

  • النقوش. المطورون في Contoso, Ltd غالباً يقومون بإنشاء مواقع ويب, و تصميم نظام التنقل باستخدام مخططات فئة UML. كل صفحة ويب يتم تمثيلها بواسطة فئة, و الاقترانات تمثّل ارتباطات التنقل. المطورون يقومون بإنشاء الكثير من التعليمات البرمجية لموقع ويب من الطراز. كل صفحة ويب تتوافق مع عدة فئات و و إدخلات ملف مورد. يحتوي هذا الأسلوب على الفوائد بحيث يتوافق بناء كل صفحة مع نقش واحد, وجعله أكثر وثوقية ومرونة من كتابة التعليمات البرمجية باليد. النقش يكون في قوالب الإنشاء, في حين أن الطراز يستخدم في التقاط الأوجه المتغيرة.

  • المخططات. Humongous Insurance تمتلك آلاف الأنظمة حول العالم. هذه الأنظمة تستخدم قواعد بيانات و لغات و واجهات مختلفة. فريق البنية المركزي ينشر بشكل داخلي نماذج مفاهيم و عمليات الأعمال. من هذه الطرازات, فرق العمل المحلية تنشئ أجزاء من مخططات قاعدة البيانات و التبادل, التعريفات في التعليمات البرمجية للبرنامج ,وهكذا. العرض الرسومي للنماذج يساعد فرق العمل لمناقشة العروض. الفرق تنشئ مخططات متعددة تظهر المجموعات الفرعية من الطراز التي تُطبَّق في نواحي العمل المختلفة. و يستخدمون أيضا ألوانًا لتمييز المناطق المعرّضة للتغيير.

تقنيات هامة لإنشاء العناصر ملموسة

في الأمثلة السابقة، الطرازات تُستخدم لأغراض متنوعة تعتمد على العمل, و تفسير عناصر الطراز مثل الفئات والأنشطة يختلف من تطبيق لآخر. التقنيات التالية مفيدة عند إنشائك لعناصر ملموسة من طرازات.

  • ملفات التعريف. حتى داخل منطقة العمل الواحدة, يمكن أن يختلف تفسير نوع العنصر . على سبيل المثال في مخطط موقع ويب, بعض الفئات قد تمثّل صفحات ويب, و أخرى تمثّل كتل محتوى. للتسهيل على المستخدمين تسجيل هذه الفروقات، عرّف الفئات الفرعية. الفئات الفرعية تجعل من الممكن إرفاق خصائص إضافية يتم تطبيقها على عناصر من هذا النوع. الفئات الفرعية يتم حزمها داخل ملفات التعريف. لمزيد من المعلومات، راجع كيفية القيام بما يلي: تعريف ملف تعريف لتوسيع UML.

    في التعليمات البرمجية لقالب, من السهل الوصول إلى الفئات الفرعية التي تم تعريفها على كائن. فعلى سبيل المثال:

    public bool HasStereotype(IClass c, string profile, string stereo)
    { return c.AppliedStereotypes.Any
       (s => s.Profile == profile && s.Name == stereo ); }
    
  • الطرازات المقيّدة. ليست كافة الطرازات التي يمكنك إنشاؤها صحيحة لكل الأغراض. على سبيل المثال، في طرازات حقائب مطار Fabrikam , سيكون غير صحيح امتلاك مكتب إيداع بدون ناقلة صادرة. يمكنك تعريف دالات التحقق من الصحة التي تساعد المستخدمين على مشاهدة هذه القيود. لمزيد من المعلومات، راجع كيفية القيام بما يلي: تعريف قيود التحقق من صحة طرازات UML.

  • المحافظة على التغييرات اليدوية. فقط بعض ملفات الحلول يمكن إنشاؤها من طراز. في معظم الحالات، يجب أن تكون قادراً على إضافة أو ضبط المحتوى الذي تم إنشاؤه يدوياً. ومع ذلك، فإنه من المهم أن هذه التغييرات اليدوية يجب الاحتفاظ بها عند تشغيل تحويل القالب مرة أخرى.

    حيث تقوم القوالب الخاصة بك بإنشاء تعليمات برمجية في لغات .NET ، يجب أن يقوموا بإنشاء فئات جزئية بحيث يتمكن المطورون من إضافة أساليب و تعليمات برمجية. كما يعتبر مفيداً إنشاء كل فئة على أنها زوج: فئة قاعدة مجردة تحتوي على الأساليب, و فئة وارثة حتوي على المُنشئ فقط. يتيح هذا للمطورين تجاوز الأساليب. للسماح التهيئة بأن يتم تجاوزها, يتم هذا في أسلوب منفصل بدلاً من المُنشئات.

    حيث يقوم قالب بإنشاء XML وأنواع أخرى من الإخراج ، يمكن أن يكون أكثر صعوبة الاحتفاظ بالمحتوى اليدوي منفصلأ عن المحتوى الذي تم إنشاؤه. أحد الطرق هو إنشاء مهمة في عملية الإنشاء تضم ملفين. طريقة أخرى للمطورين هي ضبط نسخة محلية من قالب الإنشاء.

  • نقل تعليمات برمجية في تجميعات منفصلة. لا ننصح كتابة نصوص كبير من التعليمات البرمجية في قوالب. من الأفضل الاحتفاظ بالمحتوى المُنشأ منفصلاً عن الحساب, و قوالب النص غير مدعومة بشكل جيد لتحرير التعليمات البرمجية.

    بدلاً من ذلك، إذا كان من الضروري تنفيذ حسابات واضحة لإنشاء النص, قم بإنشاء هذه الوظائف في تجميع منفصل ثم استدعاء الأساليب الخاصة به من القالب.