2016-05-29 7 views
2

クラス内にオブジェクトのコレクションがある場合。そして、そのコレクションにいくつかのオブジェクトを追加したいとします。どちらの方がより正確ですか?オブジェクトコンポジションで新しいインスタンスを作成する際の責任

この方法:

public class Test { 

    public static void main (String args []){ 
     A aIntance = A(); 
     B bIntance =B(); 
     String rawData = "id=123,name=Bdude"; 
     String id,name; 
     //do something to get the id and name from rawData... 
     //done. 
     //now we just make the object. 
     bIntance = new B(id,name); 
     aIntance.addB(bIntance); //A JUST add the object to his collection. 
    } 
} 
class A{ 
    private List<B> b_list; 
    public void addB(B bIntance){ 
     b_list.add(bIntance); 
    } 
} 

class B{ 
    private String id; 
    private String name; 
} 

またはこの1:最初に

public class Test { 
    public static void main (String args []){ 
     A aIntance = A(); 
     aIntance.addB("id= 123,name=I'm B"); //A do the job of create the B object. 
    } 
} 
class A{ 
    private List<B> b_list; 
    public void addB(String rawData){ 
     String id,name; 
     //do something to get the id and name from rawData... 
     //done. 
     //now we just make the object. 
     B myB = new B(id,name); 
     b_list.add(myB); 
    } 
} 

class B{ 
    private String id; 
    private String name; 
} 

  • Bクラス定義が変更された場合、あなたは変更する必要はありませんaddBメソッドをAから削除します。ただし、複数のオブジェクトを同時に追加する場合は、問題を自分で処理する必要があります。二一

  • クライアントA、およびAに必要な情報(生データ)を得るには、オブジェクトを作るの仕事をしてuはちょうど渡す「addMultipleB」メソッドを持つことができます「rawData」を持つ文字列の配列しかし、これにより、Aはエラーの影響を受けやすくなり(Rawdataが正しくない場合)、Bの変更が壊れやすくなります。

したがって、どのOOオプションが正しく選択されていますか?

+1

サイドノート:あなたのBクラスには妥当なequals()/ hashCode()メソッド実装がありません。リストには関係ありませんが、比較のためにBオブジェクトを使用し始めると(例えばマップ/セットに配置するときなど)、予期せぬことが起こり始めるでしょう。 – GhostCat

+0

@Jägermeister私は気付かなかった、ありがとう! – exsnake

+0

もう1つは、Bを不変にすることです。意味:フィールドを最終的にする。コンストラクタを介してのみ設定することができます。 – GhostCat

答えて

2

このような幅広い質問で頻繁に使用されるように、答えは次のとおりです。

場合:あなたのクラスBは、あなただけの、そのクラスA内に使用する内部の何かが、ある、または多分小型パッケージでいくつかのクラスの中に、あなたは

しかし、一般的にはオプション2に行くかもしれませんオプション1が優先されます。Bクラスを使用して「Bオブジェクト」を表現するモデルを作成する場合は... すべてはBオブジェクトを使用する必要があります。ポイントは:あなたのBクラスは抽象を追加します。これは今ではありませんが、int/stringの組み合わせだけではありません。意味:あなたの「B関連」データの一部は真のBオブジェクトとして存在するのに対し、他のものは「生の文字列」としてぶら下がっているかもしれないというのは悪い考えです。

最後に、SOLIDの原則に留意してください。最初のもの(単一責任の原則)は、生の文字列をBに変換し、Bsを格納するという意味で、おそらく異なる責任であるというヒントを与えます。たぶん別のクラスに入るはずです。

1

メインメソッド(Testクラス)でBインスタンスを使用する必要はないと思うなら、2番目のアプローチはもっとクリーンで読みやすいですが、将来的に必要になると思います"Test"クラスでBインスタンスを使用すると、Bインスタンスをよりよくインスタンス化できます。

2

私は関数の名前が第2のケースでは誤解を招くことがあります。それは次のようなものでなければなりません:createAndAddNewBInstance。また、2番目のアプローチでは、クラスBの実装に応じてAクラスを作成します。

あなたはAインスタンスにrawDataと参照を取るBクラスでstatic関数を作成する方が合理的であるこの2つのクラス間の接続を作成したい場合は、新しいBインスタンスを作成し、addB経由Aに追加します。B

class B { 
    static void createNewInstanceAndAddToA(String rawData, A aInstance){...} 
    ... 
} 

この方法で、あなたの実装の詳細はBクラスの範囲内です。また、AからaddBinterfaceを抽出して、それをさらにSOLIDにすることもできます。

関連する問題