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

Подъём метода.

Проблема

Подклассы имеют методы, которые делают схожую работу.

Решение

В этом случае нужно сделать методы идентичными, а затем переместить их в суперкласс.

##Пример

До
class Employee {
  String name;
}
class Salesman extends Employee {
  String getName() { return name; }
}
class Engineer extends Employee {
  String getName() { return name; }
}
После
class Employee {
  String name;
  String getName() { return name; }
}
class Salesman extends Employee {}
class Engineer extends Employee {}

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

Подклассы развивались независимо друг от друга. Это привело к созданию одинаковых (или очень похожих) полей и методов.

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

  • Убирает дублирование кода. Если вам нужно внести изменения в метод, лучше сделать это в одном месте, чем искать все дубликаты этого метода в подклассах.

  • Также этот рефакторинг можно использовать и в случае, если подкласс зачем-то переопределяет метод суперкласса, но, по сути, делает ту же работу.

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

  1. Изучите похожие методы в подклассах. Если они не одинаковы, приведите их к одному виду.

  2. Если методы используют разный набор параметров, приведите эти параметры к тому виду, который вы хотите видеть в суперклассе.

  3. Скопируйте метод в суперкласс. Здесь вы можете столкнуться с тем, что код метода использует поля и методы, которые есть только в подклассах, а посему недоступны в суперклассе. Чтобы решить эту проблему, вам нужно:

  4. Удалите методы в подклассах.

  5. Проверьте места, в которых вызывается метод. Возможно, в некоторых из них использование подкласса можно заменить суперклассом.