【问题标题】:Is a DDD entity hidden in my DDD Value Object?DDD 实体是否隐藏在我的 DDD 值对象中?
【发布时间】:2016-07-27 12:31:01
【问题描述】:

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

领域:巴士时刻表

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

对象:

  • Station - 描述公交车站

  • Route(ctx1) - 一组站点(Route waypoints)

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

  • Schedule(ctx2) - 从 Route 的航路点出发的命名集合。

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

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

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

我的想法:

  • 将时间表放入路线。为什么它不是一种选择:线条变胖;创建 ctx1 和 ctx2 的超级上下文

  • 将 Route 设为实体。为什么它不是一个选项(我认为......):虽然不难想象带有一些标识符(例如名称)的路线,但很难想象公交线路之外的公交路线。

也许我做错了什么?

【问题讨论】:

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


    【解决方案1】:

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

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

    路线的聚合根将是一条公交线路,就像您说的那样,您无法在线路之外绘制路线。这正是聚合根的含义。

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

    更新 DDD 也是关于描述/建模您的问题。这是关于发现您的问题域的旅程。不要太拘泥于它的样子,而是在谈论你试图解决的问题时发现它的样子(与你的领域专家)。也许您发现路线和线路甚至不只是时间表和站点。 (如果您试图解决的问题是寻找下一班公共汽车何时到达,那么如果您是公共汽车公司并且需要实际驾驶公共汽车的时间表,那么线路似乎更重要)

    【讨论】:

    • 你说:and a line has schedules - 这是我想避免的事情。我希望我的路由域对调度域一无所知。这意味着,Schedule 实体必须有一个路由标识符。但是如果RouteLine Aggreate Root 中的一个实体,我不能在它是聚合根的一部分时引用它,这里唯一可能的引用是ScheduleLine 之间的链接。我说的对吗?
    • 都是 1 个大域(可能有多个聚合根)。但是一条线路、路线和时间表似乎非常相互关联。您的日程安排/时间表取决于路线。所以我看不到 2 有界上下文发生在这里
    • +1 出色的编辑,巴达维亚。很容易陷入“我们”希望看到它如何建模的问题,但如果询问利益相关者,答案可能已经存在。通用语言的元素很可能预先存在于实现中。无论从开发的角度来看什么是最有意义的,它都应该由利益相关者如何看待它来驱动。如果不是,它会使开发团队(包括领域专家/利益相关者)之间的沟通更加困难。
    猜你喜欢
    • 2010-10-04
    • 2012-07-08
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多