-- 知识铺
大家好,我是mikechen。
DDD领域驱动设计是现在非常火热的设计架构,而且大厂面试也经常考察,下面我就全面来详解DDD领域驱动设计@mikechen
最新mikechen原创超30万字《阿里架构师进阶专题合集》和《最全大厂Java面试题答案合集》,请关注本公众号【mikechen的架构笔记】,后台回复:资料,即可领取。
DDD领域驱动设计
DDD领域驱动设计是Eric Evans在2004年发表的Domain Driven Design,也就是领域驱动设计著作中提出的一种从系统分析方法论。
DDD领域驱动设计,这里的DDD是Domain Driven Design的简称,全程就是DDD领域驱动设计。
DDD领域驱动设计作用
DDD领域驱动设计是一种致力于降低,或隐藏整个系统业务复杂性,让系统具有更好扩展,应对纷杂繁多的现实问题的架构方法。
解决复杂和大规模软件的武器可以被粗略地归为三类:「抽象」、「分治」和「知识」。
1.分治
把问题空间分割为规模更小,且易于处理的若干子问题,更容易设计各部分的协作方式,即高内聚低耦合。
采用DDD领域驱动设计的设计思想,业务逻辑不再集中在几个大型的类上。
比如:实际的开发过程中,之前的大类,会拆解为相对小的领域对象类组成。
这些类具备自己的状态和行为,每个类是相对完整的独立体,并与现实领域的业务对象映射。
2.抽象
使用抽象能够精简问题空间,而且问题越小越容易理解。
举个例子:从北京到上海出差,可以先理解为使用交通工具前往,但不需要一开始就想清楚到底是高铁还是飞机,以及乘坐它们需要注意什么。
3.知识
顾名思义,「DDD」可以认为是知识的一种。
DDD领域驱动设计就是由这样许多的细粒度的类组成(分割的子问题),基于领域驱动的设计,保证了系统的可维护性、扩展性和复用性,在处理复杂业务逻辑方面有着先天的优势。
DDD领域驱动设计核心
DDD领域驱动设计基于面向对象分析与设计技术,对技术架构进行了分层规划,同时对每个类进行了策略和类型的划分。
DDD领域驱动设计,如何下图所示:
领域驱动设计的战略核心:即是将问题域与应用架构相剥离,将业务语义显现化。
把原先晦涩难懂的业务算法逻辑,通过领域对象(Domain Object),统一语言(Ubiquitous Language)转化为领域概念清晰的显性化表达出来。
DDD领域驱动设计主要会涉及到三点:
1.统一语言
统一语言,英文名Ubiquitous Language,主要就是使软件的开发人员,以及使用人员都使用同一套语言。
通过这种方式,确保团队在内部的所有交流中,代码中,画图,写东西,都使用同一语言,这样极大的提升效率。
简单理解起来的话,也就是把业务人员和开发人员的语言统一起来。
举一个例子:交易系统里的:账号,转账,这些都是非常重要的领域概念,如果这些命名都和我们日常讨论以及 PRD 中的描述保持一致,将会极大提升代码的可读性,减少认知成本。
2.面向领域
业务语义显性化,以领域去思考问题,而不是模块,将隐式的业务逻辑从一推 if-else 里面抽取出来。
用通用语言去命名、去写代码、去扩展,让其变成显示概念。
3.职责划分
根据实际业务合理划分模型,模型之间依赖结构和边界更加清晰,避免了混乱的依赖关系,进而增加可读性与可维护性。
通过建模更好的表达现实世界中的复杂业务,模型的内聚增加了系统的高度模块化,提升代码的可重用性,对比传统三层模式中,很有可能大量重复的功能散落在各个 Service 内部。
DDD领域驱动设计架构
DDD领域驱动设计架构,如下图所示:
整个架构分为四层,其核心就是领域层,具体描述如下:
1.用户界面/展现层
用户界面:负责向用户展现信息以及解释用户命令。
比如:实际的研发中,主要负责以Restful的格式接受Web请求,然后将请求路由给Application层执行,并返回视图模型(View Model)。
2.应用层
应用层:主要负责获取输入,组装上下文,做输入校验,调用领域层做业务处理。
应用层是很薄的一层,用来协调应用的活动,它不包含业务逻辑。
3.领域层
领域层是DDD领域驱动设计的核心,主要是封装了核心业务逻辑,并通过领域服务(Domain Service)和领域对象(Entities)的函数对外部提供业务逻辑的计算和处理。
4.基础设施层
本层作为其它层的支撑库存在,它提供了层间的通信,实现对业务对象的持久化,包含对用户界面层的支撑库等作用。
DDD领域驱动设计应用
DDD领域驱动设计的核心应用场景:就是解决复杂业务的设计问题。
主要解决分层架构与职责划分
领域驱动设计很好的遵循了关注点分离的原则,提出了成熟、清晰的分层架构。
同时对领域对象进行了明确的策略和职责划分,让领域对象和现实世界中的业务形成良好的映射关系,为领域专家与开发人员搭建了沟通的桥梁。
复用的场景
在领域驱动设计中,领域对象是核心,每个领域对象都是一个相对完整的内聚的业务对象描述,所以可以形成直接的复用。
以上
最后送大家一个福利:
送大家一份我原创超30万字的阿里架构师进阶专题合集,非常的全面。
以及给大家整理了一份非常全面的Java面试题及答案合集,包含:Java、多线程、JVM、Spring、MySQL、Redis、Dubbo、中间件…等最全大厂必考题及答案详解。
需要以上架构专题&面试答案的同学,加我微信即可**!
添加时备注:资料
- 原文作者:知识铺
- 原文链接:https://index.zshipu.com/geek001/post/20240627/DDD%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1%E6%9C%80%E5%85%A8%E8%AF%A6%E8%A7%A3%E5%9B%BE%E6%96%87%E5%85%A8%E9%9D%A2%E6%80%BB%E7%BB%93--%E7%9F%A5%E8%AF%86%E9%93%BA/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com