استبدال الجمل الشرطية بتعدد الأشكال (Replace Conditional with Polymorphism).
لديك جملة شرطية تؤدي إجراءات مختلفة اعتماداً على نوع الكائن أو خصائصه.
أنشئ فئات فرعية (Subclasses) تطابق فروع الجملة الشرطية. وفيها، أنشئ تابعاً مشتركاً وانقل الكود من الفرع المقابل للجملة الشرطية إليه. ثم استبدل الجملة الشرطية باستدعاء التابع المعني. وتكون النتيجة هي الوصول للتطبيق الصحيح عبر تعدد الأشكال (Polymorphism) اعتماداً على فئة الكائن.
##Example
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");
}
}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
التحضير لإعادة الهيكلة
بالنسبة لتقنية إعادة الهيكلة هذه، يجب أن يكون لديك تسلسل هرمي جاهز للفئات التي ستحتوي على السلوكيات البديلة. إذا لم يكن لديك تسلسل هرمي كهذا، فأنشئ واحداً. ستساعدك التقنيات الأخرى في تحقيق ذلك:
-
استبدال رمز النوع بفئات فرعية (Replace Type Code with Subclasses). حيث سيتم إنشاء فئات فرعية لجميع قيم خاصية كائن معينة. هذا النهج بسيط ولكنه أقل مرونة لأنه لا يمكنك إنشاء فئات فرعية للخصائص الأخرى للكائن.
-
استبدال رمز النوع بالحالة/الاستراتيجية (Replace Type Code with State/Strategy). حيث سيتم تخصيص فئة لخاصية كائن معينة وسيتم إنشاء فئات فرعية منها لكل قيمة من قيم الخاصية. وستحتوي الفئة الحالية على إشارات مرجعية لكائنات من هذا النوع وتفوض التنفيذ إليها.
تفترض الخطوات التالية أنك قمت بالفعل بإنشاء التسلسل الهرمي.
خطوات إعادة الهيكلة
-
إذا كانت الجملة الشرطية في تابع يؤدي إجراءات أخرى أيضاً، فقم بـ استخراج التابع (Extract Method).
-
لكل فئة فرعية في التسلسل الهرمي، أعد تعريف التابع الذي يحتوي على الجملة الشرطية وانسخ كود فرع الشرط المقابل إلى ذلك الموقع.
-
احذف هذا الفرع من الجملة الشرطية.
-
كرر عملية الاستبدال حتى تصبح الجملة الشرطية فارغة. ثم احذف الجملة الشرطية وصرح بالتابع كتابع مجرد (Abstract).