تعتبر نماذج التصميم (بالإنجليزية: Design Patterns) فرعاً مهمّاً من فروع وعلوم هندسة البرمجيات رغم انتقاد البعض له.[1][2][3] تهدف نماذج التصميم إلى الاستخدام المتكرر لحلول وضعت لمشاكل تعتبر في حد ذاتها متكررة أو موجودة بكثرة في عملية تصميم البرمجيات. لا تنطبق هذه النظرية على تصميم البرمجيات فحسب، بل تتعداه إلى عدة علوم أخرى مثل هندسة المباني وهندسة الإلكترونيات وحتّى الطبخ.
من الأخطاء المنتشرة اعتبار نماذج التصميم حلولًا كاملة أو جاهزة للاستخدام مباشرة، فهي لا تغدو أن تكون إلا نموذجا كما يدل اسمها يحتاج للتكييف والتحديد أكثر لكي يواجه مشكلة محددة.
أغلب نماذج التصميم تعتمد على التوجه الكائني في البرمجة. لذلك نجدها تضع تصوراً قائم على التفاعلات والعلاقات الممكنة بين مختلف الفئات المكونة للبرنامج.
الفكرة من وراء نماذج البرمجة
لنقرب الفكرة إلى ذهن القارئ، علينا أن نربط الموضوع بمثال حي من الحياة اليومية. تخيل أنك تقود سيارتك في مكان منعزل ولأول مرة وفجأة اختلت سيطرتك على السيارة بسبب وجود عطل في الإطار. لأول مرة في حياتك تجد أنك بحاجة إلى تغيير الإطار مع أنك لم تعمل ذلك من قبل. سوف تبدأ بالتفكير بجميع الحلول المتاحة أمامك. عادة ما كنت ترى الناس يقومون برفع السيارة فتفعل نفس الشيء، ثم انك بحاجة إلى فصل البراغي انها مشدودة بشكل قوي وأنا لا أستطيع السيطرة على العجل لأنه في الهواء وكلما أحاول دار العجل، إذا علي أن انزل السيارة أولا وأفصل البراغي والسيارة على الأرض... وهكذا. تعلمك من هذا الدرس يجعل خطوات إصلاح العجلة اسرع وما برمجة الحاسوب ببعيد عن هذا المثال. دائما ما نواجه مشاكل في البرمجة سبق وأن تعرضنا لها مرارا فنحاول تطبيق الحلول السابقة عليها واعادة استخدام هذه الاساليب مع إعادة تعديلها بما يتوافق والمشكلة الراهنة...
تاريخ نماذج التصميم
ورد مصطلح نماذج (Patterns) أول مرة على لسان كريستوفر آلكسندر، وأوّل من أسقط المصطلح على هندسة البرمجيّات كان وارد كونينغهام.
في الحقيقة، لم تحظ نماذج التصميم بالشعبيّة إلاّ بعد نشر كتاب Design Patterns. Elements of reusable code سنة 1994. حدث في نفس السنة تنظيم أوّل مؤتمر مخصّص لمناقشة نماذج التصميم.
المكونات الرئيسية لقوالب التصميم
كريستوفر ألكسندر كتب عن قوالب التصميم: «كل قالب يصف مشكلة متكررة الحدوث، مع تقديم لفكرة علاج أو خوارزمية يمكن تطبيقها لملايين المرات دون أن تجد تشابه تام بين الحلول».
هناك أربع مكونات رئيسية لقوالب التصميم:
الاسم: الاسم يختزل ذكر المشكلة وعلاجها والنتائج المترتبة على تطبيق القالب، لكن قد يكون أحيانا ايجاد اسم ملائم أكثر صعوبة من ايجاد حل للمشكلة. لتقريب الفكرة، تذكر عندما كنت مبتدءً في البرمجة وبدأت بعمل ادخال تعديلات على برنامج زميلك ثم فوجئت بالمتغير «س» أو «ص» أمامك،
المشكلة: وصف للمشكلة ومتى تقوم بتطبيق القالب.
الحل: شرح العناصر اللازمة للحل وكيفية ربطها وتعاونها. لا يقوم الحل بتقديم شرح تفصيلي لحل المشكلة وإنما يقوم بإعطاء حل تجريدي أو فكرة أولية للحل.
النتائج والعواقب: النتائج المترتبة عند تطبيق القالب وهي الصوت الخفي من المكونات. تبحث بشكل عام استهلاك المكونات وتستخدم لتقويم القالب أونموذج التصميم.
أنماط نماذج التصميم
حسب GoF تصنف نماذج التصميم إلى 3 أنماط أو مجموعات:
يتم فيه تجنب التصاق مرسل الطلب مع مستقبل الطلب عن طريق اعطاء الفرصة لأكثر من غرض لاستقبال الطلب من المرسل بحيث اذا كان الغرض المستقبل غير قادر على تنفيذ الطلب يقوم بتمريره لغرض مستقبل اخر وهكذا حتى يتم الوصول إلى غرض قادر على تنفيذ الطلب وإعادة النتيجة للمرسل
يعرف غرض يقوم بتحديد طريقة تفاعل عدة أغراض مع بعضها البعض، يخفف هذا النمط من الالتصاق لأنه ينمع الأغراض من الدلالة على بعضها بشكل مباشر، وبدلاً من ذلك فهي تتصل مع بعضها عن طريق غرض وسيط وبالتالي يتم السماح لفعالية هذه الأغراض بالاختلاف دون القلق من تأثر الأغراض الأخرى بهذا الاختلاف
يتم تعريف مجموعة من الخوارزميات ويتم تغليف كل واحدة منها، ويتم التبديل بين هذه الخوارزميات حسب الحاجة بحيث يتم استخدام الخوارزمية المناسبة بشكل مستقل عن الزبون.
يتم تعريف هيكل الخوارزمية ضمن العملية ويتم تحويل بعض خطوات التنفيذ إلى صفوف فرعية. يسمح هذا النمط للصفوف الفرعية بتعديل خطوات معينة في الخوارزمية دون تعديل البنية الأساسية للخوارزمية.
يفصل تنفيذ الدالة عن استدعائها والذي يكون في مسلك تحكم خاص به. الهدف من هذه العملية هو انشاء تزامن عن طريق استخدام استدعاء دوال غير متزامن ومجدول للتعامل مع الطلبات.
يخفف الجهد المبذول للحصول على قفل عن طريق اختبار منقطة القفل أولاً بطريقة غير آمنة، في حال نجح الاختبار يتم الاستمرار بتنفيذ عملية القفل. يمكن أن يكون غير آمن عند التنفيذ في بعض تركيبات لغات البرمجة/العتاد الصلب، وبالتالي يعتبر أحياناً كأنه نموذج مضاد
يوفر هذا النمط طريقة لكتابة برامج متزامنة ومتوازية وموزعة عن طريق تبادل الرسائل. مقارنةً باستخدام المسالك والأقفال، يكون هذا النمط ذو مستوى أعلى برمجياً.
حوض المسالك هو نموذج يحوي عدة مسالك يتم انشاؤها لتنفيذ عدة مهام يتم عادة ترتيبهاا في رتل. عادةً يكون عدد المهام أكبر من عدد المسالك. يمكن اعتباره حالة خاصة من نموذج حوض الأغراض object pool