التسلط على الكائنات الأخرى (Feature Envy)

من موسوعة حسوب
< Refactoring
مراجعة 15:13، 27 فبراير 2019 بواسطة جميل-بيلوني (نقاش | مساهمات) (مراجعة وتدقيق.)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)
اذهب إلى التنقل اذهب إلى البحث

توصيف المشكلة

استخدام بعضُ التوابع (methods) بياناتِ الكائنات (objects) الأخرى أكثر ممّا تستخدم بياناتِها ذاتَها.

أسبابها

تحدث هذه المشكلة عقب نقل الحقول (fields) إلى أصناف البيانات (data class)، إذ من الأفضل نقلُ التوابع المستخدِمة لتلك الحقول لذلك الصنف أيضًا.

وما الحل؟

لنضع بالحسبان القاعدة الآتية:

يجب أن تبقى الأجزاء التي تتغيَّر بآنٍ واحدٍ في المكان ذاته معًا

ولتحقيق ذلك:

  • نقلُ التوابع (move methods) إلى المكان الأنسب في الشيفرة.
  • عندما يستخدِم جزءٌ فقط من التابع بياناتِ كائنٍ (object) آخر، فالأفضل استخراجُ تابعٍ (extract method) جديدٍ لنقل ذلك الجزء إليه.
  • إن كان التابع يستخدم عمليّاتٍ (functions) من العديد من الأصناف الأخرى، فيجب أولًا تحديد أيّ صنفٍ يحتوي على أكثر البيانات المستخدَمة ونقل هذا التابع إليه بالإضافة إلى البيانات الأخرى، أو قد يكون الحل باستخراج التابع (extract method) لفصل التابع إلى عدِّة أجزاء تُوزَّع بعدِّة أماكن في أصناف متفرِّقة.

إليك المزيد

ستحصل بحلِّ المشكلة على:

  • التقليل من تكرار (duplication) الشيفرات؛ بسبب وجود الشيفرة المُستخدِمة للبيانات في مكانٍ مركزيّ.
  • شيفرةٍ أكثر تنظيمًا؛ إذ تصبح الشيفرات مجاورةً للبيانات التي تستخدمها.

تجاهل المشكلة

قد يُوضَع السلوك (behaviour) -عمدًا- بعيدًا عن الصنف الذي يحتوي البيانات التي يتعامل معها، وذلك بهدف القدرة على تغييره ديناميكيًا (راجع نماذج التصميم Strategy و Visitor وما يماثلهما).

انظر أيضًا

مصادر