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