Feature Envy
兆候と症状 自クラス内のデータよりも、別オブジェクトのデータに頻繁にアクセスするメソッド。
問題の理由 このCode Smellは、フィールドがデータクラスに移動された後に発生する場合があります。この場合、データの操作もこのクラスに移動できます。
対処 基本的なルールとして、同時に変化するようなものは同じ場所に保管する必要があります。通常、データとこのデータを使用する機能は一緒に変更されます(ただし、例外はあります)。
- メソッドを明らかに別の場所に移動する必要がある場合は、「Move Method」を使用します。
- メソッドの一部のみが別オブジェクトのデータにアクセスする場合、「Extract Method」を使用して問題の部分を移動します。
- メソッドが他のいくつかのクラスの機能を使用する場合、まず、最も頻繁に使用するデータがどのクラスのものなのかを判別します。次に、判別したクラスにそのメソッドを移動します。または、「Extract Method」を使用して、メソッドを複数の部分に分割し、異なるクラスの異なる場所に配置します。
効果
- 重複コードの削減(データを操作するコードが適切な場所に配置されていれば)
- コード構成の改善(データを処理するメソッドがデータの近くに配置されていれば)
When to Ignore 動作は、データを保持するクラスとそれに関連する振る舞いを意図的に分離している場合があります。こうすることで、動作を動的に変更できるという利点が得られます。 詳細はStrategy Design PatternやVisitor Design Pattern、および他のデザインパターンを参照してください。
書籍としてはこの辺りが参考になると思います。
リファクタリング第2版
レガシーコード改善ガイド
