危险的DDD聚合根

简介: 原文:危险的DDD聚合根DDD的核心是聚合。这没有问题,大家都认同。但关于DDD中的聚合方式,其实我还是有些担心,下面说说我的想法,希望大家参与讨论。其实当初第一次看到DDD中关于聚合根部分论述的时候,就感觉有些僵化。
原文: 危险的DDD聚合根

DDD的核心是聚合。这没有问题,大家都认同。但关于DDD中的聚合方式,其实我还是有些担心,下面说说我的想法,希望大家参与讨论。

其实当初第一次看到DDD中关于聚合根部分论述的时候,就感觉有些僵化。DDD中的聚合根的分析设计思路大致是这样:1、业务本质逻辑分析;2、确认聚合对象间的组成关系;3、所有的读写必须沿着这些固有的路径进行。

这是一种静态聚合的设计思路。理论上讲,似乎没有什么问题。但实际上,人对第一步中的业务逻辑分析就是一个渐进的过程,不是稳定不变的。不是谁都可以成为业务领域专家,就算是业务领域专家也不一定都是对的。在我看来,从时间维度和多用户场景下看,这种静态的聚合分析设计方法是根本无法保证领域模型的稳定性。

也许有人不理解,那可以打个比喻:过去几个孩子可以和爸爸妈妈高高兴兴地一家人生活在一起,但是孩子们长大后是必然要分家的。其实我只是在强调,人们对业务过程的认识是有局限性的,谁也无法避免。

DDD本来就是处理复杂业务逻辑设计问题。我看到大家用DDD去分析一些小项目的时候,往往为谁是聚合根而无法达成共识这说明每个人对业务认识的角度、深度和广度都不同,自然得出的聚合根也不同。试想,这样的情况下,领域模型怎么保持稳定。


更现实的解决方式是怎么在动态过程中尽可能地保证业务领域模型的稳定性。在我看来:对象之间是平等的,没有谁高人一等(也就是没有聚合根);场景(业务)是聚合对象行为的唯一理由;复杂的场景是由简单场景聚合而成。不管业务如何变化,总有子场景是不变的,这样就能获得最大的“维护利润”(业务不变性)。

作为企业软件开发而言,最大的挑战就是业务变化。这一方面来源于业务本身的变化(应用系统应用不断深入和推广),另一方面是我们对业务认识不断深入的过程。不能适应变化的系统只有死路一条。复杂的业务要求软件架构必须具备很强的适应能力。如前面所说,这是一个渐进的过程。DDD本身就是为了解决复杂业务的软件开发问题的。“如何避免颠覆式修改”是最大的挑战。如果发现找的聚合根是错误的,那领域模型还可重用的价值还有多大,这种代价和成本是否能够承受?

核心观点:

  1. 每个人对业务认识的角度、深度和广度都不同,得出的聚合根也就会不同;这才有了很多时候我们无法对谁是聚合根以及聚合根的边界大小达成共识;
  2. 我们对业务的认识是一个不断深入的过程,在这个过程中我们的模型也会相应调整;
  3. 从DDD的最后落地实现角度来看,最终出来的是一个个聚合。但是因为聚合不仅仅只是一个根实体,而是还内聚了一堆子实体和值对象。那它的这种内聚结构对于后期因各种原因而发现原来的聚合是错误的时候,此时模型重构的成本和代价会相对于“一个所有Entity对象都地位平等的模型”的重构成本会更大,特别是在引入了Event Sourcing时问题更加凸显,这点也可见我上篇发表的帖子;
目录
相关文章
|
12月前
|
NoSQL 数据建模 数据库
DDD - 聚合与聚合根_如何理解 Respository与DAO
DDD - 聚合与聚合根_如何理解 Respository与DAO
153 0
【CCCC】L2-025 分而治之 (25分),图的度数,使节点独立的方案
【CCCC】L2-025 分而治之 (25分),图的度数,使节点独立的方案
72 0
【CCCC】L2-016 愿天下有情人都是失散多年的兄妹 (25分),搜索公共祖先
【CCCC】L2-016 愿天下有情人都是失散多年的兄妹 (25分),搜索公共祖先
147 0
【CCCC】L2-026 小字辈 (25分),求多叉树的深度和底层叶节点
【CCCC】L2-026 小字辈 (25分),求多叉树的深度和底层叶节点
105 0
|
存储 设计模式 前端开发
浅谈DDD中的聚合
在我看来并不是MVC的基础上增加领域层,使用充血模型,解耦基础服务,我的代码就符合DDD了。
浅谈DDD中的聚合
|
JSON 前端开发 Java
DDD专题案例二《领域层决策规则树服务设计》
在上一章节介绍了领域驱动设计的基本概念以及按照领域驱动设计的思想进行代码分层,但仅仅只是从一个简单的分层结构上依然没法理解DDD以及如何去开发这样的微服务。另外往往按照这样分层后依然感觉和MVC也没有什么差别,也没有感受到带来什么非常大的好处。那么问题出在哪呢?我个人觉得DDD学起来更像是一套指导思想,不断的将学习者引入到领域触发的思维中去,而这恰恰也是最难学习的地方。时而感觉会了,而实际开发中又不对,本来已经拆解清晰了,但怎么又那么像MVC了。甚至怀疑自己,我在干嘛?
297 0
DDD专题案例二《领域层决策规则树服务设计》
|
测试技术 领域建模 微服务
DDD领域驱动设计实战-聚合(Aggregate)和聚合根(AggregateRoot)(上)
DDD领域驱动设计实战-聚合(Aggregate)和聚合根(AggregateRoot)
795 0
DDD领域驱动设计实战-聚合(Aggregate)和聚合根(AggregateRoot)(上)
|
存储 弹性计算 安全
DDD领域驱动设计实战-聚合(Aggregate)和聚合根(AggregateRoot)(下)
DDD领域驱动设计实战-聚合(Aggregate)和聚合根(AggregateRoot)
1019 0
|
存储 缓存 算法
DDD领域驱动设计实战 - 创建实体身份标识的常用策略(中)
DDD领域驱动设计实战 - 创建实体身份标识的常用策略(中)
239 0
DDD领域驱动设计实战 - 创建实体身份标识的常用策略(上)
DDD领域驱动设计实战 - 创建实体身份标识的常用策略(上)
236 0
DDD领域驱动设计实战 - 创建实体身份标识的常用策略(上)