2016-04-25 9 views
2

私は以下のクラススキームを持っています。カプセル化を実装する正しい方法

enter image description here

NationalRegionRegionArrayListPersonArrayListを持ってZoneZoneArrayListを持っています。

だから私は、次の質問があります。

1)I「プッシュ」人は地域でそれを追加するために、国や地域の谷できますか?例えば

National national = new National(); 
.... 
national.addPerson(person); // Every level has his own addPerson method 

または

national.getZone(i).getRegion(i).addPerson(person); 

OOPでこれを行うには正しい方法は何ですか?

2)レベルごとにすべての人を返す方法を作ることはできますか?

私は、例えば意味:

Zone zone = new Zone(); 
... 
zone.getPersons(); //Return a ArrayList with the persons of every Region in Zone. 

これは、カプセル化に反しますか?

3)すべてのレベルでnext()、hasNext()、first()メソッドがあるので、その特定のレベルで繰り返し処理できます。

それだけです。私は一般的にカプセル化とOOPを取得しますが、何が正しいのか、何が間違っているのか理解できません。

ありがとうございました。あなたのクラス図を考える

+0

**スタックオーバーフロー**はこの質問の場所ではありません。この質問に適したサイトを[Stack Exchange Network](http://stackexchange.com/sites) –

+1

@ProgyadeepMoulikで検索してください。 –

+0

@ProgyadeepMoulikなぜ場所ではないのですか?他にカプセル化について私の先生に聞くことができますか? – exsnake

答えて

1

Personは常につまり、NationalまたはZoneが直接その下にRegionに含まれていないPersonオブジェクトを含めることはできません、Regionのメンバーである必要があります。

この場合、署名addPerson(Person p)に一致するメソッドは、Regionでのみ発生する可能性があります。あなたが示したように、あなたは

national.getZone(i).getRegion(j).addPerson(person); 

をしなければならないでしょうNationalは、人が属するZoneRegionに何の情報も持っていないので、持っている論理的な理由、たとえば、

National#addPerson(Person p) 

はありません。

ただし、便利なメソッドをNationalZoneに追加すると、その人物を「プッシュ」することができますが、必要なデータを提供した場合にのみ、人を押し込むことができます。 ZoneIdについては

National#addPerson(ZoneId zid, RegionId rid, person) { ... 

、あなたがNational内のゾーンと地域をルックアップするために使用するキーのどんなタイプRegionId代用。

Zone#AddPerson(RegionId rid, person) { ... 

RegionIdと同様です。

これはほんの始まりです。コールでZoneIdおよび/またはRegionIdが見つからない場合の問題を考えなければなりません。このデザインでは、ZoneまたはRegionをインスタンス化するのに十分な情報がその時点でないため、実行可能な唯一のオプションが例外をスローしています。

EDIT:

あなたがコメントで示されているように、PersonオブジェクトがZoneRegionを識別するのに十分な情報が含まれている場合、NationalZoneであなたの便利なメソッドは、次のaddPerson(Person p)に必要な検索と、デリゲートを行うことができますチェーン内にある。

+0

私は1つの重要なこと、Personクラス、彼が所属する地域とゾーンについての情報を持っています。その場合、National#addPerson(Person p)は有効ですか? 。また、人はゾーンやナショナルのメンバー(コレクションとしても)ですか? (だからすべての人が国、ゾーン、地域に追加されなければならない)これはとにかくOOPのパラダイムを打ち破ってしまうのだろうか? – exsnake

+0

はい、私の編集を参照してください。 –

+0

ありがとう、ありがとう!また、私のポストの他の部分。チェーン内の各レベルの次のメソッドは有効ですか?実際にPersonクラスを持っているクラスを代理する必要がありますか? – exsnake

関連する問題