نمط أسلوب القالب
في البرمجة كائنية التوجه ، تُعدّ طريقة القالب أحد أنماط التصميم السلوكي التي حددها جاما وآخرون [ 1 ] في كتاب أنماط التصميم . طريقة القالب هي دالة في فئة أساسية، عادةً ما تكون فئة أساسية مجردة، وتُعرّف الهيكل الأساسي لعملية ما من خلال عدد من الخطوات عالية المستوى. تُنفّذ هذه الخطوات بدورها بواسطة دوال مساعدة إضافية في نفس الفئة التي تنتمي إليها طريقة القالب .
قد تكون الدوال المساعدة إما دوالًا مجردة ، وفي هذه الحالة يُطلب من الفئات الفرعية توفير تطبيقات ملموسة، أو دوال ربط ، والتي تكون أجسامها فارغة في الفئة الأصلية. يمكن للفئات الفرعية (ولكن ليس مطلوبًا منها) تخصيص العملية عن طريق تجاوز دوال الربط. يهدف أسلوب القالب إلى تحديد البنية العامة للعملية، مع السماح للفئات الفرعية بتحسين أو إعادة تعريف خطوات معينة. [ 2 ]
ملخص
يتكون هذا النمط من جزأين رئيسيين:
- تُنفَّذ "طريقة القالب" كدالة في فئة أساسية (عادةً ما تكون فئة مجردة ). تحتوي هذه الدالة على شيفرة لأجزاء الخوارزمية العامة الثابتة. يضمن القالب اتباع الخوارزمية الشاملة دائمًا. [ 1 ] في طريقة القالب، تُنفَّذ أجزاء الخوارزمية التي قد تختلف عن طريق إرسال رسائل ذاتية تطلب تنفيذ دوال مساعدة إضافية . في الفئة الأساسية، تُعطى هذه الدوال المساعدة تنفيذًا افتراضيًا، أو لا تُعطى أي تنفيذ على الإطلاق (أي أنها قد تكون دوالًا مجردة).
- تقوم الفئات الفرعية للفئة الأساسية "بملء" الأجزاء الفارغة أو "المتغيرة" من "القالب" بخوارزميات محددة تختلف من فئة فرعية إلى أخرى. [ 3 ] من المهم ألا تقوم الفئات الفرعية بتجاوز طريقة القالب نفسها.
أثناء التشغيل، تُنفَّذ الخوارزمية المُمثَّلة بالدالة النموذجية عن طريق إرسال رسالة النموذج إلى نسخة من إحدى الفئات الفرعية الملموسة. ومن خلال الوراثة، تبدأ الدالة النموذجية في الفئة الأساسية بالتنفيذ. عندما تُرسل الدالة النموذجية رسالة إلى نفسها تطلب فيها إحدى الدوال المساعدة، تستقبل النسخة الفرعية الملموسة الرسالة. إذا كانت الدالة المساعدة مُعاد تعريفها، فسيتم تنفيذ التنفيذ المُعاد تعريفه في النسخة الفرعية؛ أما إذا لم تكن مُعاد تعريفها، فسيتم تنفيذ التنفيذ الموروث في الفئة الأساسية. تضمن هذه الآلية أن تتبع الخوارزمية ككل نفس الخطوات في كل مرة، مع السماح لتفاصيل بعض الخطوات بالاعتماد على النسخة التي استقبلت طلب تنفيذ الخوارزمية الأصلي.
يُعد هذا النمط مثالاً على انعكاس التحكم لأن الكود عالي المستوى لم يعد يحدد الخوارزميات التي سيتم تشغيلها؛ بدلاً من ذلك، يتم اختيار خوارزمية منخفضة المستوى في وقت التشغيل.
قد تُرسل بعض الرسائل الذاتية من دالة القالب إلى دوال الربط . تُنفَّذ هذه الدوال في نفس الفئة الأساسية لدالة القالب، ولكن بأجسام فارغة (أي أنها لا تفعل شيئًا). توجد دوال الربط لتمكين الفئات الفرعية من تجاوزها، وبالتالي ضبط أداء الخوارزمية بدقة دون الحاجة إلى تجاوز دالة القالب نفسها. بعبارة أخرى، تُوفِّر هذه الدوال "خطافًا" لربط تطبيقات مُختلفة.
بناء
مخطط فئات UML

في مخطط فئات UML أعلاه ، يُعرّف هذا العنصر عملية تُحدد الهيكل (القالب) لسلوك ما بواسطةAbstractClasstemplateMethod()
- تنفيذ الأجزاء الثابتة من السلوك و
- إرسال الرسائل إلى الذات
primitive1()وprimitive2()، والتي، نظرًا لتنفيذها فيSubClass1، تسمح لتلك الفئة الفرعية بتوفير تنفيذ متغير لتلك الأجزاء من الخوارزمية.

الاستخدام
تُستخدم طريقة القوالب في الأطر البرمجية، حيث يُنفذ كل قالب الأجزاء الثابتة من بنية المجال، مع توفير دوال ربط للتخصيص. هذا مثال على عكس التحكم . تُستخدم طريقة القوالب للأسباب التالية. [ 3 ]
- يسمح ذلك للفئات الفرعية بتنفيذ سلوكيات مختلفة (من خلال تجاوز أساليب الربط). [ 6 ]
- يتجنب هذا الأسلوب التكرار في الكود: حيث يتم تنفيذ سير العمل العام للخوارزمية مرة واحدة في طريقة القالب الخاصة بالفئة المجردة، ويتم تنفيذ الاختلافات الضرورية في الفئات الفرعية. [ 6 ]
- يتحكم هذا في النقاط التي يُسمح عندها بالتخصيص. فإذا قامت الفئات الفرعية ببساطة بتجاوز طريقة القالب، فبإمكانها إجراء تغييرات جذرية وعشوائية على سير العمل. في المقابل، من خلال تجاوز طرق الربط فقط، لا يمكن تغيير سوى تفاصيل محددة من سير العمل، [ 6 ] ويبقى سير العمل ككل سليمًا.
استخدم مع مولدات الأكواد
يُعدّ نمط القالب مفيدًا عند العمل مع التعليمات البرمجية المُولّدة تلقائيًا. تكمن صعوبة العمل مع هذه التعليمات في أن أي تغيير في التعليمات البرمجية المصدرية سيؤدي إلى تغييرات في التعليمات البرمجية المُولّدة؛ فإذا أُجريت تعديلات يدوية عليها، فستُفقد. فكيف يُمكن إذًا تخصيص التعليمات البرمجية المُولّدة؟
يُقدّم نمط القالب حلاً. إذا اتبع الكود المُولّد نمط أسلوب القالب، فسيكون الكود المُولّد بأكمله فئةً أساسيةً مجردة. شريطة أن تقتصر التعديلات المكتوبة يدويًا على فئة فرعية، يُمكن تشغيل مُولّد الكود مرة أخرى دون خطر الكتابة فوق هذه التعديلات. عند استخدامه مع توليد الكود، يُشار إلى هذا النمط أحيانًا باسم نمط فجوة التوليد . [ 7 ]
مثال بلغة C++
يعتمد هذا التطبيق بلغة C++23 على التطبيق السابق لـ C++98 الموجود في الكتاب.
![]()
استيراد std ؛باستخدام std :: unique_ptr ؛// فئة مجردة class View { private : void setFocus ( ) { std :: println ( "تم استدعاء View::setFocus" ); }void resetFocus () { std :: println ( "تم استدعاء View::resetFocus" ); } public : // تُعرّف عمليات أولية مجردة تُعرّفها الفئات الفرعية الملموسة لتنفيذ خطوات الخوارزمية. virtual void doDisplay () = 0 ;// تُنفّذ هذه الدالة طريقةً نموذجيةً تُحدّد الهيكل الأساسي للخوارزمية. تستدعي هذه الطريقة النموذجية العمليات الأولية، بالإضافة إلى العمليات المُعرّفة في فئة AbstractClass أو تلك الخاصة بكائنات أخرى. void display () { setFocus (); doDisplay (); resetFocus (); }virtual ~ View () = default ; };// فئة ملموسة class MyView : public View { public : // تُنفذ العمليات الأساسية لتنفيذ خطوات الخوارزمية الخاصة بالفئة الفرعية. void doDisplay () override { // عرض محتويات العرض std :: println ( "تم استدعاء MyView::doDisplay" ); } };int main ( int argc , char * argv []) { unique_ptr < View > myview = std :: make_unique < MyView > (); myview -> display (); }مخرجات البرنامج هي
تم استدعاء View :: setFocus، وتم استدعاء MyView :: doDisplay، وتم استدعاء View :: resetFocus.انظر أيضاً
مراجع
- 1 2 غاما، إريك ؛ هيلم، ريتشارد ؛ جونسون، رالف ؛ فليسيدس، جون (1994). "أسلوب القالب". أنماط التصميم . أديسون-ويسلي. ص 325-330 . ISBN 0-201-63361-2.
- ↑ فريمان، إريك؛ فريمان، إليزابيث؛ سييرا، كاثي؛ بيتس، بيرت (2004). هندريكسون، مايك؛ لوكيدس، مايك (محررون). أنماط التصميم من البداية (غلاف ورقي) . المجلد 1. أورايلي. الصفحات 289، 311. ISBN 978-0-596-00712-6تم الاطلاع عليه بتاريخ 12-09-2012 .
- 1 2 "نمط تصميم أسلوب القالب" . المصدر: إعداد المصادر - تعليم متخصصي تكنولوجيا المعلومات . تاريخ الاسترجاع: 12-09-2012 .
يُستخدم أسلوب القالب بشكل بارز في أطر العمل.
- ↑ "نمط تصميم طريقة القالب - البنية" . w3sDesign.com . تم الاطلاع عليه بتاريخ 12 أغسطس 2017 .
- ↑ مفتاح LePUS3. تم استرجاعه من http://lepus.org.uk/ref/legend/legend.xml .
- 1 2 3 تشونغ، كارلو (2011). أنماط تصميم Objective-C الاحترافية لنظام iOS . بيركلي، كاليفورنيا: Apress. ص 266. ISBN 978-1-4302-3331-2.
- ↑ فليسيدس، جون (22-06-1998). تهجين الأنماط: أنماط التصميم التطبيقية . أديسون-ويسلي بروفيشنال. الصفحات 85-101 . ISBN 978-0201432930.
روابط خارجية
- أنماط تصميم البرمجيات
- طريقة (برمجة الحاسوب)
