دمج التوابع (Extract Methods)
المشكلة
أن يكون محتوى التابع (method body) بسيطًا وواضحًا أكثر من التابع بحدِّ ذاته، ويمكن عندئذٍ الاستغناء عنه.
الحل
نقل الشيفرة الموجودة في التابع (محتوى التابع) إلى مواقع استدعائه، وحذف التابع برمته إذ لا داعي له.
مثال
قبل إعادة التصميم
نلاحظ أن محتوى التابع moreThanFiveLateDeliveries()
واضحٌ وبسيطٌ لدرجةٍ تجعل الاستغناء عنه ممكنًا:
class PizzaDelivery {
//...
int getRating() {
return moreThanFiveLateDeliveries() ? 2 : 1;
}
boolean moreThanFiveLateDeliveries() {
return numberOfLateDeliveries > 5;
}
}
بعد إعادة التصميم
سيُستبدَل استدعاءُ التابع ليحلَّ محتوى التابع محلَّه بالشكل:
class PizzaDelivery {
//...
int getRating() {
return numberOfLateDeliveries > 5 ? 2 : 1;
}
}
لم إعادة التصميم؟
عندما يُفضي (delegate) التابع إلى تابعٍ آخر فلا مشكلة بهذا المنطق بحدِّ ذاته، ولكن تنجم المشكلة عندما يكون هنالك الكثير من هذه التوابع غير المجدية، إذ لا تكون هذه التوابع قصيرةً بادئ الأمر، ولكنها تصبح كذلك بعد الكثير من التعديلات التي تطرأ على البرنامج، والأولى التخلُّص منها فهي بلا فائدة مرجوَّة.
فوائد تطبيق الحل
جعل الشيفرة أكثر وضوحًا بتقليل عدد التوابع غير المفيدة فيها.
آلية الحل
- التأكُّد من أنّ التابع لا يُعاد تعريفه في أيّ من الأصناف الفرعية (subclasses)، فإن كان مُعرَّفًا فعليك العزوف عن دمج التابع.
- إيجاد كافّة استدعاءات هذا التابع في الشيفرة وتبديلها إلى محتواه الفعليّ.
- حذف التابع.