Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. ASP.NET
Code

توليد قانون باستخدام T4

by
Difficulty:IntermediateLength:LongLanguages:

Arabic (العربية/عربي) translation by ansgaradh (you can also view the original English article)

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

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

توليد الكود هو فكرة سيئة

أقوم بكتابة رسالة حول مفهوم أعتقد أنه فكرة سيئة ، في أغلب الأحيان ، وسيكون من غير المحترمة لي إذا سلمتك أداة ولم تحذرك من مخاطرها.

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

" إذا كانت الأداة الوحيدة التي تمتلكها هي المطرقة ، فإنك تميل إلى رؤية كل مشكلة كمسمار"

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

في ما يلي بعض الأمثلة على المكان الذي يجب ألا تستخدم فيه إنشاء الشفرة:

  • من خلال إنشاء التعليمات البرمجية الموزعة ، يمكنك تشغيل برنامج نصي يولد عقود الخدمة والتطبيقات ويحول تطبيقك بطريقة سحرية إلى بنية موزعة. ومن الواضح أن هذا لا يعترف بالدردشة المفرطة للمكالمات الجارية أثناء التشغيل والتي تتباطأ بشكل كبير عبر الشبكة والحاجة إلى الاستثناء المناسب ومعالجة المعاملات للأنظمة الموزعة وما إلى ذلك.
  • إن مصممي واجهة المستخدم الرسومية المرئية هي ما استخدمه مطورو Microsoft للأعمار (في نماذج Windows / Web وإلى حد ما ، التطبيقات المستندة إلى XAML) حيث يقومون بسحب وإفلات عناصر واجهة المستخدم وعناصر واجهة المستخدم (UI) ورؤيتها (قبيحة) التي تم إنشاؤها لهم خلف الكواليس.
  • تعتبر Naked Objects منهجًا لتطوير البرامج حيث تقوم بتعريف نموذج المجال الخاص بك وباقي تطبيقك ، بما في ذلك واجهة المستخدم وقاعدة البيانات ، يتم إنشاء كل شيء من أجلك. من الناحية المفاهيمية ، إنها قريبة جدًا من الهندسة النموذجية المدفوعة.
  • الهندسة المعمارية المبنية على النماذج هي مقاربة لتطوير البرامج حيث تقوم بتعيين نطاقك بالتفصيل باستخدام نموذج استقلال النظام الأساسي (PIM). باستخدام التوليف ، يتم تحويل PIM فيما بعد إلى نموذج خاص بالنظام الأساسي (PSM) ، والذي يمكن للكمبيوتر تشغيله. واحدة من نقاط البيع الرئيسية لـ MDA ، هي أن تقوم بتحديد PIM مرة واحدة ويمكنها توليد تطبيقات الويب أو سطح المكتب في مجموعة متنوعة من لغات البرمجة فقط عن طريق الضغط على زر يمكنه توليد شفرة PSM المطلوبة.

    يتم إنشاء الكثير من أدوات RAD (تطوير التطبيقات السريعة) استنادًا إلى هذه الفكرة: يمكنك رسم نموذج والنقر على زر للحصول على تطبيق كامل. تذهب بعض هذه الأدوات إلى محاولة إزالة المطورين تمامًا من المعادلة حيث يعتقد أن المستخدمين غير التقنيين قادرون على إجراء تغييرات آمنة على البرنامج دون الحاجة إلى مطور.

كنت سأضع أيضاً موضوع "الترابط النسبي للأهداف" في القائمة حيث تعتمد بعض ORM بشكل كبير على إنشاء الكود لإنشاء نموذج الثبات من نموذج بيانات مفاهيمي أو مادي. لقد استخدمت بعض هذه الأدوات وخضرت قليلاً من الألم لتخصيص الشفرة التي تم إنشاؤها.مع ذلك ، يبدو أن الكثير من المطورين يحبونهم حقًا ، لذا فقد تركت ذلك للتو (أو لم أفعل ؟!)؛)

في حين أن بعض هذه "الأدوات" تحل بعض مشاكل البرمجة وتقلل من الجهد المطلوب وتكلفة تطوير البرامج ، فهناك تكلفة صيانة ضخمة مخفية في استخدام تعليمة البرمجية ، والتي عاجلاً أم آجلاً ستعذبك والمزيد رمز ولدت لديك ، وأكثر أنه سيؤذي.

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

في بعض الأحيان ، في بعض الأحيان ، قد يكون إنشاء رمز فكرة جيدة

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

في ما يلي بعض الأمثلة التي قد يكون فيها إنشاء الشفرة مناسبًا بشكل جيد:

  • تحتاج إلى كتابة الكثير من التعليمات البرمجية الأساسية التي تتبع نمط ثابت مماثل. قبل محاولة إنشاء التعليمات البرمجية ، في هذه الحالة ، يجب أن تفكر مليًا في المشكلة وحاول كتابة هذا الرمز بشكل صحيح (على سبيل المثال ، استخدام أنماط موجهة للكائنات إذا كنت تكتب رمز OO). إذا كنت قد حاولت بجد ولم تجد حلًا جيدًا ، فقد يكون إنشاء الكود اختيارًا جيدًا.
  • أنت كثيرا ما تستخدم بعض البيانات الوصفية الثابتة من مورد واسترجاع البيانات يتطلب استخدام سلاسل سحرية (وربما عملية مكلفة). وفيما يلي بعض الأمثلة على ذلك:
    • بيانات تعريف الكود التي يتم جلبها عن طريق الانعكاس : يتطلب استدعاء الرمز باستخدام الانعكاس سلاسل سحرية؛ ولكن في وقت التصميم ، تعرف ما تحتاجه يمكنك استخدام إنشاء الكود لإنشاء الأعمال الفنية المطلوبة. بهذه الطريقة سوف تجنب استخدام الانعكاسات في وقت التشغيل و / أو سلاسل السحر في التعليمات البرمجية. مثال رائع على هذا المفهوم هو T4MVC الذي يخلق مساعدين بارزينبشكل قوي يلغي استخدام السلاسل الحرفية في العديد من الأماكن.
    • خدمات البحث الشبكي الثابت : بين الحين والآخر أواجه خدمات الويب التي توفر فقط بيانات ثابتة يمكن جلبها من خلال توفير مفتاح ، والذي ينتهي كسلسلة سحرية في مصدر البرمجة. في هذه الحالة ، إذا تمكنت من استرجاع جميع المفاتيح برمجيًا ، يمكنك عندئذٍ إنشاء التعليمة البرمجية لفئة ثابتة تحتوي على جميع المفاتيح والوصول إلى قيم السلسلة كمواطنين من الدرجة الأولى مكتوبة بقوة في تعليمات البرمجة بدلاً من استخدام سلاسل سحرية. يمكنك بالطبع إنشاء الفصل يدويًا ؛ ولكن عليك أيضًا الاحتفاظ بها ، يدويًا ، في كل مرة تتغير فيها البيانات. يمكنك بعد ذلك استخدام هذه الفئة لتصل إلى خدمة الويب وتقوم بتخزين النتائج مؤقتًا بحيث يتم حل المكالمات اللاحقة من الذاكرة.

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

    • جداول البحث الثابتة : تشبه إلى حد كبير خدمات الويب الثابتة ولكن البيانات تعيش في مخزن بيانات بدلاً من خدمة ويب.

كما ذكر أعلاه ، فإن إنشاء الكود يجعل من الشفرة غير مرنة وصعبة الصيانة ؛ إذا كانت طبيعة المشكلة التي تقوم بحلها ثابتة ولا تتطلب صيانة متكررة ، فقد يكون إنشاء الكود حلًا جيدًا!

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

أيضا ، إذا ذهبت لتوليد التعليمات البرمجية ، تأكد من كتابة اختبارات الوحدة. لسبب ما ، يعتقد بعض المطورين أن الشفرة التي تم إنشاؤها لا تتطلب اختبار الوحدة. ربما يظنون أنه تم إنشاؤها بواسطة أجهزة الكمبيوتر وأجهزة الكمبيوتر لا يخطئ! أعتقد أن الشفرة المولدة تتطلب قدرًا كبيرًا من التحقق التلقائي (إن لم يكن أكثر). أنا شخصيا TDD توليد الكود الخاص بي: أكتب الاختبارات أولا ، تشغيلها لرؤيتها تفشل ، ثم توليد رمز ومعرفة اجتياز الاختبارات.

أدوات قالب تحويل النص

يوجد مشغل إنشاء تعليمات برمجية رائع في Visual Studio يسمى مجموعة أدوات تحويل قالب النص (AKA ، T4).

من MSDN :

تتكون القوالب النصية من الأجزاء التالية:

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

بدلاً من التحدث عن كيفية عمل T4 ، أود استخدام مثال حقيقي. إذن فهذه مشكلة واجهتها منذ فترة وجيزة استخدمت فيها جهاز T4. لدي مكتبة المصدر. NET مفتوحة دعا Humanizer . كان أحد الأشياء التي أردت توفيرها في Humanizer هو واجهة برمجة تطبيقات صديقة للمطورين بطلاقة للعمل معDateTime .

لقد اعتبرت بعض الاختلافات في واجهة برمجة التطبيقات وفي النهاية ، استقرت على هذا:

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

بالنسبة لكل صيغة ، أنشأت ملف T4 منفصلًا:

  • In.Months.tt for In.January and In.FebrurayOf (<some year>) وهكذا.
  • On.Days.tt لـ On.January.The4th ، On.February.The (12) وهكذا.
  • In.SomeTimeFrom.tt for In.One.Second ،In.TwoSecondsFrom (<date time>) ،In.Three.Minutes وهكذا.

هنا سأناقش On.Days . يتم نسخ الرمز هنا للرجوع إليه:

إذا كنت تقوم بالتحقق من هذا الرمز في Visual Studio أو تريد العمل مع T4 ، فتأكد من تثبيت محرر T4 ملموس لـ Visual Studio . وهو يوفر IntelliSense و T4 Syntax-Highlighting و متقدم T4 Debugger و T4 Transform على البناء.

قد يبدو الرمز مخيفًا بعض الشيء في البداية ، ولكنه مجرد نص تشبه إلى حد كبير لغة ASP. عند الحفظ ، سيؤدي هذا إلى إنشاء فئة تسمى On مع 12 فئة فرعية ، واحدة كل شهر (على سبيل المثال ، يناير ، فبراير ، إلخ) لكل منها خصائص عامة ثابتة تعيد يومًا معينًا في ذلك الشهر. دعونا نكسر الشفرة ونرى كيف تعمل.

توجيهات

إن بناء جملة الأوامر كما يلي: # # DirectiveName [AttributeName = "AttributeValue"] ... #> . يمكنك قراءة المزيد عن التوجيهات هنا .

لقد استخدمت التوجيهات التالية في الكود:

قالب

يحتوي التوجيه Template على العديد من السمات التي تسمح لك بتحديد جوانب مختلفة للتحويل.

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

انتاج |

و التوجيه الناتج يستخدم لتحديد ملحق اسم الملف وترميز ملف تحويل. نحن هنا تعيين ملحق.cs مما يعني أن الملف الذي تم إنشاؤه يكون في C # وسوف يكون اسم الملفOn.Days.cs .

المجسم

نحن هنا تحميل System.Core حتى نتمكن من استخدامه في كتل الكود إلى أسفل.

و التوجيه الجمعية بتحميل جمعية بحيث شفرة النموذج يمكن استخدام أنواعه. يشبه التأثير إضافة مرجع تجميع في مشروع Visual Studio.

هذا يعني أنه يمكنك الاستفادة الكاملة من .NET Framework في قالب T4 الخاص بك.على سبيل المثال ، يمكنك استخدام ADO.NET للوصول إلى قاعدة بيانات ، وقراءة بعض البيانات من جدول واستخدامها لتوليد التعليمات البرمجية.

مزيد من أسفل ، لدي السطر التالي:

هذا مثير للاهتمام بعض الشيء. في On.Days.tt قالب أنا باستخدام Ordinalizeطريقة من Humanizer الذي يتحول رقم في سلسلة التراتبية، وتستخدم للدلالة على الموقف في تسلسل أمر مثل 1، 2، 3، 4. هذا يستخدم لتوليد The1st ،The2nd وهلم جرا.

من مقالة MSDN :

يجب أن يكون اسم التجميع واحدًا مما يلي:

  • الاسم القوي لتجميع في GAC ، مثل System.Xml.dll . يمكنك أيضًا استخدام النموذج الطويل ، مثل name = "System.Xml ، الإصدار = 4.0.0.0 ، Culture = neutral ، PublicKeyToken = b77a5c561934e089".لمزيد من المعلومات ، راجع AssemblyName .
  • المسار المطلق للتجميع.

يعيش System.Core في GAC ، لذلك يمكننا بسهولة استخدام اسمه ؛ ولكن من أجل الإنسان يجب علينا توفير المسار المطلق. من الواضح أنني لا أرغب في تعديل مسار بلدي المحلي ، لذلك استخدمت $ (SolutionDir)الذي تم استبداله بالمسار الذي يعيشه الحل أثناء إنشاء الكود. وبهذه الطريقة ، يعمل إنشاء الرموز بشكل جيد للجميع ، بغض النظر عن المكان الذي يحتفظون فيه بالكود.

استيراد

و التوجيه استيراد يسمح لك للإشارة إلى العناصر في مساحة اسم آخر دون تقديم اسم مؤهل بشكل كامل. وهو مكافئ لعبارة استخدام في C # أو استيراد في Visual Basic.

في الجزء العلوي ، نقوم بتحديد جميع مساحات الأسماء التي نحتاجها في كتل التعليمات البرمجية. ل استيراد تندس كتل ترى هناك في الغالب من قبل T4 ملموس. الشيء الوحيد الذي أضفته هو:

حتى أتمكن لاحقًا من الكتابة:

بدون بيان الاستيراد وتحديد التجميع حسب المسار ، بدلاً من ملف C # ، كنت قد حصلت على خطأ ترجمة يشتكي من عدم العثور على طريقة Ordinalize على عدد صحيح.

كتل النص

إدراج كتلة نص مباشرة في ملف الإخراج. في الأعلى ، كتبت بعض الأسطر من كود C # والتي يتم نسخها مباشرة إلى الملف الذي تم إنشاؤه:

مزيد من أسفل ، بين كتل التحكم ، لدي بعض كتل النص الأخرى لوثائق API ، والأساليب وأيضا لإغلاق الأقواس.

كتل التحكم

كتل التحكم هي مقاطع من رمز البرنامج التي يتم استخدامها لتحويل القوالب. اللغة الافتراضية هي C #.

ملاحظة: اللغة التي تكتب بها الشفرة في كتل التحكم غير مرتبطة بلغة النص الذي يتم إنشاؤه.

هناك ثلاثة أنواع مختلفة من كتل التحكم: Standard و Expression و Class Feature.

من MSDN :

  • يمكن أن تحتوي # # كتل التحكم القياسية # على عبارات.
  • <# = يمكن أن تحتوي كتل التحكم في التعبير #> على تعبيرات.
  • يمكن أن تحتوي # # + كتل التحكم في فئة الميزات على أساليب وحقول وخصائص.

دعونا نلقي نظرة على كتل الضوابط التي لدينا في نموذج القالب:

بالنسبة لي شخصياً ، فإن الشيء الأكثر إزعاجاً حول T4 هو كتل التحكم في الفتح والإغلاق ، حيث يتم خلطها مع الأقواس في كتلة النص (إذا كنت تقوم بإنشاء شفرة لغة قوس مجعد مثل C #). أجد أسهل طريقة للتعامل مع هذا ، هو إغلاق ( #> ) كتلة التحكم بمجرد فتح ( <# ) ثم كتابة التعليمات البرمجية داخل.

في الجزء العلوي ، داخل قالب التحكم القياسي ، أقوم بتعريف leapYear كقيمة ثابتة. هذا هو ما يمكنني إنشاء إدخال لـ 29 فبراير. ثم أكرر أكثر من 12 شهرًا لكل شهر في الحصول علىfirstDayOfMonth و monthName . ثم أغلق كتلة التحكم لكتابة كتلة نص لفئة الشهر ووثائق XML الخاصة به. و monthName يتم استخدام اسم فئة وفي تصريحات XML (باستخدام كتل التحكم التعبير). والباقي هو مجرد رمز C # عادي الذي لن أتحمل معك.

استنتاج

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

إذا كنت ترغب في معرفة المزيد عن T4 ، يمكنك العثور على الكثير من المحتوى الرائع علىمدونة Oleg Sych .

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.