Згортання ієрархії
Проблема
У вас є деяка ієрархія класів, в якій підклас мало чим відрізняється від суперкласу.
Рішення
Злийте підклас і суперклас воєдино.
Причини рефакторингу
Розвиток програми привів до того, що підклас і суперклас стали дуже мало відрізнятися один від одного. Якась фіча була прибрана з підкласу, якийсь метод «переїхав» в суперклас, і ось ви вже маєте два практично однакових класи.
Переваги
-
Зменшується складність програми. Менше класів, менше різних речей, які треба тримати в голові, менше «рухомих частин», менше ймовірність зламати щось при подальших змінах в коді.
-
Навігація за кодом стає простіша, коли методи визначені тільки в одному класі. Потрібний метод не доводиться шукати за усією ієрархією.
Коли не слід застосовувати
-
Якщо в ієрархії класів знаходиться більше одного підкласу, то після проведення рефакторингу, решта підкласів повинні стати спадкоємцями класу, в якому була об’єднана ієрархія.
-
Проте майте на увазі, що це може привести до порушення принципу підстановки Барбари Лісков. Наприклад, якщо в програмі емуляторі міського транспорту невірно згорнути суперклас
Транспорт
в підкласАвтомобіль
, класЛітак
може виявитися спадкоємцемАвтомобіля
, а це вже неправильно.
Порядок рефакторингу
-
Виберіть, який клас прибрати зручніше: суперклас або підклас.
-
Використайте підйом поля і підйом методу, якщо ви вирішили позбутися від підкласу. Використайте спуск поля і спуск методу, якщо прибраний буде суперклас.
-
Замініть усі використання класу, який буде видалений, класом, в який переїжджають поля і методи. Найчастіше це буде код створення класів, вказівки типів параметрів і змінних, а також документації в коментарях.
-
Видаліть порожній клас.