3.7 KiB
3.7 KiB
#рефакторинг #методы_рефакторинга
Проблема
Подклассы имеют методы, которые делают схожую работу
class Employee {. . .}
class Salesman extends Employee {
get name() {.♦.}
}
class Engineer extends Employee {
get name() {...}
}
Решение
В этом случае нужно сделать методы идентичными, а затем переместить их в суперкласс.
class Employee {
get name() (...)
}
class Salesman extends Employee {...}
class Engineer extends Employee {...}
Причины рефакторинга
Подклассы развивались независимо друг от друга. Это привело к созданию одинаковых (или очень похожих) полей и методов.
Достоинства
- Убирает дублирование кода. Если вам нужно внести изменения в метод, лучше сделать это в одном месте, чем искать все дубликаты этого метода в подклассах.
- Также этот рефакторинг можно использовать и в случае, если подкласс зачем-то переопределяет метод суперкласса, но, по сути, делает ту же работу.
Порядок рефакторинга
- Обследовать похожие методы в суперклассах. Если они не одинаковы, привести их к одному и тому же виду.
- Если методы используют разный набор параметров, привести эти параметры к тому виду, который вы хотите видеть в суперклассе.
- Скопируйте метод в суперкласс. Здесь вы можете столкнуться с тем, что код метода использует поля и методы, которые есть только в подклассах, а посему недоступны в суперклассе. Чтобы решить эту проблему, вам нужно:
- Для полей: либо Подъем поля (Pull Up Field), либо используйте самоинкапсуляцию поля для создания геттеров и сеттеров в подклассах, а затем объявите эти геттеры абстрактным методом в суперклассе.
- Для методов: либо поднимите нужные методы в суперкласс, либо объявите для них абстрактные методы в суперклассе (обратите внимание, ваш класс станет абстрактным, если не был таким до этого).
- Удалите методы в подклассах
- Проверьте места, в которых вызывается метод. Возможно, в некоторых из них использование подкласса можно заменить суперклассом
