- DDD的基础概念
- 领域、子域、核心域、通用域和支撑域
DDD 的知识体系提出了很多的名词,像:领域、子域、核心域、通用域、支撑域、限界上下文、聚合、聚合根、实体、值对象等等,非常多。
如何理解领域和子域?
领域就是用来确定范围的,范围即边界 ,这也是 DDD 在设计中不断强调边界的原因。
在研究和解决业务问题时,DDD 会按照一定的规则 将业务领域进行细分 ,当领域细分到一定的程度后,DDD 会将问题范围限定在特定的边界内 ,在这个边界内建立领域模型,进而用代码实现该领域模型,解决相应的业务问题。简言之,DDD 的领域就是这个边界内要解决的业务问题域 。
既然领域是用来限定业务边界和范围的,那么就会有大小之分,领域越大,业务范围就越大,反之则相反。
领域可以进一步划分为子领域。我们把划分出来的多个子领域称为子域 ,每个子域对应一个更小的问题域或更小的业务范围。
如何理解核心域、通用域和支撑域?
在领域不断划分的过程中,领域会细分为不同的子域,子域可以根据自身重要性和功能属性划分为三类子域 ,它们分别是:核心域、通用域和支撑域。
- 核心域:决定产品和公司核心竞争力的子域是核心域,它是业务成功的主要因素和公司的核心竞争力。
- 通用域:没有太多个性化的诉求,同时被多个子域使用的通用功能子域是通用域。
- 支撑域:还有一种功能子域是必需的,但既不包含决定产品和公司核心竞争力的功能,也不包含通用功能的子域,它就是支撑域。
-
- 限界上下文
在 DDD 领域建模和系统建设过程中,有很多的参与者,包括领域专家、产品经理、项目经理、架构师、开发经理和测试经理等。对同样的领域知识,不同的参与角色可能会有不同的理解,那大家交流起来就会有障碍,怎么办呢?因此,在 DDD 中就出现了 通用语言 和 限界上下文 这两个重要的概念。
这两者相辅相成,通用语言定义上下文含义,限界上下文则定义领域边界, 以确保每个上下文含义在它特定的边界内都具有唯一的含义,领域模型则存在于这个边界之内。
什么是通用语言?
在事件风暴过程中,通过团队交流达成共识的,能够简单、清晰、准确描述业务涵义和规则的语言就是通用语言。也就是说,通用语言是团队统一的语言,不管你在团队中承担什么角色,在同一个领域的软件生命周期里都使用统一的语言进行交流。
那么,通用语言的价值也就很明了了,它可以解决交流障碍这个问题,使领域专家和开发人员能够协同合作,从而确保业务需求的正确表达。
下面这张图描述了从事件风暴建立通用语言到领域对象设计和代码落地的完整过程
- 在事件风暴的过程中,领域专家会和设计、开发人员一起建立领域模型,在领域建模的过程中会形成通用的业务术语和用户故事。事件风暴也是一个项目团队统一语言的过程。
- 通过用户故事分析会形成一个个的领域对象,这些领域对象对应领域模型的业务对象,每一个业务对象和领域对象都有通用的名词术语,并且一一映射。
- 微服务代码模型来源于领域模型,每个代码模型的代码对象跟领域对象一一对应。
什么是限界上下文?
我们知道语言都有它的语义环境,同样,通用语言也有它的上下文环境。为了避免同样的概念或语义在不同的上下文环境中产生歧义 ,DDD 在战略设计上提出了 限界上下文 这个概念,用来确定语义所在的领域边界。
我们可以将限界上下文拆解为两个词:限界和上下文
- 限界就是领域的边界
- 而上下文则是语义环境
通过领域的限界上下文,我们就可以在统一的领域边界内用统一的语言进行交流。
综合一下,我认为限界上下文的定义就是:用来封装通用语言和领域对象,提供上下文环境,保证在领域之内的一些术语、业务相关对象等(通用语言)有一个确切的含义,没有二义性。这个边界定义了模型的适用范围,使团队所有成员能够明确地知道什么应该在模型中实现,什么不应该在模型中实现。