استبدال التفويض بالتوريث (Replace Delegation with Inheritance)
المشكلة
يحتوي الصنف على العديد من التوابع البسيطة التي تفوِّض إلى كل التوابع في صنفٍ آخر.
الحل
جعل الصنف مفوِّض وارث، الأمر الذي يجعل تابع التفويض غير ضروري.
مثال
قبل إعادة التصميم
التابع الموجود في الصنف Employee
مفوَّض إلى التابع ()getName
في الصنف Person
:
بعد إعادة التصميم
جعل الصنف Employee
يرث من الصنف Person
والتخلص من التفويض:
لم إعادة التصميم؟
يُعد التفويض نهجًا أكثر مرونة من التوريث، لأنَّه يسمح بتغيير طريقة تنفيذ التفويض ووضع أصناف أخرى هناك أيضًا. ومع ذلك، لا يصبح التفويض مفيدًا إذا فوضت الإجراءات إلى صنفٍ واحد فقط وجميع توابعه العامة.
في مثل هذه الحالة، إذا استبدلت التفويض بالتوريث، تُطهِّر الصنف من عدد كبير من توابع التفويض وتعفي نفسك من الحاجة لإنشاءها لكل تابع صنف مفوَّض جديد.
فوائد تطبيق الحل
- تقليل طول الشيفرة، إذ لم نعد بحاجة لجميع توابع التفويض هذه.
متى يترك هذا الحل؟
- لا تستخدم هذه التقنية إذا كان الصنف يحتوي على تفويض لجزء فقط من التوابع العامة لصنف المفوَّض. بفعل هذا، ستنتهك مبدأ ليسكوف للتعويض.
- لا يمكن استخدام هذه التقنية إلا إذا كان الصنف لا يزال بدون أصل.
آلية الحل
- اجعل الصنف صنفًا فرعيًّا من الصنف المفوَّض.
- ضع الكائن الحالي في حقل يحتوي على مرجع إلى الكائن المفوَّض.
- احذف التوابع التي لها تفويض بسيط واحدًا تلو الآخر. إذا كانت أسمائهم مختلفة، استخدم إعادة تسمية التابع لإعطاء كل التوابع اسمًا واحد.
- استبدل جميع المراجع إلى الحقل المفوَّض بمراجع إلى الكائن الحالي.
- أزل الحقل المفوَّض.
انظر أيضًا
- استبدال التوريث بالتفويض (Replace Inheritance with Delegation).
- الاستغناء عن الوسيط (Remove Middle Man).
- الارتباط الوثيق غير المناسب (Inappropriate Intimacy).