ConstructiCat Logo
CodeBust.
Browse section ▾

إدخال تابع خارجي (Introduce Foreign Method).

Problem

لا تحتوي فئة أدوات (Utility Class) على التابع الذي تحتاجه ولا يمكنك إضافة التابع إلى الفئة.

Solution

أضف التابع إلى فئة عميلة (Client Class) ومرر كائناً من فئة الأدوات إليها كمعامل.

##Example

Before
class Report {
  // ...
  void sendReport() {
    Date nextDay = new Date(previousEnd.getYear(),
      previousEnd.getMonth(), previousEnd.getDate() + 1);
    // ...
  }
}
After
class Report {
  // ...
  void sendReport() {
    Date newStart = nextDay(previousEnd);
    // ...
  }
  private static Date nextDay(Date arg) {
    return new Date(arg.getYear(), arg.getMonth(), arg.getDate() + 1);
  }
}

##Why Refactor

لديك كود يستخدم بيانات وتوابع فئة معينة. وتدرك أن هذا الكود سيبدو ويعمل بشكل أفضل بكثير داخل تابع جديد في تلك الفئة. لكن لا يمكنك إضافة التابع إليها لأن الفئة موجودة في مكتبة خارجية (Third-party library) على سبيل المثال.

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

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

##Benefits

  • يزيل تكرار الكود. إذا كان الكود مكرراً في عدة أماكن، يمكنك استبدال هذه الأجزاء باستدعاء تابع. هذا أفضل من التكرار حتى مع الأخذ في الاعتبار أن التابع الخارجي يقع في مكان غير مثالي.

##How to Refactor

  1. أنشئ تابعاً جديداً في فئة العميل (Client class).

  2. في هذا التابع، أنشئ معاملاً يُمَرَّر من خلاله كائن فئة الأدوات (Utility class). إذا كان بالإمكان الحصول على هذا الكائن من فئة العميل، فلا داعي لإنشاء هذا المعامل.

  3. استخرج أجزاء الكود ذات الصلة إلى هذا التابع واستبدلها باستدعاءات للتابع.

  4. تأكد من ترك علامة Foreign method (تابع خارجي) في التعليقات المرافقة للتابع مع نصيحة لنقل هذا التابع إلى فئة الأدوات إذا أصبح ذلك ممكناً لاحقاً. سيسهل هذا فهم سبب وجود هذا التابع في هذه الفئة بالتحديد لمن سيقوم بصيانة البرنامج في المستقبل.