SOに関するこの質問は、OPが機能en望のコードだと考えているものを修正することについて語っています。この気の利いたフレーズが引用されているのを私が見た別の例は、ここでprogrammers.SEで最近与えられた答えです。私はその答えにコメントを入れて情報を求めましたが、Q&Aを読んでプログラマがfeature-envyという用語の意味を理解することは一般的な助けになると思いました。適切と思われる場合は、追加のタグを自由に編集してください。
SOに関するこの質問は、OPが機能en望のコードだと考えているものを修正することについて語っています。この気の利いたフレーズが引用されているのを私が見た別の例は、ここでprogrammers.SEで最近与えられた答えです。私はその答えにコメントを入れて情報を求めましたが、Q&Aを読んでプログラマがfeature-envyという用語の意味を理解することは一般的な助けになると思いました。適切と思われる場合は、追加のタグを自由に編集してください。
回答:
機能en望とは、オブジェクト自体に計算を依頼するのではなく、あるオブジェクトが別のオブジェクトのフィールドに到達して何らかの計算を実行したり、決定を下したりする状況を表す用語です。
簡単な例として、長方形を表すクラスを考えてみましょう。長方形のユーザーは、その領域を知る必要があるかもしれません。プログラマはwidth
、height
フィールドを公開し、Rectangle
クラスの外部で計算を実行できます。または、とフィールドを非公開にしてメソッドを提供するRectangle
こともできます。これは間違いなくより良いアプローチです。width
height
getArea
最初の状況の問題、およびコードのにおいと見なされる理由は、カプセル化が破られるためです。
経験則として、他のクラスのフィールドを広範囲に使用して何らかのロジックや計算を実行する場合は、そのロジックをクラス自体のメソッドに移動することを検討してください。
別のクラス/構造体メソッドを広範囲に使用しても問題ない場合があります-クラス/構造体がデータのコンテナである場合。通常、外部コンテキストなしでこのデータを使用してできることはわずかです。
そのようなクラスはまだいくつかの内部ロジックを保持できますが、多くの場合、コンテナとして使用されます。
class YourUid {
public:
YourUid(int id_in_workplace_, int id_in_living_place_, DB* FBI_database, int id_in_FBI_database);
bool IsInvalidWorker() const { return id_in_workplace == consts::invalid_id_in_workplace; }
bool CanMessWith() const { return !FBI_database_.is_cool(id_in_FBI_database_); }
int id_in_workplace;
int id_in_living_place;
private:
int id_in_FBI_database_;
const DB* FBI_database_;
};
彼の答えの@jhewlettは、この記事を参照して、他のクラスメンバーを広範囲に使用してはならないことを証明していますが、別のコードには、私の例を支持する状況が記載されています:
長いパラメーターリスト。特定のメソッドに必要なパラメーターの数を制限するか、オブジェクトを使用してパラメーターを結合します。