领域驱动设计DDD的一些基本概念:限界上下文、领域、子域、核心域、通用语、支撑域

领域驱动设计的全名叫Domain Driven Design,因此也被简称为DDD.领域驱动设计说到底只是一种编程思想或者叫理念。并没有实际的代码给你引用,比如Springhibernate等。借助这个编程思想去合理的组织代码,能够让代码一直保持高质量水平,正如我上一篇谈到为什么要用领域驱动设计DDD一样。

在具体谈到如何应用领域驱动设计来组织我们的代码之前,我们必须要先了解一些基本概念:限界上下文、领域、子域、核心域、通用语、支撑域。这些概念贯穿着领域驱动设计的整个过程。本文尝试 以最简洁的文字表述出这些基本概念的意义。

1、限界上下文

领域设计驱动力求准确地描述真实世界的方方面面。而在日常开发中,每个人看待同一个事务都有其自己的见解。最常见的来说,业务员,产品经理和程序员3个角色必须充分沟通,才能把最贴近现实的领域模型表达出来。在这个过程中,我们一定要形成一个“通用语言”,它是3个角色都能理解的,并且不会产生任何歧义。对于一个电商项目来说,用户的核心目标是购买一个“商品”,而不是用货物、包裹或其他名词来指代这个“商品”。大家对商品的定义都是明确且统一的,就是:上架到商城等待被客户购买的东西

那对于一个商品(比如Iphone13)来说,当我们进货管理库存的时候,我们才称它是“货物”。当我们发货给用户后,才称它为“包裹“。可以发现,同一个Iphone13在不同的场景下,他的称呼不一样。

原因就是他们处在不同的限界上下文中

因此通用语言定义了限界上下文的意义,而限界上下文定义了通用语言的边界。用来确保通用语言在一限界上下文中独一无二的意义。

在上面的例子中,Iphone13的库存管理、上架销售和发货完全是不同的限界上下文。我们也通常使用限界上下文作为划分微服务的依据。

2、领域

熟悉算法的同学肯定知道一个关键词”分治“。简而言之就是将一个复杂的问题分为多个独立的部分,分别求解,最后汇总求最终结果。咱们做项目也一样,很多项目都是复杂的,并不是一个单一的需求。因此我们需要将他们进行划分成不同的领域。

对于一个人来说,分为不同的器官。心脏、眼睛、鼻子、耳朵、肺等等。医生看不同的并只要专注于某一个领域就可以了。

DDD

3、子域

子域就是对领域的进一步划分。比如心脏可以再划分到心肌细胞、红细胞等等。

4、核心域

核心域就是对这个产品最核心的支撑,也就核心业务。对于酒店管理系统来说,核心域就是住客模块。

5、通用域

被其他领域共用的地方,就属于通用域。比如登陆、权限、角色、发短信等。

6、支撑域

既不是核心域又不是通用域,那就属于支撑域。他既不通用又不是核心,但是又必不可少。