有界上下文是域驱动设计中的中心模式。这是DDD战略设计部分的重点,该部分是关于处理大型模型和团队的。DDD通过将它们划分为不同的有界上下文并明确它们的相互关系来处理大型模型。

img

DDD是关于基于底层域模型设计软件的。模型充当无处不在的语言,以帮助软件开发人员和领域专家之间的通信。它还充当软件本身设计的概念基础 - 它如何分解为对象或功能。为了有效,一个模型需要统一 - 即内部一致,以便其中没有矛盾。

当您尝试对更大的域进行建模时,构建单个统一模型变得越来越困难。不同的人群将在大型组织的不同部分使用微妙的不同词汇。建模的精确度很快就会遇到这种情况,通常会导致很多混乱。通常,这种混淆集中在域的核心概念上。在我职业生涯的早期,我曾在一家电力公司工作 - 在这里,“电表"这个词对组织的不同部分意味着微妙不同的东西:它是电网和位置之间的连接,电网和客户之间的连接,还是物理电表本身(如果有故障可以更换)。这些微妙的多义词可以在对话中平滑,但在计算机的精确世界中却无法实现。我一次又一次地看到这种混淆在"客户"和"产品"等多义词中反复出现。

在那些年轻的日子里,我们被建议建立一个统一的整个业务模型,但DDD认识到我们已经了解到"大型系统域模型的完全统一是不可行的或具有成本效益的”[1]。因此,DDD将一个大型系统划分为有界上下文,每个上下文都可以有一个统一的模型 - 本质上是一种构建多个规范模型的方法。

界定上下文既具有不相关的概念(例如,仅存在于客户支持上下文中的支持票证),又具有共享的概念(例如产品和客户)。不同的上下文可能具有完全不同的共同概念模型,以及在这些多数学概念之间映射以进行整合的机制。一些 DDD 模式探索上下文之间的替代关系。

各种因素在上下文之间划定了界限。通常占主导地位的是人类文化,因为模型充当泛在语言,当语言发生变化时,你需要一个不同的模型。您还可以在同一域上下文中找到多个上下文,例如单个应用程序中内存中模型和关系数据库模型之间的分离。这个边界是由我们表示模型的不同方式设置的。

DDD 的战略设计继续描述了在界定上下文之间建立关系的各种方式。通常值得使用上下文映射来描述这些内容。

延伸阅读

DDD的规范来源是Eric Evans的书。它不是软件文献中最容易阅读的,但它是那些充分回报大量投资的书之一。有界上下文打开第四部分(战略设计)。

Vaughn Vernon的“实现领域驱动设计“从一开始就专注于战略设计。第2章详细介绍了如何将域划分为有界上下文,第3章是绘制上下文映射的最佳来源。

我喜欢既旧又仍然相关的软件书籍。我最喜欢的书之一是威廉·肯特(William Kent)的《数据与现实》(Data and Reality)。我仍然记得他对油井多面性的简短描述。

Eric Evans 描述了明确使用有界上下文如何允许团队使用气泡上下文在遗留系统中移植新功能。该示例说明了相关的界定上下文如何具有相似但不同的模型,以及如何在它们之间进行映射。