كتاب "أنماط التصميم الكينوني"

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

هنا نسخة الذكرى السنوية مع ترجمة محدثة للكتاب ، والتي أصبحت ضرورية لكل مبرمج. حلت "أنماط التصميم الكينوني" محل "تقنيات التصميم الكينوني".

أربعة مطورين من الدرجة الأولى - عصابة من أربعة - يلفتون انتباهك إلى تجربة OOP في شكل ثلاثة وعشرين نمطًا. ظهرت الأنماط لأن المطورين كانوا يبحثون عن طرق لزيادة مرونة ودرجة إعادة استخدام برامجهم. لا يقدم المؤلفون مبادئ لاستخدام أنماط التصميم فحسب ، بل يقومون أيضًا بتنظيم المعلومات. ستتعرف على دور الأنماط في بنية الأنظمة المعقدة وستكون قادرًا على إنشاء تطبيقاتك الخاصة بسرعة وكفاءة ، مع مراعاة جميع القيود التي تنشأ عند تطوير المشاريع الكبيرة. يتم أخذ جميع القوالب من أنظمة حقيقية وتستند إلى ممارسة حقيقية. يظهر C ++ أو رمز Smalltalk لكل نمط ، مما يدل على قدراته.

مقدمة


يصف الكتاب حلولاً بسيطة وأنيقة للمشكلات النموذجية التي تنشأ في التصميم الشيئي.

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

وهكذا يحل الكتاب مشكلتين.

أولاً ، يقدم دور الأنماط في إنشاء بنية النظم المعقدة.

ثانيًا ، يتيح للمصممين تطوير تطبيقاتهم الخاصة بسهولة باستخدام الأنماط الموجودة في الدليل.

ما الذي تغير في إصدار 2020؟

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

أسلوب نموذجي (طريقة نموذجية)


اسم النمط وتصنيفه

أسلوب القالب هو نمط السلوك الطبقي.

الغرض

تحدد طريقة القالب أساس الخوارزمية وتسمح للفئات الفرعية بإعادة تعريف بعض خطوات الخوارزمية دون تغيير هيكلها ككل.

دافع

النظر في إطار التطبيق ، الذي يحتوي على فئات التطبيق والوثائق. إن فئة التطبيق مسؤولة عن فتح المستندات الموجودة المخزنة بتنسيق خارجي (على سبيل المثال ، في ملف). يمثل كائن فئة المستند معلومات المستند بعد قراءتها من ملف.

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

على سبيل المثال ، يحدد محرر الرسوم البيانية الفئات الفرعية لـ DrawApplication و DrawDocument ، ويحدد جدول البيانات الفئات الفرعية لـ SpreadsheetApplication و SpreadsheetDocument.

صورة

يحدد تطبيق الفئة المجردة خوارزمية لفتح وقراءة مستند في عملية OpenDocument:

void Application::OpenDocument (const char* name) {
      if (!CanOpenDocument(name)) {
          //   
          return;
      }

      Document* doc = DoCreateDocument();

      if (doc) {
          _docs->AddDocument(doc);
          AboutToOpenDocument(doc);
          doc->Open();
          doc->DoRead();
      }
}

تحدد عملية OpenDocument جميع الخطوات لفتح مستند. يتحقق من إمكانية فتح المستند وإنشاء كائن من فئة المستند وإضافته إلى مجموعة المستندات وقراءة المستند من الملف.

ستسمى عملية النموذج OpenDocument طريقة قالب تصف الخوارزمية في فئات العمليات المجردة التي يتم استبدالها في الفئات الفرعية للحصول على السلوك المطلوب. تتحقق الفئات الفرعية لفئة التطبيق من أنه يمكنهم فتح (CanOpenDocument) وإنشاء مستند (DoCreateDocument). قراءة الفئات الفرعية لفئة الوثيقة الوثيقة (DoRead). تحدد طريقة القالب أيضًا عملية تسمح للفئات الفرعية للتطبيق بالحصول على معلومات تفيد بفتح مستند (AboutToOpenDocument).

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

انطباق

الشروط الأساسية لتطبيق طريقة قالب نمط:

  • استخدام واحد للأجزاء الثابتة من الخوارزمية ، بينما يظل تنفيذ السلوك المتغير حسب تقدير الفئات الفرعية ؛
  • الحاجة إلى عزل وتوطين السلوك المشترك في جميع الفئات الفرعية لتجنب تكرار التعليمات البرمجية. هذا مثال جيد على تقنية "التعميم للتعميم" التي وصفها William Opdyke و Ralph Johnson [OJ93]. أولاً ، يتم الكشف عن الاختلافات في الرمز الحالي ، والتي يتم بعد ذلك تحويلها إلى عمليات منفصلة. في النهاية ، يتم استبدال أجزاء التعليمات البرمجية المختلفة بطريقة القالب التي يتم من خلالها استدعاء العمليات الجديدة ؛
  • إدارة تمديد الفئة الفرعية. يمكن تحديد طريقة القالب بحيث يؤدي إلى تشغيل الخطافات - راجع قسم النتائج - في نقاط محددة ، مما يسمح بالتوسع في هذه النقاط فقط.

بناء

صورة

المشاركون

AbstractClass (تطبيق) - فئة مجردة:

  • يحدد العمليات البدائية المجردة التي يتم استبدالها في فئات فرعية محددة لتنفيذ خطوات الخوارزمية ؛
  • ينفذ طريقة القالب التي تحدد الهيكل العظمي للخوارزمية. يستدعي أسلوب القالب العمليات البدائية ، بالإضافة إلى العمليات المحددة في فئة AbstractClass أو في كائنات أخرى ؛

ConcreteClass (MyApplication) - فئة محددة:

  • ينفذ العمليات البدائية التي تنفذ خطوات الخوارزمية بطريقة تعتمد على الفئة الفرعية.



تفترض علاقة ConcreteClass أنه سيتم تنفيذ الخطوات الثابتة للخوارزمية في AbstractClass.

النتائج

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

تؤدي أساليب القالب إلى بنية شفرة مقلوبة ، والتي تسمى أحيانًا مبدأ هوليوود ، مما يعني العبارة "لا تتصل بنا ، سوف نتصل بك" التي غالبًا ما تستخدم في هذه الإمبراطورية السينمائية [Swe85]. في هذه الحالة ، هذا يعني أن الفصل الأصل يستدعي عمليات الفئة الفرعية ، وليس العكس.

تستدعي أساليب القوالب العمليات من الأنواع التالية:

  • عمليات محددة (إما من فئة ConcreteClass أو من فئات العملاء) ؛
  • عمليات محددة من فئة AbstractClass (أي العمليات المفيدة لجميع الفئات الفرعية) ؛
  • العمليات البدائية (أي العمليات المجردة) ؛
  • طرق المصنع (انظر نمط طريقة المصنع (135)) ؛
  • عمليات ربط تنفيذ السلوك الافتراضي التي يمكن توسيعها في الفئات الفرعية. في كثير من الأحيان ، مثل هذه العملية الافتراضية لا تفعل شيئا.

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

يمكن للفئة الفرعية توسيع سلوك العملية عن طريق استبدالها واستدعاء العملية بشكل صريح من الفئة الرئيسية:

void DerivedClass::Operation () {
      //   DerivedClass
      ParentClass::Operation();
}

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

void ParentClass::Operation () {
      //  ParentClass
      HookOperation();
}

في الفصل الأصل ParentClass ، لا تقوم عملية HookOperation بأي شيء:

void ParentClass::HookOperation () { }

تتجاوز الفئات الفرعية HookOperation لتوسيع سلوكها:

void DerivedClass::HookOperation () {
   //    
}

التنفيذ

عند تنفيذ طريقة قالب النمط ، يجب الانتباه إلى الجوانب التالية:

  • C++. , , . , . , , . , -;
  • . , . , ;
  • اصطلاح التسمية. يمكنك تمييز العمليات التي يجب استبدالها بإضافة بادئة إلى أسمائها. على سبيل المثال ، في إطار عمل MacApp لتطبيقات Macintosh [App89] ، تبدأ أسماء طرق القالب بالبادئة Do: DoCreateDocument و DoRead وما إلى ذلك.

مثال التعليمة البرمجية

يوضح المثال C ++ التالي كيف يمكن لفئة رئيسية فرض ثابت على فئاتها الفرعية. تم أخذ مثال من مكتبة NeXT AppKit [Add94]. ضع في اعتبارك فئة العرض ، التي تدعم الرسم على الشاشة ، وهو نوع من الثوابت ، والذي يتكون في حقيقة أن الفئات الفرعية لا يمكنها تغيير العرض إلا عندما تكون في التركيز. يتطلب ذلك تعيين سياق رسم محدد (على سبيل المثال ، الألوان والخطوط).

يمكنك استخدام طريقة عرض القالب لتعيين الحالة. تحدد فئة العرض عمليتين محددتين (SetFocus و ResetFocus) ، والتي تقوم على التوالي بتعيين وإعادة تعيين سياق الرسم. تقوم عملية ربط العرض لفئة العرض بالرسم نفسه. اعرض المكالمات SetFocus قبل DoDisplay لتحضير السياق ، و ResetFocus بعد DoDisplay لإعادة ضبطه:

void View::Display () {
      SetFocus();
      DoDisplay();
      ResetFocus();
}

من أجل دعم الثابت ، يتصل عملاء فئة View دائمًا بـ Display ، ويحل عرض الفئات الفرعية دائمًا محل DoDisplay.

في فئة العرض ، لا تقوم عملية DoDisplay بأي شيء:

void View::DoDisplay () { }

تتجاوز الفئات الفرعية ذلك لإضافة سلوك الرسم المحدد الخاص بهم:

void MyView::DoDisplay () {
      //   
}



تعتبر أساليب قوالب التطبيقات المعروفة أساسية للغاية لدرجة أنها توجد في كل فئة مجردة تقريبًا. تناقش Rebecca Wirfs-Brock et al. [WBWW90، WBJ90] طرق النماذج بالتفصيل.

الأنماط ذات الصلة

طرق المصنع (135) غالبًا ما تسمى من طرق الغلاية. في المثال في قسم الدافع ، طريقة قالب OpenDocument تسمى طريقة المصنع DoCreateDocument.
إستراتيجية (362): تستخدم أساليب القالب الوراثة لتعديل جزء من الخوارزمية. تستخدم الاستراتيجيات التفويض لتعديل الخوارزمية ككل.

»يمكن العثور على مزيد من المعلومات حول الكتاب على موقع الناشر على الإنترنت
» جدول المحتويات
» مقتطفات من

Khabrozhiteley خصم 25 ٪ على قسيمة - OOP

عند دفع النسخة الورقية من الكتاب ، يتم إرسال كتاب إلكتروني عن طريق البريد الإلكتروني.

All Articles