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

49 lines
3.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#рефакторинг #методы_рефакторинга
![[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]]