web-dev-qa-db-ja.com

多数のフィールドを持つオブジェクトは分割する必要がありますか?

多くのフィールドを持つオブジェクトがある場合、それらをすべてフィールドとして持つか、論理グループを独自のオブジェクトとして見つけてそれらをフィールドにしようとする方が良いですか?

どちらがより大きな悪であるか、オブジェクト内のオブジェクト数が多すぎるか、オブジェクト内のフィールドが多すぎるかが原因だと思います。

より少ないオブジェクト、より多くのフィールド:

public class LotsOfFields Object {

    private Foo foo;
    private Bar bar;
    private Baz baz;
    private Dog dog;
    private Cat cat;
    private Goat goat;

    // Getters and setters...

}

より多くのオブジェクト、より少ないフィールド:

public class LessFields Object {

    private ClicheMetaSyntacticVariables vars;
    private Animals animals;

    // Getters and setters...

}

public class ClicheMetaSyntacticVariables {

    private Foo foo;
    private Bar bar;
    private Baz baz;

    // Getters and setters...

}

public class Animals {

    private Dog dog;
    private Cat cat;
    private Goat goat;

    // Getters and setters...

}

余談ですが、「より多くのオブジェクト」アプローチの方が優れている場合、クラスを元のクラスのメンバーとして持つ方がよいでしょう(他の場所で使用されることがないと仮定した場合)。

私の質問が重複していないことを擁護するために編集:これは、「クラスの目的は何ですか」よりも具体的な問題についてであり、私にはそれだけで十分です。続けて、私は本当により読みやすく/使いやすいクラスを作るものについてもっと話しています、しかしそれを指定しないのは責任があると思います。

9
Captain Man

どちらがより大きな悪であるか、オブジェクト内のオブジェクト数が多すぎるか、オブジェクト内のフィールドが多すぎるかが原因だと思います。

場合によります。

より大きな悪は、クラスが1つのことに対して多すぎること、または多すぎることを行うことです。

あなたの例では、互いに何の関係もない3つの異なるグループがあるようです。したがって、これらは同じクラスであってはなりません。しかし、すべてが非常に関連し、相互作用している場合、問題が少ないが同じクラスに存在します。

そして、それぞれの例は異なります。 「すべての場合にこれを行う」という普遍的なポリシーはありません。

基本的に、優れたデザインは、どのクラスにどのメンバーが参加するかを決定する必要があります。たとえば、最大5つのオブジェクト/クラスがあることを確認することに基づいてクラスを設計するべきではありません。

18
enderland

重要な数字は複雑さであり、純粋なオブジェクト/メンバー数ではありません。約20メンバーまでの単純なクラスを作成でき(ただし、実際には非常に臭いです)、5つだけの非常に複雑なクラスを作成できます。

とにかく、タイプ別にメンバーをグループ化するだけでは役に立ちません。質問は次のとおりです。どのメンバーが一緒に作業する必要がありますか?そして、どのサブサービスを提供できますか?これらの質問は重要です。なぜなら、小さなオブジェクトに、データメンバーのコンテナーだけでなく、それらを結合するクラス内の物事を実際に簡素化する優れた抽象化を提供したいからです。

foo.bar.bazはそれ自体がコードメルです!)

メンバーを別々のクラスに分けた場合、クラスは意味のある独立した作業を行っていますか?クラスが相互依存であり、他のメンバーにアクセスしないと何もできない場合は、クラスを分離することはおそらく悪い考えです。

一方、あるクラスが他のクラスのワークロードを有意に軽減できる場合、または他のクラスとは独立して使用できる場合は、それらを分離することを検討してください。

2
John Smith

いつものように、状況によります。なぜそれが間違っているのかわかりません。 Webサイトからデータを廃棄するプロジェクトで、それ以上のフィールドを持つクラスがあったので、1ページが1つのオブジェクトでした(大量のデータ+いくつかの計算値により、複数の実行にわたって処理を高速化しました)。彼らは互いに完全に関連していた。

1つのクラスに含まれるフィールドが互いにほとんど関係がない場合は、設計が悪いことを示している可能性があります。

確かに赤旗ですが、赤旗だけでは誰も殺しませんでしたよね?それが理にかなっているなら、それのために行きます。

0
Luke