2016-04-25 114 views
2

我有以下Class方案。實施封裝的正確方法

enter image description here

NationalArrayListZoneZone一個的RegionRegionArrayListPersonArrayList

所以我要下一個問題:

1)我能「推」一個人低谷的國家和區域,將其添加在區域?

例如:

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)上搜索適合此問題的網站 – 2016-04-25 02:56:00

+1

@ProgyadeepMoulik我相信這是主題。 –

+0

@ProgyadeepMoulik爲什麼不是地方?我還有什麼地方可以問我的先生封裝? – exsnake

回答

1

鑑於你的類圖,一個Person必須始終是一個Region的成員,即NationalZone不能直接包含不包含在其下一個RegionPerson對象。

在這種情況下,匹配簽名addPerson(Person p)的方法只能發生在Region中。正如你所指出的,那麼你就必須做

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

沒有合乎邏輯的理由有,比方說,

National#addPerson(Person p) 

因爲National有哪些ZoneRegion的人不屬於任何信息。

但是,您可以添加便利方法到NationalZone,就像您所說的那樣,「推」一個人,但只有當您提供必要的數據時。

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

對於ZoneId和你使用任何密鑰類型來查找一個National內的區域和區域RegionId替代品。

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

如上述RegionId

這只是一個開始,您必須考慮問題,例如在addPerson(...)調用中找不到ZoneId和/或RegionId時會發生什麼情況。在這種設計中,唯一可行的選擇是拋出異常,因爲您沒有足夠的信息來實例化ZoneRegion

編輯:

如果你在一個評論指出,Person對象包含足夠的信息來識別ZoneRegion,然後在NationalZone您方便的方法可以做必要的查詢和委託下一個addPerson(Person p)在鏈中。

+0

我錯過了一個重要的事情,Person類,有關於他所屬的區域和區域的信息,在這種情況下,National#addPerson(Person p)是否有效? 。也可以是一個人也是Zone和National的會員(也作爲Collection)嗎? (所以每個人都必須加入國家,區域和地區)這是否打破了面向對象的範式? – exsnake

+0

是的,請參閱我的編輯。 –

+0

好的,謝謝!另外,我的帖子的另一部分。鏈中每個級別的下一個方法是有效的?或者必須爲該類實際上具有Person類的委託? – exsnake