Base/Knowledges/IT/Рефакторинг/Методы рефакторинга/Сокрытие делегата (Hide Delegate).md
2026-02-23 19:52:05 +03:00

3.2 KiB
Raw Permalink Blame History

#рефакторинг #методы_рефакторинга

!Pasted image 20250128083342.png

Проблема

Клиент получает объект B из поля или метода объекта А. Затем клиент вызывает какой-то метод объекта B.

manager = aPerson.department.manager;

Решение

Создайте новый метод в классе А, который бы делегировал вызов объекту B. Таким образом, клиент перестанет знать о классе В и зависеть от него.

manager = aPerson.manager;

class Person {
	get manager() {return this.department.manager;}
}

Причины рефакторинга

Одним из ключей — если не единственным ключом — к хорошему модульному проекту является инкапсуляция. Инкапсуляция означает, что модули должны знать о других частях системы как можно меньше. Тогда, если что-то в программе меняется, об этом нужно рассказать только малому числу модулей, что облегчает внесение изменений.

Достоинства

  • Скрывает делегирование от клиента. Чем меньше клиентский код знает подробностей о связях между объектами, тем проще будет впоследствии вносить изменения в программу.

Недостатки

  • Если требуется создать слишком много делегирующих методов, класс-сервер рискует превратиться в лишнее промежуточное звено и привести к запаху Посредник.

Порядок рефакторинга

  1. Для каждого метода класса-делегата, вызываемого клиентом, нужно создать метод в классе-сервере, который бы делегировал вызов классу-делегату.
  2. Измените код клиента так, чтобы он вызывал методы класса-сервера.
  3. Если после всех изменений клиент больше не нуждается в классе-делегате, можно убрать метод доступа к классу-делегату из класса-сервера (тот метод, который использовался изначально для получения класса-делегата).

Борется с запахом

Обратный рефакторинг

Ссылки