Base/Knowledges/IT/Рефакторинг/Запахи кода/Цепочки сообщений.md
2026-02-23 19:52:05 +03:00

32 lines
2.7 KiB
Markdown
Raw 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 20241112230900.png]]
> Цепочки сообщений возникают, когда клиент запрашивает у одного объекта другой, у того клиент в свою очередь запрашивает еще один объект, у которого запрашивается еще один... и т. д. Это может выглядеть как длинный ряд методов типа `getThis` или как последовательность временных переменных. Такие после­довательности вызовов означают, что клиент связан со структурой классов, и лю­бые изменения промежуточных связей приводят к необходимости модификации клиента.
### **Признаки**
- Вы видите в коде цепочки вызовов вроде такой $a->b()->c()->d()
### **Причины появления**
Цепочка вызовов появляется тогда, когда клиент запрашивает у одного объекта другой, в свою очередь этот объект запрашивает ещё один и т. д. Такие последовательности вызовов означают, что клиент связан с навигацией по структуре классов. Любые изменения промежуточных связей означают необходимость модификации клиента.
![[Pasted image 20241112230908.png]]
### **Рефакторинги**
- [[Сокрытие делегата (Hide Delegate)]]
- [[Извлечение функции (Extract Function)]]
- [[Перенос функции (Move Function)]]
![[Pasted image 20241112230914.png]]
### **Результат**
- Может уменьшить связность между классами цепочки
- Может уменьшить размер кода
### **Не стоит трогать, если...**
- Если вы перестараетесь в процессе сокрытия делегирования, в коде будет довольно сложно понять, где именно осуществляется конкретная работа. Другими словами, появится запах **[[Посредник]]**
### **Ссылки**
- [https://refactoring.guru/ru/smells/message-chains](https://refactoring.guru/ru/smells/message-chains)
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]]