Refactoring/decompose conditional

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

تجزئة الشَرطيات (Decompose Conditional)

المشكلة

توجد شَرطية مُعقدة (if-then/else أو switch).

الحل

فصل الأجزاء المعقدة من الشَرطية إلى توابع منفصلة: الشرط، then و else.

مثال

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

في لغة Java:

if (date.before(SUMMER_START) || date.after(SUMMER_END)) {
  charge = quantity * winterRate + winterServiceCharge;
}
else {
  charge = quantity * summerRate;
}

في لغة C#‎:

if (date < SUMMER_START || date > SUMMER_END) 
{
  charge = quantity * winterRate + winterServiceCharge;
}
else 
{
  charge = quantity * summerRate;
}

في لغة PHP:

if ($date->before(SUMMER_START) || $date->after(SUMMER_END)) {
  $charge = $quantity * $winterRate + $winterServiceCharge;
}
else {
  $charge = $quantity * $summerRate;
}

في لغة Python:

if date.before(SUMMER_START) or date.after(SUMMER_END):
    charge = quantity * winterRate + winterServiceCharge
else:
    charge = quantity * summerRate

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

في لغة Java:

if (isSummer(date)) {
  charge = summerCharge(quantity);
}
else {
  charge = winterCharge(quantity);
}

في لغة C#‎:

if (isSummer(date))
{
  charge = SummerCharge(quantity);
}
else 
{
  charge = WinterCharge(quantity);
}

في لغة PHP:

if (isSummer($date)) {
  $charge = summerCharge($quantity);
}
else {
  $charge = winterCharge($quantity);
}

في لغة Python:

if isSummer(date):
    charge = summerCharge(quantity)
else:
    charge = winterCharge(quantity)

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

كلما كانت قطعة الشيفرة البرمجية أطول، كلما كان من الصعب فهمها. وتصبح الأمور أكثر صعوبة في الفهم عندما تمتلئ الشيفرة بالشروط:

  • بينما تكون مشغولًا بمعرفة ما تؤديه الشيفرة البرمجية في مُحتوى then، تنسى ماذا كان الشرط المُرتبِط.
  • وكذلك بينما تكون مشغولًا بتحليل مُحتوى else، تنسى ما تؤديه الشيفرة البرمجية في then.

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

  • باستخراج الشيفرة البرمجية الشرطية إلى توابع مسماة بوضوح، يمكن جعل الأمر أسهل بالنسبة للشخص الذي سيصون الشيفرة البرمجية لاحقًا (مثلك أنت، بعد شهرين من الآن!).
  • تقنية إعادة التصميم هذه قابلة للتطبيق أيضا على التعبيرات القصيرة في الشروط. تبدو السلسلة النصية isSalaryDay()‎ أجمل بكثير وأكثر وصفية من شيفرة مقارنة التواريخ.

آلية الحل

  1. استخرج الشرطية إلى تابع منفصل عن طريق استخراج التوابع.
  2. كرر العملية لمُحتوى then و else.

انظر أيضًا

مصادر