ConstructiCat Logo
CodeBust.
Browse section ▾

استبدال الجمل الشرطية بتعدد الأشكال (Replace Conditional with Polymorphism).

Problem

لديك جملة شرطية تؤدي إجراءات مختلفة اعتماداً على نوع الكائن أو خصائصه.

Solution

أنشئ فئات فرعية (Subclasses) تطابق فروع الجملة الشرطية. وفيها، أنشئ تابعاً مشتركاً وانقل الكود من الفرع المقابل للجملة الشرطية إليه. ثم استبدل الجملة الشرطية باستدعاء التابع المعني. وتكون النتيجة هي الوصول للتطبيق الصحيح عبر تعدد الأشكال (Polymorphism) اعتماداً على فئة الكائن.

##Example

Before
class Bird {
  // ...
  double getSpeed() {
    switch (type) {
      case EUROPEAN:
        return getBaseSpeed();
      case AFRICAN:
        return getBaseSpeed() - getLoadFactor() * numberOfCoconuts;
      case NORWEGIAN_BLUE:
        return (isNailed) ? 0 : getBaseSpeed(voltage);
    }
    throw new RuntimeException("Should be unreachable");
  }
}
After
abstract class Bird {
  // ...
  abstract double getSpeed();
}

class European extends Bird {
  double getSpeed() {
    return getBaseSpeed();
  }
}
class African extends Bird {
  double getSpeed() {
    return getBaseSpeed() - getLoadFactor() * numberOfCoconuts;
  }
}
class NorwegianBlue extends Bird {
  double getSpeed() {
    return (isNailed) ? 0 : getBaseSpeed(voltage);
  }
}

// في مكان ما في كود العميل
speed = bird.getSpeed();

##Why Refactor

يمكن أن تساعد تقنية إعادة الهيكلة هذه إذا كان الكود الخاص بك يحتوي على معاملات تؤدي مهاماً متنوعة تختلف بناءً على:

  • فئة (Class) الكائن أو الواجهة (Interface) التي يطبقها.

  • قيمة حقل الكائن.

  • نتيجة استدعاء أحد توابع الكائن.

إذا ظهرت خاصية أو نوع كائن جديد، فستحتاج إلى البحث عن الكود وإضافته في جميع الجمل الشرطية المماثلة. وبالتالي، تتضاعف فائدة هذه التقنية إذا كان هناك العديد من الجمل الشرطية المنتشرة في جميع توابع الكائن.

##Benefits

  • تلتزم هذه التقنية بمبدأ "أخبره، لا تسأله" (Tell-Don't-Ask): فبدلاً من سؤال الكائن عن حالته ثم اتخاذ إجراءات بناءً عليها، من الأسهل بكثير إخبار الكائن بما يجب عليه فعله وترك القرار له في كيفية تنفيذ ذلك.

  • يزيل تكرار الكود. حيث تتخلص من العديد من الجمل الشرطية المتطابقة تقريباً.

  • إذا كنت بحاجة إلى إضافة خيار تنفيذ جديد، فكل ما عليك فعله هو إضافة فئة فرعية جديدة دون لمس الكود الحالي (مبدأ المفتوح/المغلق - Open/Closed Principle).

##How to Refactor

التحضير لإعادة الهيكلة

بالنسبة لتقنية إعادة الهيكلة هذه، يجب أن يكون لديك تسلسل هرمي جاهز للفئات التي ستحتوي على السلوكيات البديلة. إذا لم يكن لديك تسلسل هرمي كهذا، فأنشئ واحداً. ستساعدك التقنيات الأخرى في تحقيق ذلك:

تفترض الخطوات التالية أنك قمت بالفعل بإنشاء التسلسل الهرمي.

خطوات إعادة الهيكلة

  1. إذا كانت الجملة الشرطية في تابع يؤدي إجراءات أخرى أيضاً، فقم بـ استخراج التابع (Extract Method).

  2. لكل فئة فرعية في التسلسل الهرمي، أعد تعريف التابع الذي يحتوي على الجملة الشرطية وانسخ كود فرع الشرط المقابل إلى ذلك الموقع.

  3. احذف هذا الفرع من الجملة الشرطية.

  4. كرر عملية الاستبدال حتى تصبح الجملة الشرطية فارغة. ثم احذف الجملة الشرطية وصرح بالتابع كتابع مجرد (Abstract).