Также известен как Collapse Hierarchy

Рефакторинг Свёртывание иерархии

Проблема

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

Решение

Слейте подкласс и суперкласс воедино.
До
Collapse Hierarchy - Before
После
Collapse Hierarchy - After

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

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

Достоинства

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

  • Навигация по коду становится проще, когда методы определены только в одном классе. Нужный метод не приходится искать по всей иерархии.

Когда нельзя применить

  • Если в иерархии классов находится больше одного подкласса, то после проведения рефакторинга, оставшиеся подклассы должны стать наследниками класса, в котором была объединена иерархия.

  • Однако имейте в виду, что это может привести к нарушению принципа подстановки Барбары Лисков. Например, если в программе эмуляторе городского транспорта неверно свернуть суперкласс Транспорт в подкласс Автомобиль, класс Самолёт может оказаться наследником Автомобиля, а это уже неправильно.

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

  1. Выберите, какой класс убрать удобнее: суперкласс или подкласс.

  2. Используйте «подъём поля» (Pull up field) и «подъём метода» (Pull up method), если вы решили избавиться от подкласса. Используйте «спуск поля» (Push down field) и «спуск метода» (Push down method), если убран будет суперкласс.

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

  4. Удалите пустой класс.

Устали читать?

Сбегайте за подушкой, у нас тут контента на 7 часов чтения.

Или попробуйте наш новый интерактивный курс по рефакторингу. Он более информативный и гораздо более интересный, чем банальный текст.

Узнать больше...