Глянь мой новый курс по Git! Привет! Глянь мой новый курс по Git! Привет! Глянь мой новый курс по Git на GitByBit.com! Привет! Хочешь круто подтянуть Git? Глянь мой новый курс на GitByBit.com!

Сокрытие делегирования

Также известен как: Hide Delegate

Проблема

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

Решение

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

До
Hide Delegate - Before
После
Hide Delegate - After

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

Для начала следует определиться с названиями:

  • Сервер — это объект, к которому клиент имеет непосредственный доступ.

  • Делегат — это конечный объект, который содержит функциональность, нужную клиенту.

Цепочка вызовов появляется тогда, когда клиент запрашивает у одного объекта другой, потом второй объект запрашивает еще один и т. д. Такие последовательности вызовов означают, что клиент связан с навигацией по структуре классов. Любые изменения промежуточных связей означают необходимость модификации клиента.

Достоинства

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

Недостатки

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

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

  1. Для каждого метода класса-делегата, вызываемого клиентом, нужно создать метод в классе-сервере, который бы делегировал вызов классу-делегату.

  2. Измените код клиента так, чтобы он вызывал методы класса-сервера.

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