划分限界上下文 - 读《领域驱动设计精粹》学战略设计

使用DDD分析一个复杂系统,正确的划分限界上下文非常重要。《领域驱动设计精粹》书中展示了一个划分限界上下文的案例。

识别核心限界上下文边界

书中第2章「运用限界上下文与通用语言进行战略设计」讲述了一个识别核心限界上下文边界的案例。虽然没有明说,但其使用的方法是:识别核心域,然后寻找与核心域有关的概念,将这些概念放入核心限界上下文中;与核心域无关的概念,就放在核心限界上下文之外。

为什么这么说呢?我们来看一下第2章讲了啥:

  • 首先介绍了限界上下文「是语义和语境上的边界」
  • 接着引出了核心域的概念:「当限界上下文被当作组织的关键战略举措进行开发时,即被称之为核心域」。这里没有明说核心域和限界上下文的关系,但是我们至少可以得知:核心域对应于某个限界上下文。
  • 然后引出了通用语言:「在限界上下文中……用于表达其边界内的软件模型」,

之后,通过一个案例,把这三个概念:限界上下文、核心域、通用语言联系起来,展示了识别核心限界上下文边界的方法:

  • 「是否都符合Scrum通用语言的要求?」
  • 「……都与Scrum无关」
  • 「……更符合Scrum的通用语言」
  • 「……但并不是Scrum的核心通用语言」

通过这样一系列的问题,识别了哪些概念和核心域相关,哪些无关。

综上所述,书中识别核心限界上下文边界的方法是,寻找与核心域有关的概念,这些概念都需要符合核心限界上下文内的通用语言,该通用语言表达的模型就是核心限界上下文边界内的模型,这些模型也就属于这个限界上下文。而与核心域无关的概念,就在核心限界上下文之外。

识别限界上下文边界

在识别了核心限界上下文的边界后,书中突然出现的另外5个限界上下文:

这5个限界上下文是怎么来的?里面的模型又是如何识别的?书中并没有介绍,不过我们可以推导一下。

刚才我们提到,通过识别与核心域有关的概念,确定了核心限界上下文的边界。所谓的“核心限界上下文”的概念,其实是核心域对应的限界上下文。所以说核心域和核心限界上下文对应,就可以得知其他限界上下文对应于其他子域。

另外,第3章中提出「限界上下文于子域之间一一对应」,也印证了这个观点。

那么和核心域一样,每个子域都有一个“主题”。比如书中案例的核心域的主题就是「Scrum」。而和该主题相关的概念/模型,就在该子域对应的限界上下文边界内。

为了识别某个概念是否属于某个限界上下文,问题就变成了:

  • 是否都符合该主题的通用语言的要求?
  • 是否与该主题无关?
  • 是否更符合该主题的通用语言?
  • 是否是该主题的通用语言?

再看一下书中对于限界上下文的介绍:「这意味着边界内的每个代表软件模型的组件都有着特定的含义并处理特定的事务」。这里所谓的「特定」,就是指每个子域的主题。

综上所述,只要知道了系统由哪些子域组成,以及每个子域的主题,就可以划分限界上下文。

那子域从何而来呢?

那如何识别系统中有几个子域?每个子域的主题又是什么?

书中第3章「运用子域进行战略设计」说「子域可以用来逻辑地拆分这个业务领域」,这意味着子域是由领域分解而来,所有的子域合起来,就是整个领域。

既然领域就是问题域,那么“如何识别子域”这个问题,就变成了“如何分解问题域”。

然而对于“如何分解问题域”这个问题,很遗憾,书中并没有回答。书中案例的子域,比如「敏捷项目管理核心域」、「账单子域」、「订单子域」、「发票子域」、「物流子域」、「目录子域」等,都没有分析过程,全是直接从天而降,仿佛子域都是显而易见的。

尽管如此,书中还是有一些方法可以参考:

  • 「业务部门或工作组织的划分可以很好的标明模型边界的位置」,这个是划分子域的一个参考
  • 「当限界上下文被当作组织的关键战略举措进行开发时,即被称为核心域」,通过识别关键战略可以得到核心域。有时候我们可以从产品愿景中得到核心域。

核心域和限界上下文的关系?

书中有些语句让人会感觉“限界上下文只对应于核心域”:

  • 「当限界上下文被当作组织的关键战略举措进行开发时,即被称之为核心域」
  • 「采用限界上下文会迫使我们回答“什么是核心”的问题」
  • 「而其他的概念会在限界上下文之外。只有经过“仅限核心”的严格过滤之后保留下来的概念,才能成为拥有限界上下文的团队的通用语言的一部分。」

那么限界上下文只对应于核心域么?当然不是。书中也提到「限界上下文于子域之间一一对应」,而子域有三种类型:核心域、支撑子域和通用子域。核心域只是子域类型的一种,其他两种类型的子域也对应限界上下文。

当书中为什么要这么说呢?第3章给出了解答:「当讨论一个正在实施的DDD的项目时,最有可能讨论的是核心域」。


如何划分限界上下文,有人困惑于“聚合分组法”,有人认为只能“By Experience”。蓝皮书中使用限界上下文把一个混乱的模型分成多个清晰的模型,却没有说清哪些模型应该划分到一个限界上下文中;《领域驱动设计精粹》中使用核心域识别核心限界上下文边界,却没有介绍其他限界上下文从何而来,仿佛核心域之外的部分不需要设计。

本文尝试通过理解《领域驱动设计精粹》中的观点,推理出书中隐含的划分方法。虽然并没有解答所有问题,但是希望本文的一些观点可以帮助读者更好的理解子域和限界上下文的关系以及限界上下文的识别方法。

编辑于 05-20

文章被以下专栏收录