استخراج الواجهة.
المشكلة
يستخدم عملاء متعددون نفس الجزء من واجهة الفئة. حالة أخرى: جزء من الواجهة في فئتين متطابق.
الحل
انقل هذا الجزء المتطابق إلى واجهة مستقلة خاصة به.
##مثال
قبل
class Employee {
double getRate() { return rate; }
boolean hasSpecialSkill() { return special; }
}
class Timesheet {
double charge(Employee emp, int days) {
return emp.getRate() * days;
}
}بعد
interface Billable {
double getRate();
}
class Employee implements Billable {
public double getRate() { return rate; }
boolean hasSpecialSkill() { return special; }
}
class Timesheet {
double charge(Billable emp, int days) {
return emp.getRate() * days;
}
}##لماذا نعيد الهيكلة
-
الواجهات (Interfaces) مناسبة جداً عندما تلعب الفئات أدواراً خاصة في مواقف مختلفة. استخدم طريقة استخراج الواجهة للإشارة بوضوح إلى هذا الدور.
-
تنشأ حالة أخرى مناسبة عندما تحتاج إلى وصف العمليات التي تؤديها فئة ما على خادمها. إذا كان من المخطط السماح في النهاية باستخدام خوادم من أنواع متعددة، فيجب على جميع الخوادم تنفيذ الواجهة.
##كيفية إعادة الهيكلة
-
أنشئ واجهة (interface) فارغة.
-
أعلن عن العمليات المشتركة في الواجهة.
-
أعلن أن الفئات اللازمة تنفذ (implement) الواجهة.
-
قم بتغيير تعريفات الأنواع (type declarations) في كود العميل لاستخدام الواجهة الجديدة.