دمج المتغير المؤقت (Extract Methods)
المشكلة
وجود متغيِّرٍ مؤقَّت (temporary) لحفظ قيمة تعبيرٍ (expression) بسيطٍ ولا شيء آخر سواه.
الحل
تبديل كلُّ مرجعيّةٍ (reference) للمتغيِّر ليحلَّ محلَّها التعبيرُ نفسه.
مثال
قبل إعادة التصميم
نلاحظ في الشيفرة الآتية وجود متغيِّرٍ مؤقتٍ باسم basePrice
لتخزين القيمة الناتجة عن تعبير استدعاء التابع order.basePrice()
، والذي سيُستخدَم في التعليمة التالية لتعريفه:
boolean hasDiscount(Order order) {
double basePrice = order.basePrice();
return basePrice > 1000;
}
بعد إعادة التصميم
تكون إعادة التصميم بمثل هذه الحالة بالاستغناء عن المتغيِّر المؤقّت basePrice
في الشيفرة السابقة واستخدام التعبير مباشرةً كما هو لتصبح الشيفرة كما يلي:
boolean hasDiscount(Order order) {
return order.basePrice() > 1000;
}
لم إعادة التصميم؟
يُجرَى دمج المتغيِّر المؤقَّت كجزءٍ من تقنيّة تبديل المتغيِّر المؤقَّت إلى استدعاء (query) أو لتمهيد الطريق لاستخراج التابع (extract method).
فوائد تطبيق الحل
ما من فائدةٍ هائلةٍ من تطبيق الحلِّ بحدِّ ذاته ولكن عندما يُستخدَم المتغيِّر المؤقّت لتخزين ناتج استدعاء أحد التوابع (method) فإنَّ تضمينه سيحسِّن من قابلية قراءة الشيفرة (readability) عبر التخلِّص من المتغيِّرات الزائدة.
مساوئ تطبيق الحل
قد تُستخدَم المتغيِّرات المؤقّتة أحيانًا بهدف توفير العمليات المكلفة التي يقوم بها البرنامج بكلِّ مرة يحتاجها بها، إذ تكون هذه المتغيِّرات بمثابة مكانٍ تخزينيّ لتلك القيم، وبإزالة تلك المتغيِّرات ستزداد الكلفة وهذا بدوره سيُضعِف الأداء (performance).
آلية الحل
- إيجاد كافة المواقع التي يُستخدَم فيها المتغيِّر المؤقّت في الشيفرة وتبديل المتغيِّر فيها إلى التعبير (expression) الفعليّ الذي أُسنِد له قبلًا.
- حذف كلٍّ من تصريح المتغيِّر وإسناد التعبير إليه.