سحب متن المُنشِئ لأعلى (Pull Up Constructor Body)

من موسوعة حسوب
< Refactoring
مراجعة 12:38، 17 فبراير 2019 بواسطة Khaled-yassin (نقاش | مساهمات) (أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: سحب متن المُنشِئ لأعلى (Pull Up Constructor Body)}}</noinclude> == المشكلة == تحتوي الأصناف الفرع...')
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)
اذهب إلى التنقل اذهب إلى البحث

المشكلة

تحتوي الأصناف الفرعية على مُنشِئات لها شيفرة متطابقة في أغلبها.

الحل

إنشاء مُنشئ صنف فائق ونقل الشيفرة المماثلة في الأصناف الفرعية إليه. استدعاء مُنشئ الصنف الفائق في مُنشِئات الصنف الفرعي.

مثال

قبل إعادة التصميم

في لغة Java:

class Manager extends Employee {
  public Manager(String name, String id, int grade) {
    this.name = name;
    this.id = id;
    this.grade = grade;
  }
  //...
}

في لغة C#‎:

public class Manager: Employee 
{
  public Manager(string name, string id, int grade) 
  {
    this.name = name;
    this.id = id;
    this.grade = grade;
  }
  //...
}

في لغة PHP:

class Manager extends Employee {
  public function __construct($name, $id, $grade) {
    $this->name = $name;
    $this->id = $id;
    $this->grade = $grade;
  }
  // ...
}

في لغة Python:

class Manager(Employee):
    def __init__(self, name, id, grade):
        self.name = name
        self.id = id
        self.grade = grade
    #...

بعد إعادة التصميم

في لغة Java:

class Manager extends Employee {
  public Manager(String name, String id, int grade) {
    super(name, id);
    this.grade = grade;
  }
  //...
}

في لغة C#‎:

public class Manager: Employee 
{
  public Manager(string name, string id, int grade): base(name, id)
  {
    this.grade = grade;
  }
  //...
}

في لغة PHP:

class Manager extends Employee {
  public function __construct($name, $id, $grade) {
    parent::__construct($name, $id);
    $this->grade = $grade;
  }
  // ...
}

في لغة Python:

class Manager(Employee):
    def __init__(self, name, id, grade):
        Employee.__init__(name, id)
        self.grade = grade
    #...

لم إعادة التصميم؟

كيف تختلف تقنية إعادة التصميم هذه عن سحب التابع لأعلى؟

  1. في جافا، لا يمكن أن ترث الأصنافُ الفرعية منشئ لذا لا يمكنك ببساطة تطبيق سحب التابع لأعلى إلى منشئ صنف فرعي وحذفه بعد إزالة جميع شيفرة المُنشِئ إلى الصنف الفائق. بالإضافة إلى إنشاء مُنشئ في الصنف الفائق، من الضروري أن يكون هناك مُنشِئات في الأصناف الفرعية مع تفويض بسيط إلى مُنشِئ الصنف الفائق.
  2. في C++‎ و Java (إذا أنت لم تستدعي منشئ الصنف الفائق صراحةً) يُستدعى منشئ الصنف الفائق تلقائيًا قبل منشئ الصنف الفرعي، مما يجعل من الضروري نقل الشيفرة المشتركة فقط من بداية مُنشِئات الصنف الفرعي (بما أنك لن تكون قادرًا على استدعاء منشِئ الصنف الفائق من أي مكان عشوائي في منشِئ الصنف الفرعي).
  3. في معظم لغات البرمجة، يمكن أن يكون لمنشئ صنف فرعي قائمته الخاصة من المعاملات المختلفة عن معاملات الصنف الفائق. لذلك يجب إنشاء مُنشئ الصنف الفائق فقط مع المعاملات التي يحتاجها حقا.

آلية الحل

  1. أنشئ مُنشئ في الصنف الفائق.
  2. استخرج الشيفرة المشتركة من بداية منشئ كل صنفٍ فرعي إلى منشئ الصنف الفائق. قبل القيام بذلك، حاول نقل أكبر قدر ممكن من الشيفرة الشائعة إلى بداية المُنشئ.
  3. ضع استدعاء مُنشئ الصنف الفائق في السطر الأول في مُنشئات الصنف الفرعي.

انظر أيضًا

مصادر