如何建模OO场景

时间:2012-12-31 07:26:55

标签: oop design-patterns

我经常遇到类似这样的情况:

为层次结构建模的容器业务类。

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

让我举个例子。

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

我正在研究的当前示例是针对我的大学的,每门课程都需要其他课程,也可以阻止下一级课程。专业是包含所有课程并指定哪个课程之前的课程。假设我想要添加一个课程的依赖关系,例如采取微积分2,你需要微积分1 ...我应该去calculus.addRequired(calculus2)然后将它传递给主要对象,或者computerScience.addRequired(calculus1, calculus2)。 ..

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

2 个答案:

答案 0 :(得分:2)

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

你可以拥有

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

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

第二似乎需要参考全球地图。首先让Map看起来像简单的外观。

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

我相信这些解决方案都不会更好或更糟。唯一的区别在于其他开发人员期望找到方法的位置。但是当我考虑它时,这意味着Map将承担Country的所有责任,从而打破SRP,特别是如果它不是对国家方法的调用。

答案 1 :(得分:1)

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

这种方式逻辑由各国维护,容器只需委托回答问题。

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