DDD阅读笔记(二)聚合

192 阅读3分钟

最近阅读了info 的《DDD(领域驱动设计)-精简版》,整理了一些笔记用于后期回顾(不定期补充)。


一、什么是聚合

聚合模式的定义:

实体值对象划分为聚合并围绕着聚合定义边界。选择一个实体作为每个聚合的根,并仅允许外部对象持有对聚合根的引用。作为一个整体来定义聚合的属性不变量,并把其执行责任赋予聚合根或指定的框架机制。

在实际开发中,业务总是复杂和隐秘的,在于相关领域的专家沟通的时候,才能逐渐了解业务的细节。在沟通的过程中,往往会陷入到技术的细节中,而浪费了与业务专家沟通的机会,导致业务实现不完整。在沟通的阶段,不应当过多的考虑业务规则的正确性数据一致性,应该在系统层面梳理业务的关键点以及该业务在整个系统中的位置。因此,最适合的交流方式就是面向对象设计

二、面向对象设计

面向对象的设计方法提高了抽象层级,忽略一些不必要的技术细节。通过聚焦问题域,开发人员与业务人员可以使用统一语言进行持续的交流协作。

以采购业务为例,包含采购项、采购人员、供应商以及采购菜单等概念。采购人员、供应商与采购菜单是相互独立的,关联性不强;而采购项的存在于与采购菜单息息相关。因此,采购项与采购菜单是一个整体,被称之为聚合

聚合的本质是建立了比单个对象更大的边界,在边界内囊括了关系联系紧密的对象,在业务上被称之为领域对象。而领域服务只能通过聚合根作为对外交互的接口,保证了多个对象的一致性

三、问题域

DDD会根据业务问题划分领域模型,而每个领域可以划分为多个更小的子领域,每个子领域都对应一个更新的问题或更小的业务范围。

子域的分类:

  • 核心域:系统核心功能
  • 通用域:多子域通用的功能,例如鉴权与日志
  • 支撑域:用于支撑核心域与通用域,例如数据字典、消息通知

四、聚合的边界划分原则

  • 生命周期一致性原则:聚合内部的对象应该与聚合根拥有相同的生命周期,聚合的存亡影响了相关对象的存亡。
  • 问题域一致性原则:如果某个对象在多个问题域中被使用或者不属于同一个问题域的对象,不应该出现在同一个聚合中。
  • 场景一致性原则:经常被同时操作的对象,应该归属于同一个聚合。
  • 聚合尽可能小

五、相关文档

深入理解DDD的聚合模式 - 知乎
DDD-精简版