0

我经常遇到类似这样的场景:

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

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

让我给你举个例子。

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

我正在研究的当前示例是针对我的大学的,每门课程都需要其他课程,并且还会阻止下一级课程。专业是包含所有课程并规定哪一门课程先于哪一门课程的专业。假设我想增加一门课程对另一门课程的依赖,例如,要学习微积分 2,你需要微积分 1……我应该去calculus.addRequired(calculus2)然后将它传递给主要对象,或者也许computerScience.addRequired(calculus1, calculus2)……

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

4

2 回答 2

2

第一件事是,互相打电话没有问题。

你可以有

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

或者

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

其次似乎需要参考全球地图。首先使 Map 看起来像简单的外观。

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

我相信这两种解决方案都没有更好或更坏。唯一不同的是其他开发人员期望方法位于何处。但是当我想到它时,这将意味着 Map 将承担 Country 的所有责任,从而破坏 SRP,特别是如果它不是对 country 方法的调用。

于 2012-12-31T07:39:42.060 回答
1

我会将isNeighbour()方法放入Country. Country将包含邻居地图。然后容器可以在相关国家实例上调用此方法。

这样逻辑由国家维护,容器简单地委托给他们回答问题。

在课程的情况下,专业 1 中的课程 2 可能需要课程 1,但专业 2 中不需要。在这种情况下,我将介绍另一个类,例如 CourseInMajor,它将包含给定专业中给定课程的必修课程。

于 2012-12-31T08:08:48.110 回答