导读
DDD领域建模被各个大小厂商提起并应用,而每个人都有自己的理解,本文就是针对小白,系统地讲解DDD到底是什么,解决了什么问题,及一些建议和实践。本文主要是思想的一种碰撞和分享,希望能对朋友们有所启发或帮助。
一、前言
在当时的环境下,单体应用仍然是市场的主体,但是大型复杂软件系统已经出现,给团队的设计和开发工作带来了比较大的挑战。
DDD提供了一种新的设计思路,通过对于业务子域和限界上下文的划分,建立跨越业务和技术的统一语言,为业务建模的同时,拉通业务和技术实现。
DDD理论的提出,对整个软件架构设计领域,尤其是对微服务架构的设计产生了巨大的影响。那如何运用DDD来解决所面临的大型业务系统问题呢?
在这里以中台业务为例,进行实践和应用。
友情提示:看目录,从整体中深入内部去看
二、现状
2.1软件设计所面临的挑战
软件开发的不确定性贯穿了整个软件工程的生命周期。软件工程中不可能有任何“银弹”解决软件的复杂度问题。软件工程核心实质是社会工程,优秀团队的竞争力来源于互相的信任及良好的沟通。
2.2软件工程的复杂度
无法回避这种复杂性,所做的只有控制这种复杂性。20多年前,顶尖的软件设计人员已经意识到领域建模和设计的重要性。尽管没有被清楚的表述出来,在对象社区涌动着一种新的思潮,EricEvans把它称为领域驱动设计。领域驱动设计是一种思维方式,也是一组优先任务,它旨在加速那些必须处理理复杂领域的软件项目的开发。
初衷及目标:高内聚,低耦合
2.3和传统架构设计相比DDD解决的问题
DDD要解决的两个核心问题:
1.业务架构如何合理的设计?
2.如何使系统架构域业务架构保持一致并具备可持续的扩展?
领域驱动的设计基本目标:有效建模,并运用领域模型驱动团队进行沟通分析、设计及开发。
2.4领域驱动设计的核心思想
1、模型与现实业务的统一
模型和程序设计的核心相互影响。正是模型与实现之间的紧密联系才使模型变得有用,并确保我们在模型中所进行的分析能够转化为最终程序。模型与实现之间的这种紧密结合在维护和后续开发期间也会很有用,因为我们可以基于对模型的理解来解释代码。
2、统一(业务和技术)语言
模型是团队所有成员使用的通用语言的中枢。由于模型与实现之间的关联,开发人员可以用该语言来讨论程序。他们可以在无需翻译的情况下与领域专家进行沟通。而且由于该语言是基于模型的,因此我们可借助自然语言对模型本身进行精化。
3、团队的持续学习,消化知识,系统持续的发展
模型是浓缩的知识。模型是团队一致认同的领域知识的组织方式和重要元素的区分方式。透过我们如何选择术语、分解概念以及将概念联系起来,模型纪录了我们看待领域的方式。
当开发人员和领域专家在将信息组织为模型时,这一共同的语言(模型)能够促使他们高效地协作。
4、领域驱动设计三原则
P1:Focusonyourcodomain.
※聚焦于你的核心领域
P2:Iterativelyexplomodelsinacativecollaborationofdomainpractitionersandsoftwapractitioners.
※通过协作迭代探索模型
P3:SpeakaUbiquitousLanguagewithinanexplicitlyBoundedContext.
※统一语言
2.5领域驱动的设计步骤
5.1统一语言
同一对象在不同上下文中的概念可能是不同的。
领域太复杂,只有在分割的上下文内才可能形成统一语言。
在UML作为建模主流的时代,软件设计被明确分为面向对象分析(OOA),面向对象设计(OOD)和面向对象编码(OOP)阶段。
实际操作中OOD的工作往往被OOA和OOP各自承担一部分,并同时存在分析模型和设计模型两个割裂的模型。
而领域驱动设计的核心是建立统一的领域模型。领域模型在软件架构中处于核心地位,软件开发过程中,必须以建立领域模型为中心,以保障领域模型的忠实体现。
简单理解起来的话,也就是把业务人员和开发人员的语言统一起来,用代码来感受一下大概就是:
userService.love(Jack,Rose)=Jack.love(Rose)