2016-04-25 119 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