#рефакторинг #методы_рефакторинга ![[Pasted image 20250128083342.png]] ### **Проблема** Клиент получает объект B из поля или метода объекта А. Затем клиент вызывает какой-то метод объекта B. ```javascript manager = aPerson.department.manager; ``` ### **Решение** Создайте новый метод в классе А, который бы делегировал вызов объекту B. Таким образом, клиент перестанет знать о классе В и зависеть от него. ```javascript manager = aPerson.manager; class Person { get manager() {return this.department.manager;} } ``` ### **Причины рефакторинга** Одним из ключей — если не единственным ключом — к хорошему модульному проекту является инкапсуляция. Инкапсуляция означает, что модули должны знать о других частях системы как можно меньше. Тогда, если что-то в программе меняется, об этом нужно рассказать только малому числу модулей, что облегчает внесение изменений. ### **Достоинства** - Скрывает делегирование от клиента. Чем меньше клиентский код знает подробностей о связях между объектами, тем проще будет впоследствии вносить изменения в программу. ### **Недостатки** - Если требуется создать слишком много делегирующих методов, класс-сервер рискует превратиться в лишнее промежуточное звено и привести к запаху [[Посредник]]. ### **Порядок рефакторинга** 1. Для каждого метода класса-делегата, вызываемого клиентом, нужно создать метод в классе-сервере, который бы делегировал вызов классу-делегату. 2. Измените код клиента так, чтобы он вызывал методы класса-сервера. 3. Если после всех изменений клиент больше не нуждается в классе-делегате, можно убрать метод доступа к классу-делегату из класса-сервера (тот метод, который использовался изначально для получения класса-делегата). ### **Борется с запахом** - [[Цепочки сообщений]] - [[Неуместная близость]] ### **Обратный рефакторинг** - [[Удаление посредника (Remove Middle Man)]] ### **Ссылки** - https://refactoring.guru/ru/hide-delegate - [[Мартин Фаулер - Рефакторинг кода на JavaScript]]