图片

大家好,我是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、中间件…等最全大厂必考题及答案详解

图片

需要以上架构专题&面试答案的同学,加我微信即可**!

添加时备注:资料