شعار ConstructiCat
CodeBust.
تصفح القسم ▾

استبدال الدالة بكائن دالة.

المشكلة

لديك دالة طويلة تتشابك فيها المتغيرات المحلية لدرجة أنه لا يمكنك تطبيق تقنية استخلاص الدالة (Extract Method).

الحل

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

##مثال

قبل
class Order {
  // ...
  public double price() {
    double primaryBasePrice;
    double secondaryBasePrice;
    double tertiaryBasePrice;
    // إجراء عملية حسابية طويلة.
    return 0;
  }
}
بعد
class Order {
  // ...
  public double price() {
    return new PriceCalculator(this).compute();
  }
}

class PriceCalculator {
  private double primaryBasePrice;
  private double secondaryBasePrice;
  private double tertiaryBasePrice;
  
  public PriceCalculator(Order order) {
    // نسخ المعلومات ذات الصلة من كائن الطلب (order).
  }
  
  public double compute() {
    // إجراء عملية حسابية طويلة.
    return 0;
  }
}

##لماذا نعيد الهيكلة

تكون الدالة طويلة جدًا ولا يمكنك فصلها بسبب التشابك المعقد للمتغيرات المحلية التي يصعب عزلها عن بعضها البعض.

الخطوة الأولى هي عزل الدالة بأكملها في فئة منفصلة وتحويل متغيراتها المحلية إلى حقول في الفئة.

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

##الفوائد

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

##كيفية إعادة الهيكلة

  1. أنشئ فئة جديدة. وقم بتسميتها بناءً على الغرض من الدالة التي تعيد هيكلتها.

  2. في الفئة الجديدة، قم بإنشاء حقل خاص (private field) لتخزين مرجع إلى مثيل من الفئة التي كانت الدالة تقع فيها سابقًا. يمكن استخدامه للحصول على بعض البيانات المطلوبة من الفئة الأصلية إذا لزم الأمر.

  3. قم بإنشاء حقل خاص منفصل لكل متغير محلي في الدالة.

  4. أنشئ بانيًا (constructor) يقبل معلمات تمثل قيم جميع المتغيرات المحلية للدالة ويقوم أيضًا بتهيئة الحقول الخاصة المقابلة.

  5. أعلن عن الدالة الرئيسية وانسخ كود الدالة الأصلية إليها، مع استبدال المتغيرات المحلية بالحقول الخاصة.

  6. استبدل جسم الدالة الأصلية في الفئة الأصلية عن طريق إنشاء كائن دالة واستدعاء دالته الرئيسية.