DDD实体隐藏在我的DDD值对象中吗?

时间:2016-07-27 12:31:02

标签: java domain-driven-design software-design

在我的家庭项目中,我遇到了确定域对象类型的问题。

域名:公交车时刻表

有界上下文:路由(公共交通基础设施,ctx1),时间表(调度,ctx2)

物件:

  • Station - 描述公交车站

  • 路线(ctx1) - 一组车站(路线路点)

  • Line(ctx1) - 描述总线。包含列表。

  • 时间表(ctx2) - 离开路线的航路点的一组命名。

例如:公交线路25A有两条路由[{st1,st3,st20},{st20,st15,st3,st1}]和附加到这两条路线的2个时间表(时间表1 - 路线1,sch2-r2)路由。

毫无疑问,我将 Line City 确定为DDD实体,聚合根。此外,我决定将Routes放入Line中,因为它们在Line和他们的生命周期== Line的生命周期之外没有任何意义。看起来还不错。

下一步是定义计划域对象。我想将它与公共交通基础设施分开,所以我把它作为一个实体放在另一个环境中。问题是现在我需要将它附加到没有标识符的路由上。

我的想法:

  • 将计划放入路线。为什么它不是一个选择:线变胖;创建了一个ctx1和ctx2

  • 的超级文本
  • 使路线成为实体。为什么它不是一个选项(我认为......):虽然不难想象带有一些标识符的路线(例如名称),但是想象一条公交线路以外的公交线路是不够的。

也许我做错了什么?

1 个答案:

答案 0 :(得分:3)

我认为您需要更多地考虑如何使用您的域名。在你的例子中,你已经说过你有一条线,一条线有路线,一条线有时间表。

我还希望你想问路线问题(比如这条路线上的st77)或操作(停止s99关闭2周)。这意味着路线是一个实体。可能你的止损是价值对象。

路线的聚合根将是一条公交线路,就像你说的那样,你无法对一条线路外的路线进行成像。这正是聚合根意味着什么。

此外,路由的标识符不必是有意义的名称,它可以有一些随机guid作为标识符。我的电脑作为序列号。没有人真正谈论过这个序列号(我谈的是x型的dell)但是当我订购它时,这是一个非常好的数字来识别和跟踪特定的计算机。

更新 DDD也是关于描述/建模您的问题。这是关于揭露你的问题领域的旅程。不要过于固定它看起来像什么,而是在谈论你想要解决的问题时(发现你的领域专家)发现它的样子。也许你发现路线和线路甚至不重要只是时间表和停止。 (如果你试图解决问题,如果找到下一班巴士的时候,如果你是巴士公司并且需要时间表实际驾驶公交车,那么线路似乎更重要)