2012-12-31 40 views
0

我反复遇到类似这样的场景模式:如何OO场景

一个集装箱业务类模型的层次结构。

参与此层次结构并由上述类聚合的业务类。

让我给你举个例子。

A Map有国家。现在Map应该知道每个Country在哪里,因为除了包含所有国家之外它的主要责任是知道每个国家的位置和邻近。从这个角度来看,功能如isNeighbour(Country A, Country B)似乎是Map的正确补充。但是,每个国家还应该提供一种方法来了解一个国家是否在附近。说spain.isNeighbour(italy)。这确实有用。现在,如果我不想重复功能和责任性,我应该采取什么方法?

我正在学习的当前例子对于我的大学来说很重要,每门课程都需要其他课程,并且会阻止下一个课程。专业是包含所有课程和决定哪个课程在哪个课程之前的课程。说我要添加课程在彼此的依赖,例如,参加微积分2,你需要微积分1 ...我应该去calculus.addRequired(calculus2),然后将它传递给主要对象,或者也许computerScience.addRequired(calculus1, calculus2) ...

我不我不想有两种选择,因为对我来说,它似乎会导致错误,但同时我希望每门课程都能够回答它的要求。我真的不知道如何正确分配责任。

+0

这是绑定到数据持久性/数据库还是全部在内存中? – Euphoric

+0

坚持持久。 – arg20

回答

2

首先是,互相呼叫没有问题。

你可以有

boolean Map.isNeighbour(Country A, Country B) { return A.isNeighbour(B); } 

boolean Country.isNeighbour(Country other) { return map.isNeighbour(this, other); } 

二似乎需要参照世界地图。首先使地图看起来像简单的外观。

第二件事是你说它被坚持。创建一个服务也可能是个好主意,它将使用相关参数查询DB。这可以是Map或某个存储库服务。这也可以让你查询实体的唯一身份(例如countryId)而不是完整的对象。

我相信这两种解决方案都不会更好或更糟。只有不同点是其他开发人员期望定位方法的地方。但是当我思考这个问题时,这意味着Map将承担国家的所有责任,从而打破SRP,特别是如果它不是通过国家的方法。

1

我会把isNeighbour()方法写入CountryCountry将包含邻居的地图。然后容器可以在相关的国家/地区实例上调用此方法。

这种方式的逻辑由各国维护,容器只是代表向他们回答问题。

在课程的情况下,在Major-1中可能需要Course-1,而不是Major-2。在这种情况下,我会引入另一个课程,例如CourseInMajor包含给定专业中给定课程所需的课程。