نقل الحقول (Move Fields)
المشكلة
استخدام الحقل (field) في صنفٍ (class) ما أكثر من استخدامه في صنفه الأساسيّ.
الحل
إنشاء حقلٍ في صنفٍ جديدٍ وإعادة توجيه (redirect) كلَّ ما يستخدم هذا الحقل إلى ذلك الصنف المُنشَأ.
مثال
قبل إعادة التصميم
يستخدِم الصنفُ Class2
الحقلَ aField
أكثر مما يستخدمه صنفه الأساسيّ Class1
:
بعد إعادة التصميم
نُقِل الحقل aField
إلى الصنف ذي الاستخدام الأكثر له وهو الصنف Class2
:
لم إعادة التصميم؟
تُنقَل الحقول عادةً أثناء تطبيق تقنية الحل استخراج الصنف (Extract Class)، وليس من السهل تحديد الصنف الذي سيُنقل إليه الحقل، ولكن بشكلٍ عام، لتكن القاعدة: يُنقَل الحقل إلى الصنف الذي يحتوي معظمَ التوابع المعتمدة عليه أكثر من غيرها، وتفيد هذه القاعدة في أيّ حالةٍ مماثلةٍ يكون فيها الحقل في المكان الخطأ.
آلية الحل
- إن كان الحقل عامًّا (public) فستصبح عملية إعادة التصميم أسهل بجعل الحقل خاصًا (private) مع توفير توابع الوصول العامّة (public accessors) المناسبة له (لمزيد من التفاصيل راجع تغليف الحقول [Encapsulate Fields]).
- إنشاء الحقل ذاته مع توابع الوصول إليه في الصنف المستقبِل (recipient class).
- توفير المرجعيّة (reference) إلى الصنف المستقبِل، فقد يكون هنالك بالأصل حقلٌ (field) أو تابعٌ (method) يعيد كائنًا (object) مناسبًا، وإن لم يكن ذلك فلا بُدَّ من إنشاء حقلٍ أو كتابة تابعٍ جديدٍ لتخزين كائن الصنف المستقبِل، وبهذا تضمن سهولة الوصول إلى الصنف المستقبِل والحقل الجديد فيه.
- تبديل كل مرجعيّات (references) الحقل السابق إلى استدعاءاتٍ (calls) لتوابع الوصول للحقل في الصنف المستقبِل، وإن لم يكن الحقل خاصًّا (private) فيجب وضع ذلك بعين الاعتبار في الصنف الأعلى (superclass) والأصناف الفرعيّة (subclasses).
- حذف الحقل السابق في الصنف الأصليّ.