استبدال التوريث بالتفويض (Replace Inheritance with Delegation)

من موسوعة حسوب

المشكلة

يستخدم صنف فرعي جزءًا فقط من توابع صنفه الفائق (أو من غير الممكن وراثة بيانات الصنف الفائق).

الحل

إنشاء حقل ووضع كائن صنف فائق فيه، وتفويض توابع إلى كائن الصنف الفائق، والتخلص من التوريث.

مثال

قبل إعادة التصميم

يستخدم صنف فرعي جزءًا فقط من توابع صنفه الفائق.
يستخدم صنف فرعي جزءًا فقط من توابع صنفه الفائق.

بعد إعادة التصميم

إنشاء حقل ووضع كائن صنف فائق فيه، وتفويض توابع إلى كائن الصنف الفائق، والتخلص من التوريث.
إنشاء حقل ووضع كائن صنف فائق فيه، وتفويض توابع إلى كائن الصنف الفائق، والتخلص من التوريث.

لم إعادة التصميم؟

يمكن أن يحسن استبدال التوريث بالتكوين من تصميم الصنف تحسينًا كبيرًا إذا:

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

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

فوائد تطبيق الحل

  • لا يحتوي الصنف على أي توابع غير مطلوبة موروثة من الصنف الفائق.
  • يمكن وضع الكائنات المختلفة ذات التطبيقات المختلفة في الحقل المفوَّض. في الواقع تحصل على نمط تصميم الاستراتيجية.

مساوئ تطبيق الحل

  • يجب كتابة العديد من توابع التفويض البسيطة.

آلية الحل

  1. أنشئ حقل في الصنف الفرعي لحفظ الصنف الفائق. خلال المرحلة الأولية، ضع الكائن الحالي فيه.
  2. غير توابع الصنف الفرعي بحيث تستخدم كائن الصنف الفائق بدلا من الكائن this.
  3. بالنسبة للتوابع الموروثة من الصنف الفائق المستدعاة في شيفرة العميل، أنشئ توابع تفويض بسيطة في الصنف الفرعي.
  4. أزل تعريف التوريث من الصنف الفرعي.
  5. غير شيفرة التهيئة للحقل الذي يخزَّن فيه الصنف الفائق السابق عن طريق إنشاء كائن جديد.

انظر أيضًا

مصادر

صفحة توثيق استبدال التوريث بالتفويض في موقع refactoring.guru.