【问题标题】:What's the UML difference between Entity and Aggregate?实体和聚合之间的 UML 区别是什么?
【发布时间】:2015-06-12 16:44:54
【问题描述】:

来自a post 我读到Entity 似乎只是Aggregate 的一个子集。我已经阅读了Domain-Driven DesignImplementing Domain-Driven Design 中的两种模式,我试图了解它们之间的UML 区别。

让我们考虑一个简单的类。它是一封信,其中包含一条消息、一个接收者,也可能是发送者。

我猜这个 Letter 类会被认为是一个实体?

现在假设我们想扩展我们的包裹业务以能够发送包裹,那么它可能如下所示。

由于如果整个包裹丢失,包裹中的所有项目都将丢失,因此我们使用 UML Composition relation(一个填充菱形)。我们还希望通过禁止从包外部更改或删除项目来保持包的一致性。 description of Aggregate 读取

聚合根保证所做更改的一致性 通过禁止外部对象持有在聚合内 对其成员的引用。

因此,我们确保在聚合中隐藏组合关系,并保留不变量。

我的问题是:
我们可以说Entity和Aggregate之间的UML区别在于Entity确实包含任何组合关系而Aggregate包含至少一个组合关系?

【问题讨论】:

  • "entity" 是一个 UML 关键字,其含义与一般 IT 上下文中的含义几乎相同。它是应用于组件的预定义标准构造型。 UML 文档中的语义以“标准原型:L2(业务概念)”的形式给出。 (L2 仅表示合规级别 2;UML 系统配置文件有 3 个合规级别。)
  • 页。 s。除非您希望可以发送空包裹,否则您的 Item 多重性值应为 1..*。此外,您的发件人应该只是 1,因为您没有零到任何数量的发件人。
  • @BobRodes 好点。我从包中需要什么信息的角度添加关系,而不是从执行方式的角度。
  • @BobRodes 的 0..* 多重性是正确的,因为最初绘制的是正确的。包可以存在于内存或场景中,没有项目。包裹不能在没有物品的情况下发货是一项业务规则。
  • 好吧,如果您了解问题域中的业务规则的话。我自己不会那样设置业务规则。我的规则是系统中不能存在没有物品的包。

标签: uml domain-driven-design


【解决方案1】:

要回答你的问题,不,你不能这么说。聚合根是实体本身,可能由子实体组成,也可能不组成。子实体也可以由其他实体组成(尽管通常不推荐)。

聚合根负责维护状态并强制执行自身及其子实体的不变量。

总而言之,一个聚合实体和一个子实体都可以有 0 个或多个子实体。但是,所有子实体都需要聚合根。

【讨论】:

  • 你是对的。聚合根的工作方式类似于实体,因为它不需要任何组合关系。但是,据我了解,子实体并不需要聚合根。至少如果你看一下 Evans,第 94 页,图 5.5。
  • 您是在谈论子实体何时由其他子实体组成?虽然子子实体可能不直接与聚合相关联,但它们最终仍然是聚合根的一部分并受其控制。如果您说子实体可以完全存在于聚合根之外,那我还没有听说过。
  • 好的,它是这样工作的吗? Aggregate Root 是客户联系的唯一对象。 Aggregate 本身不是一个对象,而是一个 concept,其中 Aggregate = 1 Aggregate Root + N Entities + N Value Objects。实体永远不会被客户直接使用,因为它们非常暴露并且不受不变的保护。相反,实体在构建聚合时充当构建块,其中聚合根保留所有不变量。
  • 关闭,但聚合根本身也是一个实体。例如,您可以有一个名为 Customer 的 AR,根本没有子实体。所以一个聚合根可以有零个或多个子实体/值对象。
  • 好的,完美!谢谢泰勒!
【解决方案2】:

一个Entity代表MVC中的M(odel)。它通常表示为<<entity>> 原型类。

聚合是聚合不同其他类的类的同义词。这意味着它在其生命周期内需要其他类。还有一个 Composite 类似,只是相关的类实例会随着复合类一起消亡。

回答您的最后一个问题:实体是原子。它不聚合任何东西。

编辑因为我刚刚在工作中遇到它:有些实体组成/聚合其他实体。 30 年前,在大学里,我们称它们为空中飞人,因为它们悬挂在另外两个实体之间并将它们联系起来。现在我称它们为关联类。

【讨论】:

  • 另见uml-diagrams.org: Class Diagrams → Class → Nonstandard Class Stereotypes → «Entity»。从我的角度来看,实体是拥有自己的数据库表的东西。其余的都喜欢它的关系和属性是另一个关注程度
  • 是的,这就是我要确认的。一个实体最终产生一个数据库表。
  • 感谢您的意见!我猜你的答案是严格基于 UML 的。据我了解,DDD 中没有复合模式。这就是我要解决的问题; DDD 模式与 UML 的关系。
  • 花了一点时间才弄明白 DDD 是什么意思。是的,我的答案是基于 UML。我不知道这本书,但我猜它也是基于 UML 的?
【解决方案3】:

领域驱动设计 (DDD) 中的实体只是 UML 术语中的类原型。该构造型向您表明该对象是由一个明确的唯一标识符而不是其属性来标识的。

对象模型中的对象一起协作。它们一起形成对象图。 Aggregate 表示需要一起考虑的一组对象,因为不这样做可能会使一个或多个对象处于无效状态。

“我们可以说Entity和Aggregate之间的UML区别在于Entity不包含任何Composition关系而Aggregate至少包含一个Composition关系吗?”

没有。 UML 组合或聚合关联与 DDD 聚合或实体的概念无关。

例如,可以在 UML 中表示 Transaction-LineItem 关系,无需组合或 (UML) 聚合。

交易 --- 1 -------- 0..* --- LineItem

上面建模的这两个对象都需要是同一个 (DDD) 聚合的一部分,因为它们需要被视为一对。如果单独受到虐待,可能会使它们的组合状态无效或不正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2021-06-12
    相关资源
    最近更新 更多