دليلك للتعرف على أنماط التصميم (Design Patterns)

دليلك للتعرف على أنماط التصميم (Design Patterns)

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

دليلك للتعرف على أنماط التصميم (Design Patterns)

ما هي انماط التصميم ؟

هي مجموعة من الحلول البرمجية السائدة و المتكررة (نمطية) في تصميم البرمجيات.  و هي ليست عبارة عن كود بل عن طريقة لحل المشاكل المعتادة أثناء صناعة البرمجيات بحيث تتيح لك إمكانية إستعمال هذه الحلول في حالات مختلفة. مع الحرص على ان هذه الانماط سهلة التعديل (Maintainable) و سهلة الإختبار (Testable).  و على عكس ما يعتقد الجميع فهي ليست بعدد محدد و الفارق هو الشهرة فقط فهي متوافرة بكميات كبيرة بعضها شهير و بعضها لم ينل حقه من الأضواء. لعل أشهرها و التي نجزم انك قد سمعت بها مسبقا مثل Singleton او MVC او MVVM  ... و غيرها فكلها انماط تصميم.


تاريخ انماط التصميم


ظهرت أنماط التصميم لأول مرة سنة 1977 حسب ويكبيديا، و لاقت شهرة كبيرة بعد صدور كتاب Design Patterns: Elements of Reusable Object-Oriented Software في سنة 1994 من طرف مجموعة من المبرمجين يطلق عليهم عصابة الاربعة Gang of Four . بعد ذلك انتشرت هذه الانماط بين المبرمجين انتشار النار في الهشيم و اصبحنا بين الفينة و الاخرى نرى انماطا جديدة، و لازال يتم إصدار انماط جديدة الى حدود اليوم. 

فوائد انماط التصميم :

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


سلبيات انماط التصميم :


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

اقسام انماط التصميم :

في الأصل هناك 24 نمط تصميم واردة في الكتاب سابق الذكر مقسمة بدورها إلى ثلاث اقسام، لكن ظهرت انماط تصميم من طرف مبرمجين اخرين هنا و هناك مما جعل العدد أكثر.
و تنقسم أنماط التصميم او Design Patterns الى فروع، كل فرع يضم مجموعة من هذه الأنماط التي تخدم نفس الهدف، و إليك بعضها : 
- انماط متعلقة بانشاء الكلاس - creational :
عبارة عن 6 انماط تتعلق فقط ب instance اي انشاء الكائنات - Objects أهمها : 
  1. نمط Singlton : نمط Singleton هو نمط يتأكد من ان الكلاس لديه Instance واحد فقط و يوفر نقطة وصول من اي مكان من البرنامج.
  2. نمط Factory Method : يسمح هذا النمط للكلاس باتخاد  قرار انشاء كائن جديد اثناء Runtime .
  3. نمط Abstract Factory : يمكننا هذا النمط من عرض مجموعة الكائنات التي لها علاقة ببعضها البعض دون الوصول الى الكلاس الاصلي .
  4. نمط اوريجي او Builder : يسمح لنا هذا النمط ببناء كائن معقد خطوة بخطوة.
  5. نمط Prototype : يستعمل هذا النمط عندما تكون تكلفة انشاء كائن جديد كبيرة على موارد الجهاز او يتطلب وقتا اذا كل ما عليك فعله هو انشاء كائن واحد و نسخه بدلا من انشائه.
انماط متعلقة بشكل الكلاس - Structural : 
عبارة عن 7 انماط تتعلق بشكل الكلاس و كيفية عمله . لن اتطرق الى تعريفها هنا لأنها معقدة قليلا و تحتاج الى بعض الشرح و الفضفضة. ففي الاخير لا يمكن لتعريف ان يعطيك معلومات كافية عن اي نمط تصميم، بل فقط توفير فكرة  عامة حول نمط التصميم بهدف تحفيزك أكثر على إستخدامه : 
  1. نمط Adapter
  2. نمط Composite
  3. نمط Proxy
  4. نمط Flyweight
  5. نمط Facade
  6. نمط Bridge
  7. نمط Decorator
انماط متعلقة بسلوك الكائنات - Behavioral : 
عبارة عن 12 نمط تتعلق بكيفية التواصل بين الكائنات بشكل منفصل و مرن. على غرار انماط Structural المذكورة في بداية الأقسام، فلا يمكن وصف هذه الأنماط في سطر واحد بشكل دقيق، لكن بشكل عام إليك قائمة أنماط التصميم الخاصة بسلوك الكائنات :
  1. نمط Template Method
  2. نمط Mediator
  3. نمط Chain of Responsibility
  4. نمط Observer
  5. نمط Strategy
  6. نمط Null Object
  7. نمط Command
  8. نمط State
  9. نمط Visitor
  10. نمط Interpreter
  11. نمط Iterator
  12. نمط Memento
انماط اخرى : 
كما سبق الذكر فإنه يوجد الكثير من أنماط التصميم الكثيرة و التي يمكن تقسيمه لعدة فروع، و المذكورة  أعلاه ليست الوحيدة، بل يوجد أنماط تصميم أخرى كالمتعلقة بهيكلة المشروع و منها المتعلقة بالتزامن وغيرها الكثير و هذه بعضها في هذا الجدول الماخود من  ويكيبيديا :


بعض المصادر لتعلم انماط التصميم :

في هذه الفقرة سأشارك معك بعض المصادر التي اعتبرها كافية لفهم أنماط التصميم بشكل جيد بالإضافة الى الكتاب الذي إستعرضناه في بداية هذا المقال، و وجب الذكر بأنه لا يجب عليك ان تعتمد على مصدر وحيد لتعلم هذه الانماط  :
- قناة Christopher Okhravi على اليوتيوب
يوفر هذا الشخص طريقة رهيبة في شرح أنماط التصميم بعيدا عن شاشة الحاسوب، و بعيدة كليا عن الطريقة المعتادة (و المملة)، لم اشعر أبدا بالملل في فيديوهاته، بالإضافة إلى ندرة هذا النوع من المحتوى على يوتيوب، هذا ما يجعله بالنسبة لي اليوتيوبر الأفضل،  او على الاقل في مجال البرمجة .


- كتاب head first to design patterns
من الكتب المشهورة ايضا في هذا المجال هو كتاب Head first to design patterns، و هذا الكتاب ليس كأي كتاب آخر، فهو موجه للمبتدئين و يعطيك صور و امثلة بسيطة و بطريقة مضحكة كذلك. لا انكر انني اكره الكوميديا في هذا الكتاب و ايضا تلك الصور إذ كان بالإمكان استعمال صور افضل . لكن بغض النظر عن سلبياته فالمحتوى المعروض في الكتاب سهل الفهم و يشرح كل شيء متعلق بكل نمط  على حدة و أيضا مبادئ تصميم البرمجيات. الشيء الجميل ان Christopher Okhravi ( صاحب القناة الأولى ) أنه يعتمد على هذا الكتاب في اغلب الأحيان لهذا سيكون من الجيد متابعة الاثنين. و كنصيحة من تجربة شخصية إبدأ بالكتاب أولا ثم تابع القناة ثانيا.
بعض المواقع التي تشرح انماط التصميم : 
  1. منصة Medium : الله على عظمة هذا المنصة مئات الالوف من التذوينات في مختلف المجالات بما في ذلك انماط التصميم . 
  2. موقع sourcemaking : في بعض الاحيان يصعب علي فهم بعض الانماط لهذا اتجه الى هذا الموقع لاشاهد بعض الامثلة و على عكس كتاب head first فهو يتوفر على صور افضل .
  3. موقع refactoring : لا اعلم ما علاقته بالموقع السابق لكن لهما نفس التصميم تقريبا و نفس طريقة الشرح.
  4. موقع journaldev : هذا الموقع قد يحتوي احيانا على بعض الاخطاء لكنه مفيد .
كاتب المقال : Ismail Bella .

شاركه على :