学习 | DDD(领域驱动设计)
今天的软件相对之前的软件,需求越来越复杂,变化越来越快。软件架构不断的在演进,一方面是为了适应新的需求,一方面也在寻找软件简单化解决方案,通过架构的规范是的软件更容易维护,逻辑更清晰。所以架构一直在追求易维护、可扩展。往往软件在开发初期,架构合理、分层清晰,但进过多年维护后,系统变得一团乱码。
究其原因,主要是大家面向业务开发,直达业务实现,往往是脚本式,面向过程的开发,而不是从软件架构的角度去编写程序。其很大原因是大多数公司业务至上原则,业务为王,而要架构更好的软件,势必会花费更多的时间打磨,很多老板不愿承担这成本。
设计的很好的架构,为什么到最后就维护的一团乱码?真的是开发人员技能的问题吗?当然,从直接的原因看是因为开发人员的问题,但深究背后的原因,我们不难发现这是业务与技术之间的悖论。业务需求是在寻找业务之间的关联关系,业务是耦合的;而技术一直在寻找解耦,追求高内聚低耦合的架构(无论是现在的微服务、还是之前的分层架构、还是组件化模块化,无不在践行这个理念)。这两个追去看起来是天然不可调和的。如果开发人员只关注了业务的逻辑,按照业务思维去开发系统,那么系统自然而然就会走向耦合。那有没有一种可能,调和业务和架构之间的矛盾呢?答案是:有,DDD(Domain Driven Design,领域驱动设计)
MVC
我们先看看经典的MVC开发模型。
Controller负责业务逻辑的处理,Model代表和持久层交互的数据模型,View层负责视图展示。MVC架构其实很精粹,清晰,对于业务逻辑并不复杂,单一化的场景其实效率是很高的。但是随着业务的多变性和不断复杂化,MVC架构就会暴露以下问题:
- MVC架构没有边界划分的概念和规范,在复杂的业务场景下会造成盘根交错的逻辑依赖,同时随着业务场景的不复杂化,代码意图会逐渐模糊,维护成本增加,对于系统的稳定性也会带来挑战。
- MVC仅反映软件架构的分层,不定义业务语义的抽象和表达,对于业务知识的沉淀和复用性来说,不太友好。
- MVC分割了数据和行为的表达,Model层(pojo)定义数据,Service层表述行为,会造成业务逻辑的首尾分离。
于是,为了解决以上问题,DDD的概念被提了出来。
DDD
这是一种解决复杂软件的思维方式,是一种思想;以业务为主导,自顶向下的进行业务领域划分,业务模型驱动架构设计。他的核心概念是Domain(领域)和 Model(模型)。一句话DDD是已经解决复杂软件的思想,核心思想是面向对象(OO),其核心概念是Domain(领域)和 Model(模型)。
DDD特点
- 面向对象设计,数据行为绑定,告别贫血模型;
- 降低复杂度,分而治之;
- 优先考虑领域模型,而不是切割数据和行为;
- 准确传达业务规则,业务优先;
- 代码即设计;
- 它通过边界划分将复杂业务领域简单化,帮我们设计出清晰的领域和应用边界,可以很容易地实现业务和技术统一的架构演进;
- 领域知识共享,提升协助效率;
- 增加可维护性和可读性,延长软件生命周期;
分层技术架构
用户交互层:负责向用户展现信息以及解释用户命令。RESTFul、rpc 请求或mq 消息等对外提供数据服务或指令服务。
业务应用层:很薄的一层,用来协调应用的活动和向领域层下达指令,它不包含业务逻辑,也不不保留业务对象的状态,但它保有应用任务的进度状态。 但在应用服务的实现中,它负责编排、转发、校验等。
领域层:核心层又称为模型层,本层包含关于领域的信息,负责表达业务概念。在这里保留业务对象的状态以及业务规则,即包含了该领域所有复杂的业务知识抽象和规则定义,对业务对象和它们状态的持久化被委托给了基础设施层。该层主要精力要放在领域对象分析上,可以从实体,值对象,聚合(聚合根),领域服务,领域事件,仓储,工厂等方面入手。
基础设施层:本层作为其他层的支撑库存在。它提供了层间的通信,实现对业务对象的持久化,包含对用户界面层的支撑库等作用。主要有 2 方面内容,一是为领域模型提供持久化机制,当软件需要持久化能力时候才需要进行规划;一是对其他层提供通用的技术支持能力,如消息通信,通用工具,配置等的实现。
DDD究竟能带来什么价值
- 业务(团队)价值
(1)统一语言
(2)清晰的边界定义
(3)领域能力沉淀和复用
(4)面向业务建模
(5)设计和代码的等价
- 个人价值
(1)提升全局视野
(2)提升业务sense
(3)构建体系化思维
DDD缺点
虽然DDD在构建复杂软件模型上,有天然的优势,但同时这套方法论的缺点也非常明显:
- 逻辑相对简单的业务和产品(比如一些小型公司的内部OA系统),用传统的MVC架构会更适合,构建也更快速。
- 非业务形态产品和应用并不适合,比如bigdata。这类应用和业务专注于数据层的交互和适配,并无强业务语义类诉求,而DDD最关键的一部分就是业务领域的抽象和包装,切记,它解决的是负责业务问题。
参考阅读:
https://www.jianshu.com/p/5a5e62d5f994
https://new.qq.com/rain/a/20240523A04JCJ00
总结
一般这种笔记我很少评论,但今天不得不吐槽几句。DDD是个啥东西,貌似概论很多很复杂,咱们程序员写出代码,又快又好的跑在CPU上才是王道,成天整一堆饶舌烧脑的技术名词干啥,卷,往死里卷,然而这些东西对快速低成本的交付优秀软件产品没一点帮助,更多的时候是帮倒忙,把问题搞复杂了忽悠领导、老板、投资人。但要命的是,他们坑惨了天底下的码农。
记住:好的系统不是设计出来的,也不是写出来的,是改出来的,是在实践中不断完善出来的,适合的就是好的。
(完)
- 原文作者: 闪电侠
- 原文链接:https://chende.ren/2024/09/26123641-001-ddd-dev.html
- 版权声明:本作品采用 开放的「署名 4.0 国际 (CC BY 4.0)」创作共享协议 进行许可