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

Приховання делегування

Також відомий як: Hide Delegate

Проблема

Клієнт отримує об’єкт B з поля або методу об’єкта А. Потім клієнт викликає якийсь метод об’єкта B.

Рішення

Створіть новий метод в класі А, який би делегував виклик об’єкта B. Таким чином, клієнт перестане знати про клас В і залежати від нього.

До
Hide Delegate - Before
Після
Hide Delegate - After

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

Спершу слід визначитися з назвами:

  • Сервер — це об’єкт, до якого клієнт має безпосередній доступ.

  • Делегат — це кінцевий об’єкт, який містить функціональність, потрібну клієнтові.

Ланцюжок викликів з’являється тоді, коли клієнт запитує з одного об’єкта інший, потім вже другий об’єкт запитує ще один і так далі. Такі послідовності викликів означають, що клієнт пов’язаний з навігацією по структурі класів. Будь-які зміни проміжних зв’язків означають необхідність модифікації клієнта.

Переваги

  • Приховує делегування від клієнта. Чим менше клієнтський код знає подробиць про зв’язки між об’єктами, тим простіше згодом вноситиме зміни в програму.

Недоліки

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

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

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

  2. Змініть код клієнта так, щоб він викликав методи класу-сервера.

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