المعلوماتية > برمجيات

أنماط التصميم Design Patterns مقدمة إلى أنماط التصميم (Design Pattern)

خلال سنين من بناء الأنظمة البرمجية، ومع تراكم خبرات عدد كبير من المطورين وعبر التجربة والخطأ؛ وُجِدت مجموعةٌ من الحلول هدفُها حل مشكلات مُتكررة الظهور في أثناء تصميم البرمجيات (Software Design)، وسُمّيت هذه الحلول بأنماط التصميم (Design patterns) (1).

أنماط التصميم هي طريقة مِعيارية (Standard) استُخدِمت سابقًا وأثبتت جدارتها في إيجاد  حلول لمجموعة من المشكلات التي قد تواجهنا في أثناء بناء النظام البرمجي. تُستخدَم هذه الأنماط بمثابة تقنية لزيادة مرونة التعديل على الكود البرمجي وزيادة كفاءته (1,2).

يعود الفضل بتجميع أنماط التصميم في البرمجة غرضية التوجه إلى إيريك غاما Erich Gamma؛ أحد مؤلفي كتاب "أنماط التصميم: عناصر البرمجيات الكائنية التوجه القابلة لإعادة الاستخدام" "Design Patterns: Elements of Reusable Object-Oriented Software"؛ إذ بدء بتصنيف أنماط التصميم الغرضية التوجه في أطروحته التي ألهمت ثلاثةً من مصممي برمجيات غرضية التوجه للمشاركة في كتابته، وأصبح فيما بعد يُعرَف هؤلاء مصممي البرمجيات "بالعصابة الأربعة" "Gang-of-four"، وأسمائهم -إضافة إلى إيريك غاما-: جون فليسيدز (John Vlissides) ورالف جونسون (Ralph Johnson) وريتشارد هيلم (Richard Helm) (3).

وصف "عصابة الأربعة" في كتابهم أنماط التصميم أنّ كل نمط يجب أن يحتوي على أربعة مكونات أساسية:

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

المشكلة: تُحدِّد متى نحتاج تطبيقَ نمط معين، وذلك عن طريق توصيف المشكلة والسياق الذي تدور حوله هذه المشكلة. 

الحل: هو المِعيار المُستخدم لحل المشكلة، يحدد العناصر المُستخدمة في الحل وكيفية تفاعلها بعضها مع بعض، ولأن النمط عبارة عن قالب يُستخدم لتقديم عدة حلول فلا يُعطَى تصميمٌ دقيق Concrete design لحل المشكلة، وإنما حل مُجرد abstract يمكن تطبيقه بعدة طرائق.

العواقب الناتجة عن تطبيقها: ما هي التكاليف المترتبة والفوائد الناتجة عن تطبيق النمط، وتكمن أهمية ذلك في تقييم بدائل التصميم المتوفرة لحل المشكلة (3).

خلال السنوات، قُدّم العديد من الأنماط لحل المشكلات، وقُسّمت إلى الثلاثة تصنيفات الرئيسة الآتية:

الأنماط الإنشائية Creational Patterns وتزودك هذه الأنماط بطريقة لإخفاء المنطق البرمجي Logic المُستخدم في صناعة الأغراض objects عن مُستخدمي الغرض. فعوضًا عن إتاحة إنشاء الغرض عبر "new operator" وإعطائه قيم ما، نستطيع التحكم بطريقة إنشاء الغرض.

الأنماط السلوكية Behavioral Patterns وتهتم في كيفية تواصل الأغراض بعضها مع بعض. 

الأنماط البُنيوية Structural Patterns وتهتم بتركيب الأغراض؛ إذ يُستخدم مفهوم الوراثة لتكوين عناصر بناء مُجرّدة (interfaces) يُعرَّف من خلالها طُرق لتكوين أغراض ذات وظائف جديدة (1).

في النهاية، من المهم معرفة أن أنماط التصميم تُكتشف ولا تُخترع. وهي نتاج سنوات عديدة من تجريب عدة حلول واختيار الأفضل منها، ثم تجميع الأفضل وعدّها معيارًا لحل المشكلات، كما جمعت "عصابة الأربعة" 23 من الأنماط المعيارية في كتابهم. ولذلك؛ دراسة أنماط التصميم هو أمر مهم لكل مُبرمج يريد الحصول على نظم غرضية التوجه ذات جودة جيدة.

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

المصادر

1- Beck K, Crocker R, Meszaros G, O. Coplien J, Dominick L, Paulisch F et al. Industrial experience with design patterns. Proceedings of IEEE 18th International Conference on Software Engineering [Internet]. Berlin, Germany: IEEE; 1996 [cited 19 April 2021]. p. 103-114. Available from: هنا

2- Marinescu F. EJB™ Design Patterns Advanced Patterns, Processes, and Idioms. 1st ed. Wiley Computer Publishing; 2002. Available from: هنا

3- C. Martin R. Design Principles and Design Patterns [Internet]. Staff.cs.utu.fi. 2000 [cited 19 April 2021]. Available from: هنا