领域驱动设计:误解与真相

领域驱动设计的现状领域驱动设计(Domain-Driven Design, DDD)自提出以来已有20年的历史。互联网上充斥着大量关于DDD的书籍、文章和视频教程。以下是一些著名的参考书籍:

  • Eric Evans的《领域驱动设计:软件核心复杂性应对之道》- Vaughn Vernon的《实现领域驱动设计》- 张逸的《解构领域驱动设计》 尽管这些作品被广泛认为是宝典,但许多人在阅读时感到:
  • 晦涩难懂- 不明觉厉

为何感到困惑?在深入探讨DDD之前,让我们先列举一些常见的概念名词:

  • 问题空间(Problem Space)- 解决方案空间(Solution Space)- 领域(Domain)- 限界上下文(Bounded Context)- 通用语言(Ubiquitous Language)- 实体(Entity)- 值对象(Value Object)- 聚合(Aggregate)- 仓储(Repository)- 工厂(Factory)- 领域服务(Domain Service)- 领域事件(Domain Event) 主流的DDD资料试图解释这些概念,但往往没有站在初学者的角度,导致理解上的困难。领域建模甚至被认为需要“凭经验”。

DDD的两极分化由于理解上的困难,软件行业对DDD产生了两极分化的看法:

  • 一些人认为DDD无用,难以落地- 另一些人则认为它是解决软件工程难题的灵丹妙药 这两极的开发者在辩论时往往无法有效沟通。

DDD的本质领域驱动设计是一种价值观,而非方法论或代码组织的工具。它是一种决策时的价值取向。

拆解“领域驱动设计”- 领域(Domain):指的是一个具体的边界或范围,如篮球场、国家领土、公司职责或软件系统的功能。

结论理解DDD不应仅限于理论,而应将其视为一种指导软件开发的价值观。通过实践和经验,我们可以更好地掌握和应用DDD的原则。

read-normal-img

然后是“驱动”,怎么理解呢?我们看看下面几句话:

  • 赚钱驱动工作
  • 欲望驱动求偶
  • 领域驱动设计

read-normal-img
领域驱动设计(Domain-Driven Design, DDD)是一种软件开发方法论,它强调以业务领域为中心进行软件开发。以下是对领域驱动设计概念的解读和分析:

领域驱动设计的核心理念

目的与驱动力- 目的:工作的目的是赚钱,赚钱驱使我们工作。- 驱动力:赚钱的目的、世俗的欲望等,都是驱动我们行动的力量。- 领域驱动设计中的驱动力:识别问题和解决方案的范围和边界,是进行分析和设计行为的驱动力。

价值观与决策- 价值观:决定我们在决策时看重什么。- 领域驱动设计中的价值观:识别领域是最重要的事,是软件设计的核心目标。

决策的多样性- 例子:不同的价值观导致不同的决策,如选择交通工具时看重方便或锻炼。

领域驱动设计的具体实践

识别领域的重要性- 核心目标:在分析业务和建模过程中,识别出范围和边界。

领域的“明确性”与“正确性”- 追求:追求领域的明确性而非正确性。- 决策过程:在有限信息下做出预判,明确不明确的部分处于怎样的范围。

价值观与软件设计的利益- 符合利益:领域驱动设计的价值观符合软件设计的价值利益。

思考问题的方法

经典问题示例- 问题:把大象放进冰箱需要几步?- 解决模式:将大问题拆分成小问题。

结论领域驱动设计强调以业务领域为核心,通过识别问题的范围和边界来驱动设计过程。这种价值观认为,明确性比正确性更重要,它帮助我们在有限的信息下做出更好的决策,并随着信息的增加不断修正我们的决策。

read-normal-img

而这个模式等价于:“复杂问题变为简单问题”。

read-normal-img

那么最关键的问题来了,如何衡量“复杂”和“简单”?我们来看几个例子,下面两个系统,你觉得哪个更复杂?你一定会选“系统2”,因为显然它的元素数量更多。

read-normal-img

下面两个系统呢?是不是感觉“系统3”更复杂?

read-normal-img

基于上面的例子,我们至少可以得出两个判断:

  1. 系统复杂度与元素的数量和元素的关系有关;
  2. 元素的关系对系统复杂度的影响远远大于元素的数量所产生的影响;

read-normal-img

回归到领域驱动设计,为啥要划分领域?因为“划分领域就是在用数量简化关系”,用明确的边界将问题拆解,逐个击破。其意图是控制系统复杂度,尽可能降低系统的复杂度,而复杂度的降低,是与我们软件工程的投入产出利益一致的。

到此,我们就形成了一个核心逻辑链条:“划分领域->降低复杂度->降低成本”,因此划分领域符合我们价值取向,我们愿意认同“领域驱动设计”的价值观。

重新审视对待“领域驱动设计”的分歧

假如你认同“领域驱动设计是一种价值观”这样的观点,我们重新来回到前面说的“完全没用,不可落地”和“软件工程困境的解药”这两派观点的分歧上,就会发现大家的分歧底层就是价值观的分歧,一方面大家的讨论维度都停留在“领域驱动设计怎么落地”这个层面,缺少了“领域驱动设计到底是什么”这个问题的共识;另一方面大家没有察觉到核心分歧其实是价值观的分歧,导致了对于“领域驱动设计”的理解和判断过程缺乏底层认知的共识。

对于本质没有共识,其之上的所有讨论如同“空中楼阁”,缺乏严密逻辑链条的推导,那么表达者不得不用一些抽象的概念来模糊化自己表达的东西,从而使得“领域驱动设计”这个词变得越发抽象,越发“不明觉厉”。

后续

本文从why的角度解析了“领域驱动设计”,并未涉及到How的部分,但以我的经验来看,理解了why,在执行How的操作时会更加地笃定和自信,更容易成功。

且听我后续慢慢道来。