领域驱动设计常见误区解析 -- 知识铺
领域驱动设计:误解与真相
领域驱动设计的现状领域驱动设计(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的原则。
然后是“驱动”,怎么理解呢?我们看看下面几句话:
- 赚钱驱动工作
- 欲望驱动求偶
- 领域驱动设计
领域驱动设计(Domain-Driven Design, DDD)是一种软件开发方法论,它强调以业务领域为中心进行软件开发。以下是对领域驱动设计概念的解读和分析:
领域驱动设计的核心理念
目的与驱动力- 目的:工作的目的是赚钱,赚钱驱使我们工作。- 驱动力:赚钱的目的、世俗的欲望等,都是驱动我们行动的力量。- 领域驱动设计中的驱动力:识别问题和解决方案的范围和边界,是进行分析和设计行为的驱动力。
价值观与决策- 价值观:决定我们在决策时看重什么。- 领域驱动设计中的价值观:识别领域是最重要的事,是软件设计的核心目标。
决策的多样性- 例子:不同的价值观导致不同的决策,如选择交通工具时看重方便或锻炼。
领域驱动设计的具体实践
识别领域的重要性- 核心目标:在分析业务和建模过程中,识别出范围和边界。
领域的“明确性”与“正确性”- 追求:追求领域的明确性而非正确性。- 决策过程:在有限信息下做出预判,明确不明确的部分处于怎样的范围。
价值观与软件设计的利益- 符合利益:领域驱动设计的价值观符合软件设计的价值利益。
思考问题的方法
经典问题示例- 问题:把大象放进冰箱需要几步?- 解决模式:将大问题拆分成小问题。
结论领域驱动设计强调以业务领域为核心,通过识别问题的范围和边界来驱动设计过程。这种价值观认为,明确性比正确性更重要,它帮助我们在有限的信息下做出更好的决策,并随着信息的增加不断修正我们的决策。
而这个模式等价于:“复杂问题变为简单问题”。
那么最关键的问题来了,如何衡量“复杂”和“简单”?我们来看几个例子,下面两个系统,你觉得哪个更复杂?你一定会选“系统2”,因为显然它的元素数量更多。
下面两个系统呢?是不是感觉“系统3”更复杂?
基于上面的例子,我们至少可以得出两个判断:
- 系统复杂度与元素的数量和元素的关系有关;
- 元素的关系对系统复杂度的影响远远大于元素的数量所产生的影响;
回归到领域驱动设计,为啥要划分领域?因为“划分领域就是在用数量简化关系”,用明确的边界将问题拆解,逐个击破。其意图是控制系统复杂度,尽可能降低系统的复杂度,而复杂度的降低,是与我们软件工程的投入产出利益一致的。
到此,我们就形成了一个核心逻辑链条:“划分领域->降低复杂度->降低成本”,因此划分领域符合我们价值取向,我们愿意认同“领域驱动设计”的价值观。
重新审视对待“领域驱动设计”的分歧
假如你认同“领域驱动设计是一种价值观”这样的观点,我们重新来回到前面说的“完全没用,不可落地”和“软件工程困境的解药”这两派观点的分歧上,就会发现大家的分歧底层就是价值观的分歧,一方面大家的讨论维度都停留在“领域驱动设计怎么落地”这个层面,缺少了“领域驱动设计到底是什么”这个问题的共识;另一方面大家没有察觉到核心分歧其实是价值观的分歧,导致了对于“领域驱动设计”的理解和判断过程缺乏底层认知的共识。
对于本质没有共识,其之上的所有讨论如同“空中楼阁”,缺乏严密逻辑链条的推导,那么表达者不得不用一些抽象的概念来模糊化自己表达的东西,从而使得“领域驱动设计”这个词变得越发抽象,越发“不明觉厉”。
后续
本文从why的角度解析了“领域驱动设计”,并未涉及到How的部分,但以我的经验来看,理解了why,在执行How的操作时会更加地笃定和自信,更容易成功。
且听我后续慢慢道来。
- 原文作者:知识铺
- 原文链接:https://index.zshipu.com/geek001/post/20240730/%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1%E5%B8%B8%E8%A7%81%E8%AF%AF%E5%8C%BA%E8%A7%A3%E6%9E%90--%E7%9F%A5%E8%AF%86%E9%93%BA/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com