استبدال الفئة الفرعية بحقول.
لديك فئات فرعية تختلف فقط في دوالها (التي تعيد قيمًا ثابتة).
استبدل الدوال بحقول في الفئة الأب واحذف الفئات الفرعية.
##مثال
abstract class Person {
abstract boolean isMale();
abstract char getCode();
}
class Male extends Person {
boolean isMale() { return true; }
char getCode() { return 'M'; }
}
class Female extends Person {
boolean isMale() { return false; }
char getCode() { return 'F'; }
}class Person {
private final boolean male;
private final char code;
private Person(boolean male, char code) {
this.male = male;
this.code = code;
}
static Person createMale() { return new Person(true, 'M'); }
static Person createFemale() { return new Person(false, 'F'); }
boolean isMale() { return male; }
char getCode() { return code; }
}##لماذا نعيد الهيكلة
في بعض الأحيان، تكون إعادة الهيكلة هي الحل الأمثل لتجنب كود النوع (type code).
في إحدى هذه الحالات، قد يختلف التسلسل الهرمي للفئات الفرعية فقط في القيم التي تعيدها دوال معينة. هذه الدوال ليست حتى نتيجة لعملية حسابية، ولكنها محددة بشكل صارم في الدوال نفسها أو في الحقول التي تعيدها الدوال. لتبسيط بنية الفئة، يمكن ضغط هذا التسلسل الهرمي في فئة واحدة تحتوي على حقل واحد أو عدة حقول بالقيم المطلوبة، بناءً على الموقف.
قد تصبح هذه التغييرات ضرورية بعد نقل كمية كبيرة من الوظائف من تسلسل هرمي للفئات إلى مكان آخر. لم يعد التسلسل الهرمي الحالي ذو قيمة كبيرة وأصبحت فئاته الفرعية مجرد وزن زائد.
##الفوائد
- يبسط بنية النظام. يعد إنشاء فئات فرعية أمرًا مبالغًا فيه إذا كان كل ما تريد القيام به هو إرجاع قيم مختلفة في دوال مختلفة.
##كيفية إعادة الهيكلة
-
طبق تقنية استبدال الباني بدالة مصنع (Replace Constructor with Factory Method) على الفئات الفرعية.
-
استبدل استدعاءات باني الفئة الفرعية باستدعاءات دالة المصنع للفئة الفائقة (superclass).
-
في الفئة الفائقة، أعلن عن حقول لتخزين قيم كل من دوال الفئة الفرعية التي تعيد قيمًا ثابتة.
-
أنشئ بانيًا محميًا (protected constructor) للفئة الفائقة لتهيئة الحقول الجديدة.
-
أنشئ بانيات الفئة الفرعية الحالية أو عدلها بحيث تستدعي الباني الجديد للفئة الأب وتمرر القيم ذات الصلة إليه.
-
قم بتنفيذ كل دالة ثابتة (constant method) في الفئة الأب بحيث تعيد قيمة الحقل المقابل. ثم قم بإزالة الدالة من الفئة الفرعية.
-
إذا كان لباني الفئة الفرعية وظائف إضافية، فاستخدم تقنية ضمنية الدالة (Inline Method) لدمج الباني في دالة المصنع للفئة الفائقة.
-
احذف الفئة الفرعية.