02、一叶而天下知秋,带你走进DDD的概念术语

141 阅读7分钟

每一门方法论,都会有它的专门术语,而DDD同样也不例外。

古人说,一叶而天下知秋,透过DDD的术语,我们可以初步明白,DDD到底是什么。

任何方法论,都可以分成战略与战术两部分,战略是思想指导,战术是具体做法。举个例子,目标是成为一名架构师,那么,看多书、多实践便是成为架构师的战略,而看什么书、哪个时间段看书、要去实践哪些内容,这些,便是战术。

战略是指导思想,是总体纲领,战术是具体的做法,是实现战略的行动方针。

因此,DDD,分为战略模式、战术模式。

战略模式由领域、通用语言、限界上下文、限界上下文映射图组成。

战术模式由模块、实体、值对象、聚合、资源库、领域服务、领域事件等组成,只要是不属于战略模式的,就一定是属于战术模式的。

一叶知秋.jpg

术语

通用语言

通用语言是一种在特定领域内的沟通方式,可以由文字、语言、手势、图像等一切与达到沟通目的的元素组成。只要是能达到有效沟通目的,都是通用语言!

比如,在中国内,方言是闽南的小王与方言是粤语的小张进行交流,那么,普通话是他们交流的主要语言,那么普通话便是他们之间的通用语言。

再比如,美国人史密夫来到了北京的一家餐馆,史密夫不会说中文,餐馆工作人员也不会说英语,史密夫和点餐人员通过在菜单上指指点点,再加上一些点头、OK手势等动作,终于完成了点餐(虽然,也是有概率会点菜点错了),那么,在菜单是指点、点头、OK手势等一系列动作,便是他们之间的通用语言。

再比如,小明和小红是两个项目组的程序员,小明画了一张系统之间交互的时序图,两就着这张时序图进行了激烈的讨论,那么,这张时序图,就是他们之间的通用语言的一部分。注意的是,这里使用了“一部分”这个词,因为除了时序图之外,他们激烈讨论过程中所用到的语言、手势(甚至打架动作)、白板都是通用语言的一部分。

再比如,A先生是北方人,B先生是南方人,A先生说马玲薯好吃,B先生说土豆好吃,到底是马玲薯好吃还是土豆好吃?如果是通用语言,会在沟通之前使两人达成共识“马玲薯==土豆”。

在一个团队中,构建出属于自己的通用语言是非常有必要的,好的通用语言,能让团队具备极高的沟通效率! 通用语言,不是天然就存在的,而是在发展的过程中,不断地完善。

领域

从广义上讲,领域(Domain)即是一个组织所做的事情以及其中所包含的一切。商业机构通常会确定一个市场,然后在这个市场中销售产品和服务。每个组织都有它自己的业务范围和做事方式。这个业务范围以及在其中所进行的活动便是领域。当你为某个组织开发软件时,你面对的便是这个组织的领域。这个领域对于你来说应该是明晰的,因为你在这个领域中工作。

通常情况,我们可以把一个行业看成是一个领域,不同的行业是不同的领域。

也可以把同一个行业中,不同的生产环节,看成是不同的领域。

至于领域的划分,没有通用的标准,视具体情况而定。

子域

子域是领域的细分,子域仍然是领域。

当一个领域的范围过大的时候,将领域划分成更细的子域是一个很好的办法。

如果子域仍然过大,那么,仍然可以在子域的基础上继续划分子域。

核心域

重要的,便是核心。业务价值最高的领域,便是核心域。

支撑域

对核心域,起着支撑作用的领域,便是支撑域。

通用域

不包含业务,或者仅包含了最基础且通用的业务的领域,便是通用域。通用域,为支持域、核心域提供技术支持。

限界上下文

限界上下文是一个显式边界,领域模型便存在于边界之内。在边界内,通用语言中的所有术语和词组都有特定的含义,而模型需要准确地反映通用语言。

限界上下文,其本质还是一个领域,只是叫法不同!

模块

模块也是一个显式边界,领域模型便存在于边界之内。模块比限界上下文要小,可以做作是限界上下文的子集。

在Java语言中,package是模块的具体实现,如com.compony.business.xxx。

实体

实体是有生命周期,能演变,里面的属性值可以随时变化。简单的说,实体有类似set方法,可以在任何时候修改实体的属性。

值对象

值对象是快照,固定不变,对象创建完成之后,就不能修改里面的所有属性。

比如,今天吃饭花了 20 块钱,就定义成值对象,因为吃饭花了 20 块钱已经是事实,不会再有变化。

贫血模型

在一个JavaBean中,只有get、set方法,而没有其他业务方法,就是贫血模型。

充血模型

充血模型是相对于贫血模型而讲的,在一个JavaBean中如果有着丰富的业务方法,就是充血模式。

聚合

聚合是一个过程,把紧密相连的实体、值对象,组合成一个更大的的实体、值对象,这个过程,就叫聚合。

资源库

资源库的作用是存储领域模式数据,实现领域模型与具体存储底层的解耦。

领域服务

领域服务是充血模型的补充,当一个业务方法不适合放在充血模型中的时候,就可以抽取到领域服务中。

领域事件

领域事件是一个抽象的概念,当一件事情发生的时候,那么这个正在发生的事情就是一个事件。

应用程序

应用程序是用来访问领域模块,给接口层提供数据使用的。

限界上下文映射图

限界上下文映射图是用来做限界上下文之间的集成使用的,简单的说,就是用在服务之间的集成。限界上下文映射图中包含着系统与系统之间的集成关系、集成方式等关键信息。

防腐层

服务之间是不可信的,强依赖上流服务的数据会存在很大风险,一旦上流服务数据发生变动,严重时会导致下游服务崩溃。 因此,防腐层处于上流服务与下流服务之间,处于领域模型与外部接口之间,用来将外部系统的数据转化成符合领域模型的数据。

共享内核

共享内核也是用于服务之间的集成。防腐层是认识服务之间不可信,而共享内核则是完全信任对方服务。

开放主机

开放主机也是用于服务之间的集成。下游服务通过网络连接上流服务进行数据交互,这便是开放主机。

举个例子,下游服务调用上流服务提供的API获取数据。