Логотип ConstructiCat
CodeBust.
Навигация по разделу ▾

Извлечение суперкласса.

Проблема

У вас есть два класса с общими полями и методами.

Решение

Создайте для них общий суперкласс и перенесите туда одинаковые поля и методы.

##Пример

До
class Employee {
  String name;
  double monthlyCost;
  double getAnnualCost() { return monthlyCost * 12; }
}
class Department {
  String name;
  double monthlyCost;
  double getAnnualCost() { return monthlyCost * 12; }
}
После
class Party {
  String name;
  double monthlyCost;
  double getAnnualCost() { return monthlyCost * 12; }
}
class Employee extends Party {}
class Department extends Party {}

##Зачем делать рефакторинг

Одним из видов дублирования кода является наличие двух классов, выполняющих сходные задачи одинаковым способом или сходные задачи разными способами. Объекты предоставляют встроенный механизм для упрощения такой ситуации с помощью наследования. Однако часто общность оказывается незамеченной до тех пор, пока не будут созданы какие-то классы, и тогда появляется необходимость создавать структуру наследования позднее.

##Преимущества

  • Убирает дублирование кода. Общие поля и методы теперь «живут» только в одном месте.

##Как делать рефакторинг

  1. Создайте абстрактный суперкласс.

  2. Используйте подъём поля, подъём метода и подъём тела конструктора для перемещения общей функциональности в суперкласс. Лучше начинать с полей, так как помимо общих полей, вам нужно будет перенести те из них, которые используются в общих методах.

  3. Стоит поискать места в клиентском коде, в которых можно заменить использование подклассов вашим общим классом (например, в объявлениях типов).