领域驱动设计之所以晦涩难懂,个人感觉是名词太多,而且晦涩难懂,今天就整体梳理下 这里面的名词,并结合具体的例子加强理解。

一、领域与子域

     不管是在软件开发中还是在研究其他问题的时候,我们都可以把复杂问题根据某些特性拆分成多个子问题,每个问题只在特定的范围或区域内研究,这个特定的范围或区域就可以称为领域

    当一个领域的问题还是很复杂的时候,我们可以继续拆分,拆分出来的子领域研究的范围或区域就称为 子领域 。

    例如,以公司为例子,公司拆分了好多业务线,从K0到K5以及其他的事业部。这样每个业务线就可以看成是一个独立的领域,每个领域专门做自己相关的事情。每个业务线又是由许多部门组成的,每个部门就是这个领域下面的子领域。

二、核心域、通用域和支撑域

     在领域不断划分的过程中,领域会细分为不同的子域,子域可以根据自身重要性和功能属性划分为三类子域,它们分别是:核心域、通用域和支撑域。

1、决定产品和公司核心竞争力的子域是核心域,它是业务成功的主要因素和公司的核心竞争力,所以可以多投入一些资源。比如租住业务线。

2、没有太多个性化的诉求,同时被多个子域使用的通用功能子域是通用域,比如基础平台,中间件,没有企业特点限制,不需要做太多的定制化。

3、还有一种功能子域是必需的,但既不包含决定产品和公司核心竞争力的功能,也不包含通用功能的子域,它就是支撑域,例如大数据业务。

划分核心域、支撑域和通用域的主要目标是:通过领域划分,区分不同子域在公司内的不同功能属性和重要性,从而公司可对不同子域采取不同的资源投入和建设策略,其关注度也会不一样。

三、通用语言和限界上下文

   1、通用语言

在事件风暴过程中,通过团队交流达成共识的,能够简单、清晰、准确描述业务涵义和规则的语言就是通用语言

确定了通用语言之后,在同个界限上下文中,任何人对同一个东西只能叫同一个名字,包括产品做需求分析和程序员写代码都用一样的名字。

2、限界上下文(bounded context)

我们知道语言都有它的语义环境,同样一句话在不同的语境下可能是不同的意思,例如:能穿多少穿多少,在不同语境下说这句话会是完全相反的意思。为了避免同样的概念或语义在不同的上下文环境中产生歧义,DDD 在战略设计上提出了“限界上下文”这个概念,用来确定语义所在的领域边界。

我们可以将限界上下文拆解为两个词:限界和上下文。限界就是领域的边界,而上下文则是语义环境。通过领域的限界上下文,我们就可以在统一的领域边界内用统一的语言进行交流。

限界上下文用来封装通用语言和领域对象,提供上下文环境,保证在领域之内的一些术语、业务相关对象等(通用语言)有一个确切的含义,没有二义性。这个边界定义了模型的适用范围,使团队所有成员能够明确地知道什么应该在模型中实现,什么不应该在模型中实现。

另外,业务的通用语言就有它的业务边界,我们不大可能用一个简单的术语没有歧义地去描述一个复杂的业务领域。限界上下文就是用来细分领域,从而定义通用语言所在的边界。

比如:在收房阶段,可能管房子 就叫 房子,但是在出房阶段,房子就变成了 友家,整租,豪宅,曼舍等。虽然是同一个事物,但在不同的上下文,就是不同的东西。

总的来说,在一个界限上下文中,一种物品有唯一的一个术语,一个术语也能对应一种物品,但是一种物品过了上下文界限就有可能用其他术语来称谓。

三、实体和值对象

1、实体

实体类主要是作为数据管理和业务逻辑处理层面上存在的类;实体有唯一标识,唯一标识唯一确定一个对象,即使对象的其他属性值都改变了,只要唯一标识没变,就还是原来的实体对象。实体类的主要职责是存储和管理系统内部的信息,它也可以有行为,甚至很复杂的行为,但这些行为必须与它所代表的实体对象密切相关。所以实体 一般都是 充血模型。

2、值对象

值对象的定义:通过对象属性值来识别的对象,它将多个相关属性组合为一个概念整体。

值对象本质上就是一个集。它将不同的相关属性组合成了一个概念整体,没有唯一标识,是个整体的值,只有数据初始化操作和有限的不涉及修改数据的行为,基本不包含业务逻辑。

结合具体的例子来理解,我们可以把房屋信息当成实体,每个房屋都有唯一的houseID,roomID等信息,可以把一些通用的房屋属性当成值对象,例如房屋的朝向,几居室,楼层等

四、聚合和聚合根

1、聚合

领域模型内的实体和值对象就好比个体,而能让实体和值对象协同工作的组织就是聚合,它用来确保这些领域对象在实现共同的业务逻辑时,能保证数据的一致性。

你可以这么理解,聚合就是由业务和逻辑紧密关联的实体和值对象组合而成的,聚合是数据修改和持久化的基本单元,每一个聚合对应一个仓储,实现数据的持久化。

2、聚合根

聚合根的主要目的是为了避免由于复杂数据模型缺少统一的业务规则控制,而导致聚合、实体之间数据不一致性的问题。

如果把聚合比作组织,那聚合根就是这个组织的负责人。聚合根也称为根实体,它不仅是实体,还是聚合的管理者。

作为实体,聚合根有实体的一切特征,有实体的属性和业务行为,有独立的生命周期,可以实现自身的业务逻辑。

作为聚合的管理者,在聚合内部负责协调实体和值对象按照固定的业务规则协同完成共同的业务逻辑。
 

具体的例子,例如 医生给患者开的处方单。一个处方单包含一些药品明细,那么这个处方单跟药品明细,就组成了一个聚合。必须先有处方单 才会有药品明细,没有处方 也就没有药品明细,同时如果想知道具体的药品明细,必须通过 处方才能查看到药品明细,所以处方就是 这个聚合的聚合根。对这个聚合的访问,必须经过处方才可以完成。