أنماط التصميم

كتاب "أنماط التصميم: عناصر البرمجيات القابلة لإعادة الاستخدام والموجهة للكائنات " (1994) هو كتاب في هندسة البرمجيات يشرح أنماط تصميم البرمجيات . ألّفه إريك غاما ، وريتشارد هيلم ، ورالف جونسون ، وجون فليسيدس ، وكتب مقدمته غرادي بوتش . ينقسم الكتاب إلى جزأين، يستكشف الفصلان الأولان إمكانيات البرمجة الموجهة للكائنات ومواطن ضعفها ، بينما تصف الفصول المتبقية 23 نمطًا كلاسيكيًا لتصميم البرمجيات . يتضمن الكتاب أمثلة بلغة C++ ولغة Smalltalk .

كان لهذا الكتاب تأثير كبير في مجال هندسة البرمجيات، ويُعتبر مصدرًا هامًا لنظرية وممارسة التصميم الكائني التوجه. بيع منه أكثر من 500,000 نسخة باللغة الإنجليزية و13 لغة أخرى. [ 1 ] يُشار إلى كل من المؤلفين والكتاب غالبًا باسم " عصابة الأربعة" (GoF). [ 2 ] [ 3 ] [ 4 ] [ 5 ]

تاريخ التطوير والنشر

بدأ الكتاب بجلسة حوارية غير رسمية في اجتماع جمعية مهندسي العمارة في أونتاريو (OOPSLA) عام 1990 ، بعنوان "نحو دليل معماري"، حيث التقى إريك غاما وريتشارد هيلم واكتشفا اهتمامهما المشترك. وانضم إليهما لاحقًا رالف جونسون وجون فليسيدس. [ 6 ] نُشر الكتاب لأول مرة في 21 أكتوبر 1994، وحصل على حقوق النشر عام 1995، وأُتيح للجمهور في اجتماع جمعية مهندسي العمارة في أونتاريو (OOPSLA) عام 1994.

مقدمة

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

يزعم المؤلفون أن المزايا التالية تتفوق على مزايا التنفيذ باستخدام الواجهات :

  • يظل العملاء غير مدركين لأنواع الكائنات المحددة التي يستخدمونها، طالما أن الكائن يلتزم بالواجهة.
  • لا يزال العملاء غير مدركين للفئات التي تُنفذ هذه الكائنات؛ فهم لا يعرفون سوى الفئة (الفئات) المجردة التي تُحدد الواجهة.

يؤدي استخدام الواجهة أيضًا إلى الربط الديناميكي وتعدد الأشكال ، وهما سمتان أساسيتان للبرمجة الموجهة للكائنات.

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

يناقش المؤلفون بالتفصيل التوتر القائم بين التوريث والتغليف، ويشيرون إلى أن المصممين، بحسب خبرتهم، يفرطون في استخدام التوريث (عصابة الأربعة، 1995: 20). ويُبين الخطر على النحو التالي:

"لأن الوراثة تكشف للفئة الفرعية تفاصيل تنفيذ الفئة الأصلية، يُقال غالبًا أن 'الوراثة تكسر مبدأ التغليف'". (عصابة الأربعة 1995:19)

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

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

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

يتناول المؤلفون أيضًا ما يُسمى بالأنواع المُعَلمة، والتي تُعرف أيضًا بالأنواع العامة ( في لغات Ada و Eiffel و Java و C# و Visual Basic (.NET) و Delphi ) أو القوالب ( في لغة C++ ). تسمح هذه الأنواع بتعريف أي نوع دون تحديد جميع الأنواع الأخرى التي يستخدمها، حيث يتم توفير الأنواع غير المحددة كمعاملات عند نقطة الاستخدام.

يُقرّ المؤلفون بأن التفويض وتحديد المعلمات يتمتعان بقوة كبيرة، لكنهم يضيفون تحذيراً:

"البرمجيات الديناميكية ذات المعلمات العالية يصعب فهمها وبناؤها أكثر من البرمجيات الثابتة." (عصابة الأربعة 1995:21)

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

يستخدم المؤلفون مصطلح "مجموعة الأدوات" في حين قد يستخدم آخرون اليوم مصطلح "مكتبة الفئات"، كما هو الحال في لغتي C# أو Java. وبحسب مصطلحاتهم، تُعدّ مجموعات الأدوات المكافئ الكائني التوجه لمكتبات الإجراءات الفرعية، بينما يُعرّف " الإطار " بأنه مجموعة من الفئات المتعاونة التي تُشكّل تصميمًا قابلاً لإعادة الاستخدام لفئة محددة من البرامج. ويشيرون إلى أن تصميم التطبيقات صعب، ومجموعات الأدوات أصعب، أما الأطر فهي الأصعب تصميمًا على الإطلاق.

الأنماط حسب النوع

إبداعي

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

الهيكلي

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

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

السلوكي

تهتم معظم أنماط التصميم السلوكي بشكل خاص بالتواصل بين الأشياء.

استقبال

في عام 2005، منحت جمعية ACM SIGPLAN جائزة إنجاز لغات البرمجة لهذا العام للمؤلفين، تقديراً لتأثير عملهم "على ممارسة البرمجة وتصميم لغات البرمجة ". [ 7 ]

وُجّهت انتقادات لمفهوم أنماط تصميم البرمجيات عمومًا، ولأنماط التصميم تحديدًا. يتمثل أحد الانتقادات الرئيسية لأنماط التصميم في أنها مجرد حلول بديلة لميزات مفقودة في لغة C++، إذ تستبدل الميزات المجردة الأنيقة بأنماط ملموسة مطولة، لتصبح في جوهرها "مترجمًا بشريًا". كتب بول غراهام : [ 8 ]

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

يُبيّن بيتر نورفيج أن 16 نمطًا من أصل 23 نمطًا في كتاب أنماط التصميم يتم تبسيطها أو حذفها بفضل خصائص لغة البرمجة في لغتي ليسب أو ديلان . [ 9 ] وقد توصل هانيمان وكيزاليس إلى ملاحظات مماثلة ، حيث قاما بتطبيق العديد من أنماط التصميم الـ 23 باستخدام لغة برمجة موجهة نحو الجوانب ( AspectJ )، وأظهرا أنه تم إزالة التبعيات على مستوى الكود من تطبيقات 17 نمطًا من أنماط التصميم الـ 23، وأن البرمجة الموجهة نحو الجوانب يمكن أن تُبسّط تطبيقات أنماط التصميم. [ 10 ]

في مقابلة مع مجلة InformIT عام 2009، ذكر إريك غاما أن مؤلفي الكتاب ناقشوا عام 2005 كيفية إعادة هيكلة الكتاب، وخلصوا إلى إعادة تصنيف بعض الأنماط وإضافة أنماط أخرى، مثل كائن/واجهة الامتداد، وحقن التبعية، وكائن النوع، والكائن الفارغ. كان غاما يرغب في حذف نمط Singleton، لكن لم يتفق المؤلفون على ذلك. [ 11 ]

انظر أيضاً

مراجع

  1. زيهو، إدموند (26 يناير 2010). زيهو، إدموند (محرر). Pro ODP .NET لقاعدة بيانات أوراكل 11g . أبريس. الصفحات 351-371 . doi : 10.1007/978-1-4302-2821-9_13 عبر Springer Link. 
  2. حسين، شهيد؛ كيونغ، جاكي؛ خان، عارف علي (2017). "تأثير استخدام أنماط تصميم عصابة الأربعة على سمات جودة التصميم". المؤتمر الدولي لهندسة البرمجيات IEEE لعام 2017 حول جودة البرمجيات والموثوقية والأمان (QRS) . الصفحات 263-273 . doi : 10.1109/QRS.2017.37 . ISBN  978-1-5386-0592-9. S2CID 21343926 . 
  3. هانت، جون (26 يناير 2013). هانت، جون (محرر). أنماط تصميم سكالا: أنماط لإعادة الاستخدام العملي والتصميم . دار نشر سبرينغر الدولية. الصفحات 135-136 . doi : 10.1007/978-3-319-02192-8_16 عبر رابط سبرينغر. 
  4. ألمادي، سارة ح.س.؛ هوشيار، دانيال؛ أحمد، رودينا بنتي (26 يناير 2021). "روائح كريهة لأنماط تصميم عصابة الأربعة: مراجعة منهجية للأدبيات على مدى عقد من الزمن" . الاستدامة . 13 (18) 10256. Bibcode : 2021Sust...1310256A . doi : 10.3390/su131810256 .
  5. ^ مونتيرو، ميغيل بيسوا. فرنانديز، جواو م. (26 يناير 2004). مطبات تطبيقات AceJ لبعض أنماط التصميم المكونة من أربعة . جامعة إكستريمادورا. رقم ISBN 978-84-688-8889-7 عبر repositorium.uminho.pt.
  6. ريتشارد هيلم
  7. "التقرير السنوي لخطة سيغبلان للسنة المالية 2005" (ملف PDF) .{{cite web}}: CS1 maint: url-status ( link )
  8. غراهام، بول (2002). انتقام المهووسين . تم الاسترجاع في 11 أغسطس 2012 .
  9. نورفيج، بيتر (1998). أنماط التصميم في اللغات الديناميكية .
  10. هانيمان، يان؛ كيتزاليس، غريغور (4 نوفمبر 2002). "تطبيق أنماط التصميم في جافا وAspectJ" . ACM SIGPLAN Notices . 37 (11): 161–173 . doi : 10.1145/583854.582436 . مؤرشف من الأصل في 9 مارس 2025 عبر مكتبة ACM الرقمية .
  11. غاما، إريك؛ هيلم، ريتشارد؛ جونسون، رالف (22 أكتوبر 2009). "أنماط التصميم بعد 15 عامًا: مقابلة مع إريك غاما، وريتشارد هيلم، ورالف جونسون" . InformIT (مقابلة). أجراها لاري أوبراين. مؤرشفة من الأصل في 20 فبراير 2019. تم الاطلاع عليها في 1 سبتمبر 2019 .