02 | 领域、子域、核心域、通用域和支撑域:傻傻分不清?

DDD 的知识体系提出了很多的名词,像:领域、子域、核心域、通用域、支撑域、限界上下文、聚合、聚合根、实体、值对象等等,非常多。这些名词,都是关键概念,但它们实在有些晦涩难懂,可能导致你还没开始实践 DDD 就打起了退堂鼓。因此,在基础篇中,我希望能带着你一起做好实践前的准备工作。

除此之外,我想说的是,这些名词在你的微服务设计和开发过程中不一定都用得上,但它可以帮你理解 DDD 的核心设计思想和理念 。而这些思想和理念,在 IT 战略设计、业务建模和微服务设计中都是可以借鉴的。

那么,从这讲开始,我就会围绕以上这些 DDD 关键概念进行讲解,帮助你彻底理清它们与微服务的关系,了解它们在微服务设计中的作用。今天我们重点了解 DDD 的领域、子域、核心域、通用域和支撑域等重要概念。

如何理解领域和子域?

我们先看一下汉语词典中对领域的解释:领域是从事一种专门活动或事业的 范围 、部类或部门。

百度百科对领域的解释:领域具体指一种特定的 范围 或区域。

两个解释有一个共同点——范围 。对了!领域就是用来确定范围的,范围即边界 ,这也是 DDD 在设计中不断强调边界的原因。

在研究和解决业务问题时,DDD 会按照一定的规则 将业务领域进行细分 ,当领域细分到一定的程度后,DDD 会将问题范围限定在特定的边界内 ,在这个边界内建立领域模型,进而用代码实现该领域模型,解决相应的业务问题。简言之,DDD 的领域就是这个边界内要解决的业务问题域

既然领域是用来限定业务边界和范围的,那么就会有大小之分,领域越大,业务范围就越大,反之则相反。

领域可以进一步划分为子领域。我们把划分出来的多个子领域称为子域 ,每个子域对应一个更小的问题域或更小的业务范围。

我们知道,DDD 是一种处理高度复杂领域的设计思想,它试图分离技术实现的复杂度。那么面对错综复杂的业务领域,DDD 是如何使业务从复杂变得简单,更容易让人理解,技术实现更容易呢?

其实很好理解,DDD 的研究方法与自然科学的研究方法类似。当人们在自然科学研究中遇到复杂问题时,通常的做法就是 将问题一步一步地细分,再针对细分出来的问题域,逐个深入研究 ,探索和建立所有子域的知识体系 。当所有问题子域完成研究时,我们就建立了全部领域的完整知识体系了。

我们来看一下上面这张图。这个例子是在讲如何给桃树建立一个完整的生物学知识体系。初中生物课其实早就告诉我们研究方法了。 它的研究过程是这样的。

  1. 确定研究对象,即研究领域,这里是一棵桃树。

  2. 对研究对象进行细分

    将桃树细分为器官,器官又分为营养器官和生殖器官两种。

    其中营养器官包括根、茎和叶,生殖器官包括花、果实和种子。

    桃树的知识体系是我们已经确定要研究的问题域,对应 DDD 的领域。根、茎、叶、花、果实和种子等器官则是细分后的问题子域。这个过程就是 DDD 将领域细分为多个子域的过程。

  3. 对器官进行细分,将器官细分为组织。

    比如,叶子器官可细分为保护组织、营养组织和输导组织等。这个过程就是 DDD 将子域进一步细分为多个子域的过程。

  4. 对组织进行细分,将组织细分为细胞,细胞成为我们研究的最小单元。

    细胞之间的细胞壁确定了单元的边界,也确定了研究的最小边界。

这里先剧透一点聚合、聚合根、实体以及值对象的内容,我还会在 [第 04 讲] 和 [第 05 讲] 中详细讲解。

我们知道细胞核、线粒体、细胞膜等物质共同构成细胞,这些物质 一起协作 让细胞具有这类细胞 特定的生物功能 。在这里,你可以这样理解:

在聚合内这些实体一起协作完成特定的业务功能。这个过程类似 DDD 设计时,确定微服务内功能要素和边界的过程。