Base/Knowledges/IT/Рефакторинг/Методы рефакторинга/Свертывание иерархии (Collapse Hierarchy).md
2026-02-23 19:52:05 +03:00

2.8 KiB
Raw Blame History

#рефакторинг #методы_рефакторинга

!Pasted image 20250219090442.png

Проблема

У вас есть некая иерархия классов, в которой подкласс мало чем отличается от суперкласса.

class Employee {...}
class Salesman extends Employee {...}

Решение

Слейте подкласс и суперкласс воедино.

class Employee {...}

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

Развитие программы привело к тому, что подкласс и суперкласс стали очень мало отличаться друг от друга. Какая-то фича была убрана из подкласса, какой-то метод «переехал» в суперкласс, и вот вы уже имеете два практически одинаковых класса.

Достоинства

  • Уменьшается сложность программы. Меньше классов, меньше вещей, которые нужно держать в голове, меньше «движущихся частей», меньше вероятность сломать что-то при последующих изменениях в коде.
  • Навигация по коду становится проще, когда методы определены только в одном классе. Нужный метод не приходится искать по всей иерархии.

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

  1. Выберите, какой класс убрать удобнее: суперкласс или подкласс.
  2. Используйте Подъем поля (Pull Up Field) и Подъем метода (Pull Up Method), если вы решили избавиться от подкласса. Используйте Опускание поля (Push Down Field) и Опускание метода (Push Down Method), если убран будет суперкласс.
  3. Замените все использования класса, который будет удалён, классом, в который переезжают поля и методы. Зачастую это будет код создания классов, указания типов параметров и переменных, а также документации в комментариях.
  4. Удалите пустой класс

Борется с запахом

Ссылки