领域驱动设计中的聚合模式 | by Alexey Zimarev


聚合Aggregate模式可能是领域驱动设计 (DDD) 中最重要的战术模式。本质上,它可以这样描述:

  1. 聚合是可以被视为单个单元的域对象的集群。这意味着聚合中的对象密切相关,并且出于数据更改的目的被视为一个单元。
  2. 聚合有一个根实体,它是聚合中的主要对象。根实体负责执行聚合的不变量,以确保聚合内数据的完整性。
  3. 聚合有一个边界,定义哪些对象是聚合的一部分,哪些不是。此边界有助于确保聚合外部的对象无法直接访问聚合内的对象。
  4. 聚合是保持一致性的。这意味着根实体负责确保聚合内的对象始终处于一致状态。对聚合内对象的任何更改都必须通过根实体进行,并且根实体必须确保更改不违反聚合的不变量。
  5. 聚合是事务性的。这意味着对聚合内对象的所有更改都被视为单个工作单元,并且要么应用所有更改,要么不应用任何更改。这确保即使在发生故障或错误的情况下,聚合也能保持一致的状态。

既然上述所有内容都不难理解,为什么有那么多人声称Aggregate聚合模式被高估了,我们应该使用 "实体",或 "对象",或其他东西?

我的假设是,发生这种情况是因为该模式的一个基本属性经常被忽略。聚合体整合实体,不仅是为了保持状态的一致性,或者将行为封装在严格的边界内。聚合体还表达了新的行为,而聚合体中的单个实体并不具备这些行为。

一个典型的例子是一个订单,它由一个或多个订单行组成。单个订单行可以从订单中添加或删除。你也可以改变每条订单的产品数量。然而,只有整个订单可以被支付或发货。当然,如果订单可以部分发货,但通常是将其一分为二,其中一个被发货,另一个成为滞销品。

在这个例子中,我们可以清楚地看到,订单集合表达了集合所包含的单个实体所不具备的行为。

聚合体的这一特殊特征使我们更接近聚合体在科学中的含义:

在科学中,"聚合 "一词通常指的是一个单独项目的集合,它们被组合在一起形成一个单一的、统一的整体。这个整体可以是一个物理结构,比如一簇细胞或粒子,也可以是一个概念构造,比如一组相关的想法或理论。

实体这个词经常被类似地用来指代一个独特的、自足的事物或概念。在科学中,实体可以是物理对象,如粒子或细胞,也可以是抽象概念,如数学方程式或理论。关键的想法是,实体是一个独特的、可识别的事物,可以被独立研究或考虑。

科学中 "实体 "和 "聚合体 "的主要区别在于,实体是一个独立的、自成一体的事物,而聚合体则是一个单独项目的集合,它们被组合在一起,形成一个统一的整体。实体可以是一个物理物体,如粒子或细胞,也可以是一个抽象的概念,如一个数学方程或理论。另一方面,一个聚合体通常是一个由多个单独实体组成的物理结构或系统,它们以复杂的方式相互作用。

实体和聚合体之间的一个关键区别是,实体通常保留自己的独特特征,而聚合体往往表现出构成聚合体的各个实体所不具备的突发行为。例如,一群鸟是由单个鸟组成的聚合体,但鸟群作为一个整体的行为与单个鸟的行为不同。同样,晶体是由单个原子或分子组成的集合聚合体,但晶体作为一个整体具有与单个原子或分子不同的属性。

(banq: 聚合和实体区别是集体和个人的区别,集体不是简单由个人组成,1+1 != 2,集体有其整体特点,是一种复杂性系统的涌现emergent

牢记这一点,我的结论是:"聚合 "是一个非常好的术语,它准确地描述了模式的本质,而且一点也不矫揉造作或令人困惑。