#рефакторинг #запахи_кода ![[Pasted image 20241112224937.png]] > Когда мы делим программы на модули, мы пытаемся разделить код на такие зоны, чтобы максимизировать взаимодействие внутри зоны и минимизировать взаимодействие между зонами. Классический пример — когда функция в одном модуле тратит больше времени на общение с функциями или данными внутри другого модуля, чем в своем собственном. > Функция четко хочет быть поближе к данным. ### **Признаки** - Метод обращается к данным другого объекта чаще, чем к собственным данным ### **Причины появления** - После перемещения каких-то полей в класс данных. В этом случае операции с данными, возможно, также следует переместить в этот класс. ![[Pasted image 20241112224947.png]] ### **Рефакторинги** То, что изменяется одновременно, нужно хранить в одном месте. Обычно данные и функции, использующие эти данные, также изменяются вместе (хотя бывают исключения). - [[Перенос функции (Move Function)]] - [[Извлечение функции (Extract Function)]] - [[Перенос функции (Move Function)]] ![[Pasted image 20241112224955.png]] ### **Результат** - Уменьшение дублирования кода (если код работы с данными переехал в одно общее место) - Улучшение организации кода (так как методы работы с данными находятся возле этих данных) ### **Не стоит трогать, если...** - Бывают случаи, когда поведение намеренно отделяется от класса, содержащего данные. Чаще всего это делают для того, чтобы иметь возможность динамически менять это поведение (паттерны **[[Стратегия]]**, **[[Посетитель]]** и т. д.). ### **Ссылки** - [https://refactoring.guru/ru/smells/feature-envy](https://refactoring.guru/ru/smells/feature-envy) - [[Мартин Фаулер - Рефакторинг кода на JavaScript]]