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