实体和聚合之间的 UML 区别是什么?

What's the UML difference between Entity and Aggregate?

来自 I read it seems that Entity is just a subset of Aggregate. I've read about the two patterns in both Domain-Driven Design and Implementing Domain-Driven Design,我正在尝试了解它们之间的 UML 区别。

让我们考虑一个简单的class。这是一封包含信息、收件人和可能的发件人的信件。

我猜这封信 class 会被认为是一个实体?

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

由于如果整个包丢失,包中的所有项目都会丢失,我们使用 UML Composition relation (a filled diamond). We also want to preserve the Package's consistency by prohibiting Items from being changed or removed from outside the Package. The description of Aggregate 读取

The aggregate root guarantees the consistency of changes being made within the aggregate by forbidding external objects from holding references to its members.

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

我的问题是:
我们可以说实体和聚合之间的 UML 区别是实体 包含任何组合关系,而聚合包含 至少一个 组合关系?

一个Entity代表了MVC中的M(model)。它通常表示为 <<entity>> 定型 class。

聚合是 class 的同义词,聚合了不同的其他 class。这意味着它在其生命周期内需要其他 classes。还有一个 Composite 类似,除了相关的 class 实例将与复合 class.

一起消亡。

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

编辑 由于我刚刚在工作中遇到它:有 compose/aggregate 个其他实体的实体。 30 年前在大学里我们称它们为空中飞人,因为它们挂在另外两个实体之间并将它们联系起来。现在我称他们为协会 class.

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

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

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

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

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

"Can we say that the UML difference between Entity and Aggregate is that Entity does not contain any Composition relation whereas Aggregate contains at least one Composition relation?"

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

例如,可以在没有组合或 (UML) 聚合的情况下用 UML 表示事务-订单项关系。

事务 --- 1 -------- 0..* --- LineItem

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