دمج المتغير المؤقت (Inline Temp)

من موسوعة حسوب

المشكلة

وجود متغيِّرٍ مؤقَّت (temporary) لحفظ قيمة تعبيرٍ (expression) بسيطٍ ولا شيء آخر سواه.

الحل

تبديل كلُّ مرجعيّةٍ (reference) للمتغيِّر ليحلَّ محلَّها التعبيرُ نفسه.

مثال

قبل إعادة التصميم

نلاحظ في الشيفرة الآتية وجود متغيِّرٍ مؤقتٍ باسم basePrice لتخزين القيمة الناتجة عن تعبير استدعاء التابع order.basePrice()‎، والذي سيُستخدَم في التعليمة التالية لتعريفه:

في لغة Java:

boolean hasDiscount(Order order) {
  double basePrice = order.basePrice();
  return basePrice > 1000;
}

في لغة #C:

bool HasDiscount(Order order)
{
  double basePrice = order.BasePrice();
  return basePrice > 1000;
}

في لغة PHP:

$basePrice = $anOrder->basePrice();
return $basePrice > 1000;

في لغة Python:

def hasDiscount(order):
    basePrice = order.basePrice()
    return basePrice > 1000

في لغة TypeScript:

hasDiscount(order: Order): boolean {
  let basePrice: number = order.basePrice();
  return basePrice > 1000;
}

بعد إعادة التصميم

تكون إعادة التصميم بمثل هذه الحالة بالاستغناء عن المتغيِّر المؤقّت basePrice في الشيفرة السابقة واستخدام التعبير مباشرةً كما هو لتصبح الشيفرة كما يلي:

في لغة Java:

boolean hasDiscount(Order order) {
  return order.basePrice() > 1000;
}

في لغة #C:

bool HasDiscount(Order order)
{
  return order.BasePrice() > 1000;
}

في لغة PHP:

return $anOrder->basePrice() > 1000;

في لغة Python:

def hasDiscount(order):
    return order.basePrice() > 1000

في لغة TypeScript:

hasDiscount(order: Order): boolean {
  return order.basePrice() > 1000;
}

لم إعادة التصميم؟

يُجرَى دمج المتغيِّر المؤقَّت كجزءٍ من تقنيّة تبديل المتغيِّر المؤقَّت إلى استدعاء (query) أو لتمهيد الطريق لاستخراج التابع (extract method).

فوائد تطبيق الحل

ما من فائدةٍ هائلةٍ من تطبيق الحلِّ بحدِّ ذاته ولكن عندما يُستخدَم المتغيِّر المؤقّت لتخزين ناتج استدعاء أحد التوابع (method) فإنَّ تضمينه سيحسِّن من قابلية قراءة الشيفرة (readability) عبر التخلِّص من المتغيِّرات الزائدة.

مساوئ تطبيق الحل

قد تُستخدَم المتغيِّرات المؤقّتة أحيانًا بهدف توفير العمليات المكلفة التي يقوم بها البرنامج بكلِّ مرة يحتاجها بها، إذ تكون هذه المتغيِّرات بمثابة مكانٍ تخزينيّ لتلك القيم، وبإزالة تلك المتغيِّرات ستزداد الكلفة وهذا بدوره سيُضعِف الأداء (performance).

آلية الحل

  1. إيجاد كافة المواقع التي يُستخدَم فيها المتغيِّر المؤقّت في الشيفرة وتبديل المتغيِّر فيها إلى التعبير (expression) الفعليّ الذي أُسنِد له قبلًا.
  2. حذف كلٍّ من تصريح المتغيِّر وإسناد التعبير إليه.

انظر أيضًا

مصادر