4.2 KiB
#рефакторинг #методы_рефакторинга
Проблема
У вас есть подклассы, которые отличаются только методами, возвращающими данные-константы.
class Person {
get genderCode() {return “X”;}
}
class Male extends Person {
get genderCode() {return “M”;}
}
class Female extends Person {
get genderCode() {return “F”;}
}
Решение
Замените методы полями в родительском классе и удалите подклассы.
class Person {
get genderCode() {return this._genderCode;}
}
Причины рефакторинга
Бывает так, что вам нужно развернуть действие рефакторинга избавления от кодирования типа.
В одном из подобных случаев иерархия подклассов может отличаться только значениями, возвращаемыми определёнными методами. Причём эти значения не являются результатом вычисления, а жёстко прописаны либо в самих методах, либо в полях, возвращаемых методами. Чтобы упростить архитектуру классов, такая иерархия может быть свёрнута в один класс, содержащий одно или несколько полей с нужными значениями в зависимости от ситуации.
Нужда в этих изменениях могла возникнуть после перемещения большого числа функциональностей из иерархии классов куда-то в другое место. После этого текущая иерархия потеряла свою ценность, и подклассы стали создавать только избыточную сложность.
Достоинства
Упрощает архитектуру системы. Создание подклассов — слишком избыточное решение, если все, что нужно сделать, это возвращать разные значения в нескольких методах
Порядок рефакторинга
- Примените к подклассам замену конструктора фабричным методом.
- Замените вызовы конструкторов подклассов вызовами фабричного метода суперкласса
- Объявите в суперклассе поля для хранения значений каждого из методов подклассов, возвращающих константные значения
- Создайте защищённый конструктор суперкласса для инициализации новых полей
- Создайте или модифицируйте имеющиеся конструкторы подклассов, чтобы они вызывали новый конструктор родительского класса и передавали в него соответствующие значения
- Реализуйте каждый константный метод в родительском классе так, чтобы он возвращал значение соответствующего поля, а затем удалите метод из подкласса
- Если конструктор подкласса имеет какую-то дополнительную функциональность, примените встраивание метода для встраивания его конструктора в фабричный метод суперкласса
- Удалите подкласс
