2.9 KiB
2.9 KiB
#рефакторинг #методы_рефакторинга
Проблема
У вас есть два класса с общими полями и методами.
class Department {
get totalAnnualCost() {...}
get name() {...}
get headCount() {...}
}
class Employee {
get annualCost() {...}
get name() {...}
get id() {...}
}
Решение
Создайте для них общий суперкласс и перенесите туда одинаковые поля и методы.
class Party {
get name() {...}
get annualCost() {...}
}
class Department extends Party {
get annualCost() {...}
get headCount() {...}
}
class Employee extends Party {
get annualCost() {...}
get id() {...}
}
Причины рефакторинга
Одним из видов дублирования кода является наличие двух классов, выполняющих сходные задачи одинаковым способом или сходные задачи разными способами. Объекты предоставляют встроенный механизм для упрощения такой ситуации с помощью наследования. Однако часто общность оказывается незамеченной до тех пор, пока не будут созданы какие-то классы, и тогда появляется необходимость создавать структуру наследования позднее.
Достоинства
- Убирает дублирование кода. Общие поля и методы теперь «живут» только в одном месте.
Порядок рефакторинга
- Создайте абстрактный суперкласс
- Используйте Подъем поля (Pull Up Field), Подъем метода (Pull Up Method) и Подъем тела конструктора (Pull Up Constructor Body) для перемещения общей функциональности в суперкласс. Лучше начинать с полей, так как помимо общих полей, вам нужно будет перенести те из них, которые используются в общих методах.
- Стоит поискать места в клиентском коде, в которых можно заменить использование подклассов вашим общим классом (например, в объявлениях типов).
