Також відомий як Pull Up Constructor Body

Рефакторинг Підйом тіла конструктора

Проблема

Підкласи мають конструктори з переважно однаковим кодом.

Рішення

Створіть конструктор в суперкласі і винесіть в нього спільний для підкласів код. Викликайте конструктор суперкласу в конструкторах підкласу.
До
class Manager extends Employee {
  public Manager(String name, String id, int grade) {
    this.name = name;
    this.id = id;
    this.grade = grade;
  }
  //...
}
Після
class Manager extends Employee {
  public Manager(String name, String id, int grade) {
    super(name, id);
    this.grade = grade;
  }
  //...
}
До
public class Manager: Employee 
{
  public Manager(string name, string id, int grade) 
  {
    this.name = name;
    this.id = id;
    this.grade = grade;
  }
  //...
}
Після
public class Manager: Employee 
{
  public Manager(string name, string id, int grade): base(name, id)
  {
    this.grade = grade;
  }
  //...
}
До
class Manager extends Employee {
  public __construct($name, $id, $grade) {
    $this->name = $name;
    $this->id = $id;
    $this->grade = $grade;
  }
  ...
}
Після
class Manager extends Employee {
  public __construct($name, $id, $grade) {
    parent::__construct($name, $id);
    $this->grade = $grade;
  }
  ...
}
До
class Manager(Employee):
    def __init__(self, name, id, grade):
        self.name = name
        self.id = id
        self.grade = grade
    #...
Після
class Manager(Employee):
    def __init__(self, name, id, grade):
        Employee.__init__(name, id)
        self.grade = grade
    #...

Причини рефакторингу

Чим цей рефакторинг відрізняється від підйому методу?

  1. У Java підкласи не можуть наслідувати конструктор, тому ви не можете просто застосувати підйом методу до конструктора підкласу і видалити його після переміщення усього коду конструктора в суперклас. На додаток до створення конструктора в суперкласі треба буде мати конструктори в підкласах з простим делегуванням до конструктора суперкласу.

  2. В C++ і Java (у разі, якщо ви явно не викликали конструктор суперкласу) конструктор суперкласу автоматично викликається перед конструктором підкласу, що робить обов'язковим переміщення спільного коду тільки з початку конструкторів підкласів (оскільки ви не зможете викликати конструктор суперкласу в довільному місці конструктора підкласу).

  3. У більшості мов програмування конструктор підкласу може мати свій власний список параметрів, відмінний від параметрів суперкласу, тому ви повинні створити конструктор суперкласу тільки з тими параметрами, які йому дійсно потрібні.

Порядок рефакторингу

  1. Створіть конструктор в суперкласі.

  2. Витягніть спільний код з початку конструктора кожного з підкласів в конструктор суперкласу. Перед цією дією варто спробувати помістити якомога більше спільного коду в початок конструктора.

  3. Розташуйте виклик конструктора суперкласу першим рядком в конструкторах підкласів.

Замучились читати?

Збігайте за подушкою, в нас тут контенту приблизно на 7 годин читання.

Або спробуйте наш новий інтерактивний курс з рефакторингу. Він більш інформативний та набагато цікавіший за банальний тест.

Дізнатися більше...

Живий приклад

Перший раз у нас? Нічого страшного!

У нас тут все просто – цей інтерактивний приклад дуже схожий на відео (хоча й виглядає набагато крутіше).

  1. Натискаєте велику кнопку "Почати", а далі слідуєте усім підказкам.
  2. Ви можете перемотувати програвання, використовуючи стрілки зліва.
  3. Окрім того, ви можете подивитися різницю між стартовим та отриманим кодом, натиснувши кнопку ока ().
  4. Кнопка компіляції та тестування () дає змогу перевірити код на наявність помилок.