您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

花五分钟带你了解——DDD领域驱动设计

时间:2021-10-28 09:11:01  来源:  作者:Java码农之路

DDD:指领域驱动设计,是domain driven design的缩写。

介绍DDD基础知识的相关文章很多,本文就不普及相关的基础知识了,基础理论知识可参考如下文章:

  • 《DDD基础知识与总结》
  • 《DDD与分层架构

1. 初识DDD

脚本式编程(dao+service)与DDD领域驱动模式区别如下:

花五分钟带你了解——DDD领域驱动设计

 

其每一层的作用范围和含义如下:

1)展现层(Presentation Layer):负责以Restful的格式接受Web请求,然后将请求路由给Application层执行,并返回视图模型(View Model),其载体通常是DTO(Data Transfer Object);

2)应用层(Application Layer):主要负责获取输入,组装上下文,做输入校验,调用领域层做业务处理,如果需要的话,发送消息通知。当然,层次是开放的,若有需要,应用层也可以直接访问基础实施层;

3)领域层(Domain Layer):主要是封装了核心业务逻辑,并通过领域服务(Domain Service)和领域对象(Entities)的函数对外部提供业务逻辑的计算和处理;

4)基础实施层(Infrastructure Layer)主要包含Tunnel(数据通道)、防腐层,Config和Common。这里我们使用Tunnel这个概念来对所有的数据来源进行抽象,这些数据来源可以是数据库(MySQL,NoSql)、搜索引擎、文件系统、也可以是SOA服务等;Config负责应用的配置;Common是通用的工具类。

常见的领域驱动业务调用链过程如下图所示:

花五分钟带你了解——DDD领域驱动设计

 

调用过程大致如下:

  1. 业务调用方基于网关传入DTO数据,为了便于区分业务场景,将DTO数据又细分为CQE三种模式的数据。
  2. 业务数据传入后,基于Spring Validation等模式做基础数据验证(如必填,格式,大小等基础验证);
  3. 数据进入到Controller层,并调用应用层相关的应用功能;
  4. 应用层不做具体的业务实现,只做编排处理,做业务的流程处理。应用层可做如下操作:
  • 应用层调用防腐层查询其他系统的数据;
  • 应用层调用仓库层查询本系统相关的数据;
  • 应用层调用工厂创建实体(简单实体,可在应用层直接生成);
  • 应用层调用第三方领域服务,实体或聚合根的方法处理业务逻辑;
  • 应用层调用仓库层保存数据;
  1. 工厂创建实体,简单的实体可不基于工厂创建;
  2. 领域层处理实体的行为,核心业务逻辑处理放在领域层,领域层可调用基础层的所有模块处理业务(领域层原则上不直接调用仓库层保存数据,保存数据应该放在应用层调用);
  3. 仓库实现层最终落地数据,进行数据存储(其他层不能直接与Tunnel(数据通道)交互,必须基于仓库层才可以);
  4. 一个业务行为结束后,若产生副作用,再应用层发出事件通知,其他模块再监听处理。(事件归属应用层还是领域层,网上各有不同的方案,本例是放在应用层。领域层本身只是内存化操作。等一个实体行为真正数据存储成功后,再发出事件,便于理解和维护。)

2. 巨人的肩膀

作者接触DDD相关知识,是从一篇名为《一文教会你如何写复杂业务的代码》的文章开始的。带着好奇,越看越有共鸣,初步发现了DDD的神奇之处并一发不可收拾,开始入坑DDD领域驱动设计。在查看DDD各种教程博客时,综合对比并摒弃一些低质量的博客,强烈推荐以下两位老师的系列教程。

阿里-张建飞:张老师的新书《代码精进之路》。

阿里-殷浩:

  1. 《DDD系列第一讲》
  2. 《DDD系列第二讲:应用架构》
  3. 《DDD系列第三讲:Repository模式》
  4. 《DDD系列第四讲:领域层设计规范》
  5. 《DDD系列第五讲:如何避免写流水账代码》

3. 为什么要写DDD系列博客

在初步了解了DDD的相关知识后,作者的第一感受是:DDD概念很多,各种专业术语,一堆下来还有点复杂,看了理论知识,还是云里雾里。看了诸多理论博客,总结一句就是:“听君一席话,如是一席话”。似乎明白了,又似乎还是什么都不懂。

经过第一轮的理论知识打击后,作者决定还是继续学习。既然理论知识太多,那就在实践中去寻找真理。

DDD到底应该怎样落地?

网上介绍DDD理论知识的相关文章很多,但真正介绍DDD如何应用在项目中的高质量技术文章就凤毛麟角了,更别提有完整示例的项目了。在这个探索的过程中,作者发现了殷浩的系列DDD教程,张建飞的COLA 4.0开源项目。

为了更透彻地掌握DDD相关的知识细节,并考虑落地DDD模式到公司的项目,还是没有采用开源项目COLA 4.0。作者选择通过殷浩老师的系列教程,一步一步开始DDD的探索之路。

适逢公司刚好存在一个老项目急需改造,老系统是基于(dao+service)脚本式编程开发的。由于时间较远且不同时间段由不同的开发人员维护,这种老代码,呵呵呵,懂得都懂。团队讨论决定就用这个项目来做DDD的落地。

虽然一开始看了很多理论知识文档,一些技术实现细节文档。但在编写初版本的DDD设计文档时,依旧发现特别的别扭,总感觉很奇怪。本质原因还是缺乏DDD设计经验,并且对DDD的各个知识点,分层细节理解不够深入。在这个迷茫阶段,作者抱着试一试的心态,尝试加了殷浩老师的钉钉,所幸他同意了。后续就是请教学习了,请教各种理论细节的实现和注意事项。在这个过程中,有以下几点感想:

  1. 深入理解理论知识,需要落地去反复的验证,总结出来的理论知识一般具有高度的概括性,为什么是这样,不这样会如何往往需要自己去验证;
  2. 自以为已经明白了理论知识,但在实际项目使用中,却是错误地使用,比如仓库层,领域层的一些细节问题;
  3. DDD落地困难的点还在于实现一个功能可以有不同的模式,这些模式不一定都对,但从功能实现层面来说却是都可以完成功能。比如,你在领域层直接调用仓库层保存数据,但领域层本身只是做纯内存化的业务逻辑处理,领域层是不可直接操作数据的。诸如此类的问题,导致不同的人对DDD理解不同,实现模式也不同。由于每一层的标准,实现方案不完全不同,才导致了DDD落地的复杂性。
  4. DDD做设计时,不单是对领域层做业务设计,应该是拉通整个流程一起做设计。
  5. 实体,聚合根,这些概念在实际项目中落地到具体的业务场景时,需要反复的迭代设计。
  6. 规范无处不在,注重编程细节,小到命名,大到使用设计模式,都需要规范编码。DDD在不同的层面,需要开发人员更加注重规范,不可张冠李戴,错误如:在仓库层里面写业务逻辑。
  7. 特别感谢殷浩老师的耐心指导,技术人传道授业,简单而纯粹。这份技术人独有的编码情怀和工匠精神,很帅。

本文旨在为使用或学习DDD模式的同行者,提供一个快速的入门案例(案例gitHub地址),抛砖引玉,共同学习。目前网上还缺乏完善的DDD设计案例,本着相互探讨和学习的思想,现基于实际的案例,在脱敏处理后,详述DDD从理论到落地的流程。大致分为以下模块:

  1. 《DDD领域设计-案例-需求说明文档》
  2. 《DDD领域设计-案例-建模设计说明》
  3. 《DDD领域设计-项目目录结构说明》
  4. 《DDD领域设计-案例-源码使用说明》
  5. 《DDD领域设计-设计规范》

特别说明DDD落地的方案没有统一的标准,本系列文章采用的技术方案也不一定能完全实现DDD的思想。由于作者水平有限,在一些理解上面若出现偏差,欢迎指导和批评。



Tags:DDD   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
1 为什么要写技术方案回顾软件开发的历史进程,我们可以将其分为程序设计时代、程序系统时代和软件工程时代三大历史阶段。在程序设计时代(1946-1956),软件开发主要依赖于个人编...【详细内容】
2021-11-05  Tags: DDD  点击:(32)  评论:(0)  加入收藏
DDD:指领域驱动设计,是domain driven design的缩写。介绍DDD基础知识的相关文章很多,本文就不普及相关的基础知识了,基础理论知识可参考如下文章: 《DDD基础知识与总结》 《DDD...【详细内容】
2021-10-28  Tags: DDD  点击:(45)  评论:(0)  加入收藏
在领域驱动架构中,通常会将查询和命令操作分开,我们称之为CQRS(命令查询职责分离Command Query Responsibility Segregation)。这张图是来自Martin Fowler大师的文章CQRS( http...【详细内容】
2021-07-30  Tags: DDD  点击:(132)  评论:(0)  加入收藏
前几天和几个饿了么的同学聊天,一听说他们还在用COLA 1.0,我二话没说,90度鞠躬,赔礼道歉,虚心聆听他们的吐槽。COLA的初衷旨在控制复杂度,救码农于水火,惭愧的是,早期的思想不成熟,设计也多有缺陷,不仅没帮到他们,反而坑了他们,实...【详细内容】
2021-01-05  Tags: DDD  点击:(164)  评论:(0)  加入收藏
摘要 本文源自2018领域驱动设计中国峰会《领域驱动设计与演进式架构专题》的Session之一,是其博客版 在实践领域驱动设计时,可以挑选一些方法互为参照,端口和适配器架构概念简...【详细内容】
2020-11-04  Tags: DDD  点击:(94)  评论:(0)  加入收藏
来自亚马逊的高级工程师 James Hood 以简单明了的例子说明了为什么要用 DDD 替代 CRUD 来设计 REST API。他提到“DDD 与 REST API 近乎天然地合拍,因为 REST 的资源可以很...【详细内容】
2019-10-08  Tags: DDD  点击:(127)  评论:(0)  加入收藏
▌简易百科推荐
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(1)  评论:(0)  加入收藏
程序是如何被执行的  程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(9)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(19)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(23)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(24)  评论:(0)  加入收藏
一个项目的大部分API,测试用例在参数和参数值等信息会有很多相似的地方。我们可以复制API,复制用例来快速生成,然后做细微调整既可以满足我们的测试需求1.复制API:在菜单发布单...【详细内容】
2021-12-14  AutoMeter    Tags:AutoMeter   点击:(20)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条