DDD领域建模理解
导读
在 DDD 领域建模和系统建设过程中,有很多的参与者,包括领域专家、产品经理、项目经理、架构师、开发经理和测试经理等。对同样的领域知识,不同的参与角色可能会有不同的理解,那大家交流起来就会有障碍,怎么办呢?
因此,在 DDD 中就出现了“通用语言”和“限界上下文”这两个重要的概念。
这两者相辅相成,通用语言定义上下文含义,限界上下文则定义领域边界,以确保每个上下文含义在它特定的边界内都具有唯一的含义,领域模型则存在于这个边界之内。
在 DDD 领域建模和系统建设过程中,有很多的参与者,包括领域专家、产品经理、项目经理、架构师、开发经理和测试经理等。对同样的领域知识,不同的参与角色可能会有不同的理解,那大家交流起来就会有障碍,怎么办呢?
因此,在 DDD 中就出现了“通用语言”和“限界上下文”这两个重要的概念。
这两者相辅相成,通用语言定义上下文含义,限界上下文则定义领域边界,以确保每个上下文含义在它特定的边界内都具有唯一的含义,领域模型则存在于这个边界之内。
软件工程中很多问题都可以通过分层来解决,比如计算机缓存设计,分为一级二级三级等缓存层次,目的是为了解决内存和磁盘之间速度不匹配问题,通过引入分层的设计,将这种速度不匹配带来的影响降到了最低,再比如在数仓建模中,数据仓库通常分为ods,dwd,dwm,dws层,其实也是将复杂的问题简单化,引入分层的设计,让数据链路之间的依赖更加清楚,保证数据结构层次清洗,方便产出需要的数据,同理,今天要介绍的MVC软件架构模式,也是一种分层的思想。
面向过程的语言设计的网站系统,通常是方法之间的相互调用,比如A调用B,B调用C,方法之间相互调用完成一个业务流程,开发完的软件结构混乱不好维护,在面向对象开发以来,为了开发出的网站好维护,降低开发成本,逐步形成MVC软件架构,主要包括M-model对象层,主要封装一些实体对象,V-view展示层,通常用来向用户展示界面,但是目前大多都是前后端分离,所以这个V被淡化了很多,C-controller控制层,主要负责对外提供访问接口,DAO被抽象出来主要用来操作数据库。所以MVC-D这种软件架构使我们开发网站有了理论指导依据。
为了避免概念的混淆和下文内容方便讲解,先进行DDD概念认知确认:
Domain-driven design (DDD) is a major software design approach. (opens new window)来自维基百科。DDD 是一种软件设计方法。
软件的设计方法涵盖了:范式、模型、框架、方法论,主要活动包括建模、测试、工程、开发、部署、维护。来自维基百科的软件设计 (opens new window)涵盖信息介绍。
所以在当前语境下,MVC与DDD的对比,只是对比软件落地的框架结构,并不是软件设计思想和思维建模的全方面对比。所以如果读者再给一些其他伙伴阐述MVC和DDD的对比时,也是有必要说明语境的,避免没必要的纠结于理论,而忽略了交流讨论的意义。
那么,接下来在此语境下,我们进行MVC和DDD的重构讲解:
简单、容易、好理解,是 MVC 架构的特点,但也正因为简单的分层逻辑,在适配较复杂的场景并且需要长周期的维护时,代码的迭代成本就会越来越高。如图;
那 DDD 是什么呢?来自于维基百科的一段定义:"Domain-driven design (DDD) is a major software design approach. " (opens new window),DDD 是一种软件设计方法。也就是说 DDD 是指导我们做软件工程设计的一种手段,它提供了用切割工程模型的各类技巧,如;领域、界限上下文、实体、值对象、聚合、工厂、仓储等。通过 DDD 的指导思想,我们可以在前期投入更多的时间,更加合理的规划出可持续迭代的工程设计。
在 DDD 中有一套共识的工程两阶段设计手段,包括;战略设计、战术设计。
什么是系统的工程结构,工程框架的作用是什么?
其实,工程结构的存在作用目的,是为了承载工程系统开发的模型划分,定义工程服务开发过程中实施标准。说白了,就是你在工程实现时,在哪个层访问数据库、哪个层使用缓存、哪个层调用外部接口、哪个层做功能实现,这就是工程框架结构定义的目的。
但在 Service + 贫血模型 的三层结构开发指导下,是没有细分出面向对象工程结构设计的趋于划分的。所以在通常意义的 MVC 下,开发过程所有需要的内容,都会堆砌到 Service 实现类中。这也是为什么 DDD 领域驱动设计的落地工程结构,会出现;洋葱架构、整洁架构、菱形架构、六边形架构等这些架构模型。因为我们需要更细致的划分,来承载 DDD 设计概念中映射的领域、仓储、适配、编排、触发,并重视面向对象过程。其实你一上学,学Java就开始学面向对象了,只不过一点点在忘记它。