3.2 KiB
3.2 KiB
#рефакторинг #методы_рефакторинга
Проблема
Клиент получает объект B из поля или метода объекта А. Затем клиент вызывает какой-то метод объекта B.
manager = aPerson.department.manager;
Решение
Создайте новый метод в классе А, который бы делегировал вызов объекту B. Таким образом, клиент перестанет знать о классе В и зависеть от него.
manager = aPerson.manager;
class Person {
get manager() {return this.department.manager;}
}
Причины рефакторинга
Одним из ключей — если не единственным ключом — к хорошему модульному проекту является инкапсуляция. Инкапсуляция означает, что модули должны знать о других частях системы как можно меньше. Тогда, если что-то в программе меняется, об этом нужно рассказать только малому числу модулей, что облегчает внесение изменений.
Достоинства
- Скрывает делегирование от клиента. Чем меньше клиентский код знает подробностей о связях между объектами, тем проще будет впоследствии вносить изменения в программу.
Недостатки
- Если требуется создать слишком много делегирующих методов, класс-сервер рискует превратиться в лишнее промежуточное звено и привести к запаху Посредник.
Порядок рефакторинга
- Для каждого метода класса-делегата, вызываемого клиентом, нужно создать метод в классе-сервере, который бы делегировал вызов классу-делегату.
- Измените код клиента так, чтобы он вызывал методы класса-сервера.
- Если после всех изменений клиент больше не нуждается в классе-делегате, можно убрать метод доступа к классу-делегату из класса-сервера (тот метод, который использовался изначально для получения класса-делегата).
