Завистливые функции
Симптомы и признаки
Метод обращается к данным другого объекта чаще, чем к собственным данным.
![](/images/refactoring/content/smells/feature-envy-01.png?id=f520a24562e3f4b7848eca94792c329f)
Причины появления
Этот запах может появиться после перемещения каких-то полей в класс данных. В этом случае операции с данными, возможно, также следует переместить в этот класс.
Лечение
Следует придерживаться такого правила: то, что изменяется одновременно, нужно хранить в одном месте. Обычно данные и функции, использующие эти данные, также изменяются вместе (хотя бывают исключения).
-
Если метод явно следует перенести в другое место, примените перемещение метода.
-
Если только часть метода обращается к данным другого объекта, примените извлечение метода к этой части.
-
Если метод использует функции нескольких других классов, нужно сначала определить, в каком классе находится больше всего используемых данных. Затем следует переместить метод в этот класс вместе с остальными данными. Как альтернатива, с помощью извлечения метода метод разбивается на несколько частей, и они помещаются в разные места в других классах.
![](/images/refactoring/content/smells/feature-envy-02.png?id=a90a3545498c7c22e605ceeb1f23d005)
Выигрыш
-
Уменьшение дублирования кода (если код работы с данными переехал в одно общее место).
-
Улучшение организации кода (так как методы работы с данными находятся возле этих данных).
![](/images/refactoring/content/smells/feature-envy-03.png?id=ea63eeab9eda1910348d0930c8592780)
Не стоит трогать, если...
- Бывают случаи, когда поведение намеренно отделяется от класса, содержащего данные. Чаще всего это делают для того, чтобы иметь возможность динамически менять это поведение (паттерны Стратегия, Посетитель и т. д.).