كيفية القيام بما يلي: تعريف قيود التحقق من صحة طرازات UML

في Visual Studio Ultimate ، يمكنك تعريف قيود التحقق من الصحة التي تختبر ما إذا كان الطراز يحقق الشرط الذي تحدده. على سبيل المثال، يمكنك تعريف قيد إلى التأكد من أن مستخدم لا يقوم بإنشاء تكرار حلقي علاقات التوريث. قيد هو استدعاؤه عند محاولة فتح أو حفظ النموذج مستخدم، ويمكن أيضا استدعاء يدوياً. في حالة فشل القيد, يتم إضافة رسالة الخطأ التي تقوم بتعريفها إلى نافذة الخطأ. يمكنك حزم هذه القيود في Visual Studio "ملحق تكامل" ( VSIX ) ثم توزيعه على مستخدمي Visual Studio Ultimate الآخرين.

يمكنك أيضاً تعريف قيود تتحقق من صحة الطراز مقابل الموارد الخارجية مثل قواعد البيانات.

تطبيق قيود التحقق من الصحة

يتم تطبيق قيود التحقق من الصحة في ثلاث حالات: عند حفظ طراز; عند فتح طراز; وعند النقر فوق التحقق من صحة طراز UML من القائمة بنية. في كل حالة, فقط هذه القيود التي تم تعريفها لهذه الحالة سيتم تطبيقها ، على الرغم من أن عادةً قد تعرّف كل قيد لتطبيقه في حالة واحد أو أكثر.

يتم الإعلام عن أخطاء التحقق من الصحة في نافذة أخطاء Visual Studio , و يمكنك أن تنقر نقراً مزدوجاً فوق الخطأ لتحديد عناصر الطراز الموجودة في الخطأ.

لمزيد من المعلومات حول تطبيق التحقق من الصحة، راجع كيفية القيام بما يلي: التحقق من صحة لطراز UML.

تعيين لأعلى حل ملحق UML

لديك إلى إعداد جهازي Visual Studioمشاريع:

  • مشروع مكتبة فئة التي تحتوي على تعليمات برمجية طرق التحقق من صحة.

  • مشروع VSIX، الذي يعمل كـ حاوية لطرق التحقق من صحة الجاري التثبيت. إذا كنت ترغب في ذلك، يمكنك تضمين البعض مكونات في VSIX نفسه.

إلى إعداد الحل ‏‫Visual Studio

  1. قم بإنشاء مشروع مكتبة فئة، إضافة إلى حل VSIX موجود، أو إنشاء أحد الحلول جديدة.

    1. من القائمة File (ملف)، أشر إلى New (جديد)، ثم انقر فوق Project (مشروع).

    2. تحت القوالب المثبتة، انقر فوق Visual C#‎ أو Visual أساسى، ثم في العمود وسط انقر فوق مكتبة فئة .

    3. قم بتعيين الحل للإشارة إلى ما إذا كنت ترغب في إنشاء حل جديد أو إضافة مكوّن بحل VSIX التي قمت بفتحها بالفعل.

    4. اسم مشروع لمجموعة موقع و و انقر فوق ‏‏موافق.

  2. ما لم يحتوي الحل الخاص بك واحد، قم بإنشاء مشروع VSIX.

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

    2. تحت القوالب المثبتة، توسيع Visual C#‎ أو من Visual أساسى، ثم انقر فوق الامتداد. في العمود وسط، انقر فوق مشروع VSIX.

  3. تعيين مشروع VSIX كـ مشروع بدء التشغيل للحل.

    • في "مستكشف الحل"، انقر نقراً مزدوجاً فوق مشروع VSIX ثم ثم انقر فوق تعيين مشروع كـ بدء التشغيل.
  4. في source.extension.vsixmanifest، تحت المحتوى، قم بإضافة مشروع مكتبة الفئات MEF مكوّن.

    1. source.extension.vsixmanifest بفتح

    2. انقر فوق إضافة محتوى .

    3. تحديد نوع محتوى، حدد مكوّن MEF .

    4. تحديد مصدر بيانات، انقر فوق مشروع و حدد اسم المشروع مكتبة الفئات.

  5. انقر فوق تحديد إصدارات واختر Visual Studioالإصدارات التي تريدها الملحق إلى تعمل على.

  6. قم بتعيين الاسم و حقول VSIX وصفية. احفظ الملف.

تعريف قيد التحقق من صحة

تكون الجميع المهام التالية في فئة مشروع المكتبة.

مراجع المشروع

يجب إضافة إلى مراجع مشروع? التالي .NETتجميعات:

Microsoft.VisualStudio.Modeling.Sdk.10.0

Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml

Microsoft.VisualStudio.Uml.Interfaces

System.ComponentModel.Composition

أضف فئة لقيود التحقق من الصحة

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

يمكنك وضع هذه الأساليب في أية فئات و مساحات الأسماء.

قم بإضافة ملف إلى فئة مشروع المكتبة التي تحتوي على التعليمة البرمجية التالية. تغيير أسماء مساحة الاسم والفئة وأسلوب إلى تفضيلاتك.

using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Linq;
using Microsoft.VisualStudio.Modeling.Validation;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml;
using Microsoft.VisualStudio.Uml.Classes;
// You might also need the other Microsoft.VisualStudio.Uml namespaces.

namespace Validation
{
  public class MyValidationExtensions
  {
    // SAMPLE VALIDATION METHOD.
    // All validation methods have the following attributes.
    [Export(typeof(System.Action<ValidationContext, object>))]
    [ValidationMethod(
       ValidationCategories.Save
     | ValidationCategories.Open
     | ValidationCategories.Menu)]
    public void ValidateClassNames
      (ValidationContext context, 
       // This type determines what elements 
       // will be validated by this method:
       IClass elementToValidate)
    {
      // A validation method should not change the model.

      List<string> attributeNames = new List<string>();
      foreach (IProperty attribute in elementToValidate.OwnedAttributes)
      {
        string name = attribute.Name;
        if (!string.IsNullOrEmpty(name) && attributeNames.Contains(name))
        {
          context.LogError(
            string.Format("Duplicate attribute name '{0}' in class {1}", name, elementToValidate.Name),
            "001", elementToValidate);
        }
        attributeNames.Add(name);
      }

    }
    // Add more validation methods for different element types.
  }
}

اختبار قيد التحقق من صحة

ل اختبار أغراض، تنفيذ وظائف التحقق من صحة الخاص بك في الوضع التصحيح.

إلى اختبار التحقق من صحة قيد

  1. اضغط F5، أو من قائمة تصحيح ، انقر فوق تصحيح يبدأ .

    نسخة تجريبية عن Visual Studioيبدأ.

    استكشاف الأخطاء وإصلاحها: إذا كان جديد Visual Studioلم البدء، تأكد من مشروع VSIX هو تعيينها كمشروع بدء التشغيل للحل.

  2. في تجريبية Visual Studioأو فتح أو إنشاء مشروع لبناء، وفتح أو إنشاء بناء مخطط.

  3. إلى إعداد اختبار للقيد نموذج معطى في مقطع سابق:

    1. قم بفتح رسم تخطيطي للفئات.

    2. إنشاء فئة، و إضافة سمتان لها نفس الاسم.

  4. ينقر على اليمين في أي مكان في مخطط، ومن ثم انقر فوق التحقق من صحة .

  5. سيتم الإعلام عن أية أخطاء في الطراز في نافذة الأخطاء.

  6. انقر نقراً مزدوجاً فوق الخطأ تقرير. إذا كانت العناصر الواردة في التقرير مرئي تشغيل شاشة، سيتم تمييز.

    استكشاف الأخطاء وإصلاحها: إذا لم يظهر الأمر التحقق من الصحة في قائمة، تأكد من أن:

    • التحقق من صحة مشروع هو lهوted كمكون MEF في lهوt المحتوى في source.extensions.manifestفي مشروع VSIX.

    • الصحيح Exportو ValidationMethodالسمات موصولة بأساليب التحقق من صحة.

    • ValidationCategories.Menuهو مضمنة في وسيطةValidationMethodالسمة، و هو تتألف مع قيم غير ذلك باستخدام أو المنطقية (|).

    • معلمات الجميع Importو Exportالسمات الصالحة.

حول وظائف قيد التحقق من صحة

كل قيد تحقق من الصحة يتم تعريفه بواسطة أسلوب بالشكل التالي:

[Export(typeof(System.Action<ValidationContext, object>))]
 [ValidationMethod(ValidationCategories.Save 
  | ValidationCategories.Menu 
  | ValidationCategories.Open)]
public void ValidateSomething
  (ValidationContext context, IClassifier elementToValidate)
{...}

السمات والمعاملات لكل أسلوب تحقق من الصحة تكون كما يلي:

[Export(typeof(System.Action <ValidationContext, object>))]

تعرّف الأسلوب أنه قيد تحقق من الصحة باستخدام Managed Extensibility Framework (MEF).

[ValidationMethod (ValidationCategories.Menu)]

تعيّن متى سيتم تنفيذ التحقق من الصحة. استخدم OR أحادي المعامل (|) إذا كنت تريد ضم خيار واحد أو أكثر.

Menu = استدعاء بواسطة قائمة "التحقق من الصحة".

Save = استدعاء عند حفظ الطراز.

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

public void ValidateSomething

(ValidationContext context,

IElement element)

استبدل المعامل الثاني IElement بنوع العنصر الذي تريد تطبيق القيد عليه. سيتم استدعاؤه الأسلوب قيد تشغيل الجميع عناصر في النوع المحدد.

اسم الأسلوب غير مهم.

يمكنك تعريف العديد من أساليب التحقق من الصحة كما تريد, بأنواع مختلفة في المعامل الثاني. عند استدعاء التحقق من الصحة, سيتم استدعاء كل أسلوب تحقق من الصحة على أي من عناصر الطراز التي تتوافق مع نوع المعامل.

تقييم القيد

أسلوب التحقق من الصحة يجب أن يحدد ما إذا كانت قيد التحقق من الصحة التي تريد تطبيق true أو false. إذا كانت القيمة true، فإنه يجب أن لا تقوم بأي إجراء. إذا كانت false، فإنه يجب تقرير خطأ باستخدام أساليب يوفرها المعامل ValidationContext .

ملاحظة

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

على سبيل المثال، إذا كنت ترغب في التأكد من أن كل نوع (فئة, أو واجهة, أو تعداد) له اسم يتكون من ثلاثة أحرف على الأقل, يمكنك استخدام هذه الطريقة:

public void ValidateTypeName(ValidationContext context, IType type)
{
  if (!string.IsNullOrEmpty(type.Name) && type.Name.Length < 3)
  {
    context.LogError(
      string.Format("Type name {0} is too short", type.Name),
               "001", type);
   }
 }

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

الإعلام عن أخطاء تحقق من الصحة

لإنشاء تقرير عن خطأ, استخدم الأساليب التي يوفرها ValidationContext:

context.LogError("error string", errorCode, elementsWithError);

  • "error string" يظهر في قائمة أخطاء Visual Studio

  • errorCode هو سلسلة يجب أن تكون معرّف فريد للخطأ

  • elementsWithError يعرّف العناصر في الطراز. عند قيام المستخدم بالنقر نقرًا مزدوجًا فوق تقرير الخطأ, الشكل الذي يمثل هذا العنصر سيتم اختياره.

LogError(), LogWarning() وLogMessage() يقومون بوضع رسائل في مقاطع مختلفة من قائمة خطأ.

كيفية تطبيق أساليب التحقق من الصحة

يتم تطبيق التحقق من الصحة على كل عنصر في الطراز, بما في ذلك العلاقات وأجزاء عناصر أكبر, مثل سمات فئة أو معاملات عملية.

يتم تطبيق كل أسلوب تحقق من الصحة على كل عنصر يتوافق مع النوع في المعامل الثاني الخاص به. وهذا يعني أنه ، على سبيل المثال، إذا قمت بتعريف أسلوب تحقق من الصحة بمعامل ثاني من IUseCase و آخر من نوع رئيسي IElement , ثم كلا الطريقتين سيتم تطبيقها على كل حالة استخدام في الطراز.

تم تلخيص التسلسل الهرمي للأنواع في أنواع عناصر الطراز.

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

public void ValidateTypeName(ValidationContext context, IClass c)
{
   foreach (IProperty property in c.OwnedAttributes)
   {
       if (property.Name.Length < 3)
       {
            context.LogError(
                 string.Format(
                        "Property name {0} is too short", 
                        property.Name), 
                 "001", property);
        }
   }
}

إنشاء أسلوب تحقق من الصحة على الطراز

إذا كنت تريد التأكد من أنه يتم استدعاء أسلوب تحقق من الصحة مرة واحدة بالظبط أثناء كل عملية تأكد من الصحة, يمكنك التحقق من صحة IModel:

using Microsoft.VisualStudio.Uml.AuxiliaryConstructs; ...
[Export(typeof(System.Action<ValidationContext, object>))]
[ValidationMethod(ValidationCategories.Menu)]
public void ValidateModel(ValidationContext context, IModel model)
{  foreach (IElement element in model.OwnedElements)
   { ...

التحقق من صحة الأشكال و المخططات

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

في فئة التحقق من الصحة الخاصة بك ، عرّف DiagramContext كخاصية مستوردة:

using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation; 
...
[Import]
public IDiagramContext DiagramContext { get; set; }

في أسلوب التحقق من الصحة, يمكنك استخدام DiagramContext للوصول إلى مخطط التركيز الحالي, إذا كان هناك واحد:

[Export(typeof(System.Action<ValidationContext, object>))]
[ValidationMethod(ValidationCategories.Menu)]
public void ValidateModel(ValidationContext context, IModel model)
{
  IDiagram focusDiagram = DiagramContext.CurrentDiagram;
  if (focusDiagram != null)
  {
    foreach (IShape<IUseCase> useCaseShape in
              focusDiagram.GetChildShapes<IUseCase>())
    { ...

لتسجيل خطأ, يجب عليك الحصول على عنصر الطراز الذي يمثله الشكل, لأنه لا يمكنك تمرير شكل إلى LogError:

       IUseCase useCase = useCaseShape.Element;
       context.LogError(... , usecase);

تنظيم عدة عمليات تحقق من الصحة

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

يقدم هذا مشكلة التحقق التي تتعامل مع العلاقات بين العناصر. على سبيل المثال، قد تكتب تحقق من الصحة يبدأ من -مثلا- حالة استخدام ، و يقطع علاقات include للتحقق من عدم وجود حلقات تكرار. ولكن عند تطبيق الأسلوب على كل حالة استخدام في طراز يحتوي على العديد من ارتباطات include ، فمن المحتمل أن يتم بشكل متكرر معالجة نفس نواحي الطراز.

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

context.SetCacheValue<T> (name, value)

خزّن قيمة

context.TryGetCacheValue<T> (name, out value)

احصل على قيمة. ترجع true إذا نجحت.

context.GetValue<T>(name)

احصل على قيمة.

Context.GetValue<T>()

احصل على قيمة لنوع محدد.

تثبيت و إلغاء تثبيت ملحق

يمكنك تثبيت ملحق Visual Studio على كل من الكمبيوتر الخاص بك و أجهزة الكمبيوتر الأخرى.

لتثبيت ملحق

  1. تشغيل جهاز الكمبيوتر الخاص بك، ابحث عن .vsixملف التي تم إنشاؤها بالمشروع VSIX.

    1. في مستكشف الحلول، يمين-انقر فوق مشروع VSIX وثم انقر فوق فتح مجلد في مستعرض Windows.

    2. حدد موقع الملف bin\*\ YourProject**.vsix**

  2. انسخ الملف .vsix إلى الكمبيوتر الهدف الذي تريد تثبيت الملحق عليه. يمكن أن يكون هذا الكمبيوتر الخاص بك أو آخر.

    • يجب أن يكون لدى الكمبيوتر الهدف أحد إصدارات Visual Studio التي حددتها في source.extension.vsixmanifest.
  3. على الكمبيوتر الهدف, انقر نقرا مزدوجا على الملف .vsix .

    مثبت ملحقات Visual Studio يفتح ويقوم بتثبيت الملحق.

  4. شغّل أو أعد تشغيل Visual Studio.

لإلغاء تثبيت ملحق

  1. في القائمة أدوات , انقر فوق مدير الملحقات.

  2. وسِّع الملحقات المثبّتة.

  3. حدّد الملحق ، ثم انقر فوق إلغاء التثبيت.

نادراً، ملحق به خلل يفشل في التحميل و يقوم بإنشاء تقرير في نافذة الأخطاء, و لكن لا يظهر في "مدير الملحقات". في هذه الحالة، يمكنك إزالة الملحق عن طريق حذف الملف من:

LocalAppData**\Microsoft\VisualStudio\10.0\Extensions**

المثال

يبحث هذا المثال عن حلقات في علاقة التبعية بين العناصر.

سيتم التحقق كل منهما تشغيل حفظ وتشغيل أمر قائمة التحقق من صحة.

/// <summary>
/// Verify that there are no loops in the dependency relationsips.
/// In our project, no element should be a dependent of itself.
/// </summary>
/// <param name="context">Validation context for logs.</param>
/// <param name="element">Element to start validation from.</param>
[Export(typeof(System.Action<ValidationContext, object>))]
[ValidationMethod(ValidationCategories.Menu 
     | ValidationCategories.Save | ValidationCategories.Open)]
public void NoDependencyLoops(ValidationContext context, INamedElement element)
{
    // The validation framework will call this method
    // for every element in the model. But when we follow
    // the dependencies from one element, we will validate others.
    // So we keep a list of the elements that we don't need to validate again. 
    // The list is kept in the context cache so that it is passed
    // from one execution of this method to another.
    List<INamedElement> alreadySeen = null;
    if (!context.TryGetCacheValue("No dependency loops", out alreadySeen))
    {
       alreadySeen = new List<INamedElement>();
       context.SetCacheValue("No dependency loops", alreadySeen);
    }

    NoDependencyLoops(context, element, 
                new INamedElement[0], alreadySeen);    
}

/// <summary>
/// Log an error if there is any loop in the dependency relationship.
/// </summary>
/// <param name="context">Validation context for logs.</param>
/// <param name="element">The element to be validated.</param>
/// <param name="dependants">Elements we've followed in this recursion.</param>
/// <param name="alreadySeen">Elements that have already been validated.</param>
/// <returns>true if no error was detected</returns>
private bool NoDependencyLoops(ValidationContext context, 
    INamedElement element, INamedElement[] dependants, 
    List<INamedElement> alreadySeen)
{
    if (dependants.Contains(element))
    {
        context.LogError(string.Format("{0} should not depend on itself", element.Name), 
        "Fabrikam.UML.NoGenLoops", // unique code for this error
        dependants.SkipWhile(e => e != element).ToArray()); 
            // highlight elements that are in the loop
        return false;
    }
    INamedElement[] dependantsPlusElement = 
        new INamedElement[dependants.Length + 1];
    dependants.CopyTo(dependantsPlusElement, 0);
    dependantsPlusElement[dependantsPlusElement.Length - 1] = element;

    if (alreadySeen.Contains(element))
    {
        // We have already validated this when we started 
        // from another element during this validation run.
        return true;
    }
    alreadySeen.Add(element);

    foreach (INamedElement supplier in element.GetDependencySuppliers())
    {
        if (!NoDependencyLoops(context, supplier,
             dependantsPlusElement, alreadySeen))
        return false;
    }
    return true;
}

راجع أيضًا:

موارد أخرى

كيفية القيام بما يلي: تعريف و تثبيت ملحق طراز

برمجة بإستخدام API UML