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

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

المشكلة

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

الحل

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

مثال

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

وجود شرط معقد ناتج عن دمج شرطين باستعمال المعامل || الثنائي في البنية if:

في لغة 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

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

إنشاء دالة باسم ()isSummer تتحقق من الشرط المعقد، واستعمالها مع البنية الشرطية if مباشرةً:

في لغة 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.

انظر أيضًا

مصادر