2017-02-23 5 views
5

私のプロジェクトに取り組んでいて、たくさんのネストされたオブジェクトを使用しなければならなかったとき、インスタンス変数を設定するときにJavaの構造の設計が非常に不確かになりました上のオブジェクトから深くネストされたオブジェクトの私はおそらくJavaで構造化された設計の基本的な理解を欠場するように感じる。これについての洞察は高く評価されます。java design:サブオブジェクトの反復メソッド

私は変数としてネストされたサブオブジェクトを持つ論理構造を持っているとします。たとえば:

Country 
    Capital 
    Palace 
     King 

私は今、主被写体(国)からキングプライベート文字列変数「nameOfKing」を設定したい場合は、私は王のすべての上位クラス内のすべてのメソッドを定義する必要があります。したがって、このような何か:

public class Country { 
    private Capital capital; 

    public void setNameOfKing(String n) { 
     capital.setNameOfKing(n); 
    } 
} 

public class Capital{ 
    private Palace palace; 

    public void setNameOfKing(String n) { 
     palace.setNameOfKing(n); 
    } 
} 

public class Palace{ 
    private King king; 

    public void setNameOfKing(String n) { 
     king.setNameOfKing(n); 
    } 
} 

public class King{ 
    private String nameOfKing; 

    public void setNameOfKing(String n) { 
     this.nameOfKing = n; 
    } 
} 

を私はcountry.setNameOfKing(n);を呼び出すことができますように。今はいくつかの変数があればこれで問題はありませんが、King、Palace、Capitalクラスには他の多くの変数とメソッドが定義されていて、それらのすべてが国から呼び出されなければならない場合はどうなりますか?宮殿にも(今すぐ作っている)ThroneRoom、Treasury、Queenなどのような他のクラスオブジェクトが含まれているとしたらどうでしょうか?サブクラスのほぼすべてのメソッドでCountryクラスに存在する必要があります。潜在的には、情報をサブオブジェクトに渡すために膨大な量のメソッドを作成しなければならず、その結果、非常に大きなCountryクラスが生成される可能性があります。

私は、王が宮殿と首都の余分な方法をやめて、カントリーそのものにも定義できるとは技術的には言えると思いますが、それでもカントリークラスにメソッドが存在しなければならない場合、この構造は、一緒にグループ化された論理のように理にかなっていますが、これに対して最善のアプローチは何でしょうか?私は良い方法があるかどうかはわかりませんが、私はここで何か不足していると感じることができません。

+0

'getPalace()。setFoo()'はオプションではありませんか? –

+0

このようにCountryクラスのmethidを変更することを意味しますか? 'capital.getPalace()。setNameOfKing(n); 'カントリークラスに多量のメソッドが潜在的に存在する可能性があるという事実を変更します – lokipoki

答えて

4

これは責任の問題です。

自分自身に質問してください:"王は誰ですか?。あなたが宮殿のときは、あなたは王の責任ですか?明らかにそうではありません。王はあなたの宮殿によって管理されていませんが、法律によってあなたの国に縛られています。

palace.setNameOfKing()を照会することは、あなたの家に新生児に名前を付けるよう求めることと似ています。あなたの家にはこの責任がありません。それを許可するべきではありません。

適切な方法は、Kingインスタンスを取得し、その名前を直接設定することです。


は今、このアプローチに問題がある:あなたがKingインスタンスを見つけるために、多くのゲッターを使用する必要があります。しかし、クラスの機能的なアプローチでこの問題を解決できます。

palace.getOwner()OwnerKing implements Ownerで返すことができます。

他のクラスにも同じルールを適用できます。

+2

はい、それは責任の問題です。さらに進んでさらに王の名前を設定することも許可しません理論的にはパブリックセッターメソッドを提供することによってどこからでも。 –