DDD中领域、子域、有界上下文和问题/解决方案空间等概念的定义 - Nick Tune


领域驱动设计是一种设计系统(通常是软件)的方法,该方法强调在域专家和系统构建者之间创建通用语言。著名的DDD原则包括使用通用语言使隐式显式
但是,DDD中的某些概念没有明确的定义,并且是高度隐含的。每个人都有自己的域,子域,问题空间和解决方案空间的定义。在本文中,我将提供这些概念的有效定义并将其清除。
  
模糊但是不含糊
在定义每个术语之前,我要强调肯尼·巴斯·施韦格勒(Kenny Baas-Schwegler)提出的重要观点。他认为DDD应该是模糊的。通过对DDD进行模糊处理,我们可以探索,建模和解决新的新问题,因为现有的模式和原则不会过度约束我们的思维。
但是,如果可以用许多不同的方式解释同一个单词,并且每个人都有不同的含义,这就是歧义。这是有问题的,因为我们不能有效地沟通,使用相同的词来表示不同的事物。
如果我说的是苹果,而您正在考虑的是橙子,那么我们的协调性就很差,我们将无法有效地解决问题。使用DDD,我们希望包含模糊性,但是我们对每个概念的模糊性有共同的理解。
以下定义是模糊的,但是,使用这些词时,我们都应保持高度一致。
 
领域
域驱动设计严格遵循域的剑桥词典定义:
一个感兴趣的区域,或一个某人可以控制的区域:

她对待业务是作为她的私域。
这些文件是在公告区域(=适合开放给给大家)。

这个域的定义非常模糊。什么是兴趣领域?可以是任何东西。域实际上是围绕宇宙中某些概念子集的任意域。
域是主观的,它们并不相互排斥。相同的概念可以存在于许多不同的领域。
图中的彩色形状代表概念,那么如何将它们分组为域?您可能会猜到,有很多方法可以做到这一点。
以形状分组;以颜色分组;其他可能分组。


在对系统进行建模时,我们必须选择最合适的领域边界,以使我们的软件和组织边界保持一致。即使我们对齐,也要按“颜色”对齐,形状域仍然是一个域。
我建模的每个领域和我运营的每个建模工作室,不同的人都喜欢在不同的领域边界分割系统。这是正常现象,请模糊处理并运用您的设计技能。
 
子域
域和子域之间有什么区别?这很容易:子域不是词典中存在的单词。“子域名”一词在网络主机托管领域非常流行,但在DDD中是什么意思呢?
在DDD中,子域是一个相对术语。域和子域可以互换使用。当我们使用“子域”一词时,我们强调的是,我们所讨论的域是我们已经确定的另一个更高级别域的子级。
因此,每个子域都是一个域,大多数域都是一个子域。只有在我们的模型不包含更高级别的父域时,我才会说域而不是子域。
 
核心,通用,支持(子)域
人们在听到核心域实际上是子域时常常感到困惑。在DDD书籍中,埃里克(Eric)将它们称为“核心域”,但他也将其称为“子域”。令人困惑?
当您将域和子域视为模糊域,并将子域也视为域时,可互换使用核心域和核心子域并不重要。
核心域听起来更好,核心子域强调了它所属的更高级别的域。
 
问题空间与解决方案空间:更好的模型
最令人困惑的术语是问题空间和解决方案空间。在域驱动设计的上下文中,每个人对于问题空间中的内容和解决方案空间中的内容都有不同的看法。
我认为问题/空间解决方案空间模型对于DDD试图表达的内容而言过于简化。这里太模糊了,需要更高的精度。我认为,西蒙·沃德利(Simon Wardley)的《战略》周期中的要素更为有用。

在沃德利的《战略周期》中,有以下要素(使用我的简化定义):

  • 目的(道):在我们感兴趣的领域中要解决的问题/要实现的目标是什么?
  • 格局(地利):我们感兴趣的域的当前状态是什么
  • 气候(天时):什么力量作用于域上以及它们如何演化
  • 原则(法):我们应该应用普遍良好的做法
  • 领导力(人和):我们的解决方案是什么……我们将在现有和新领域中做出哪些改变

更多见这里文章
 
域/子域是问题还是解决方案空间?
在没有明确定义问题或解决方案空间之前,无法真正回答此问题。
用户需求和问题存在于(子)域中,世界的当前状态具有(子)域,解决方案将涉及多个(子)域,并且将改变世界(具有域)的状态。因此,域可能存在于所有空间中。
我仍然建议避免使用问题/空间,而应更确切地说明您的实际意思:道、天时、地利、人和法。
 
域是分层的
如果一个域可以包含子域,而一个子域是一个域,则子域可以包含子域。域和子域是一个分层的概念。
在设计社会技术系统时,我们经常希望显示不同级别的领域。组织的领导者可能希望看到公司的7个顶级域。软件架构师可能希望查看100个微服务的域边界。
企业体系结构世界在不同级别使用业务能力的概念。业务能力可以视为域和子域。
 
子域与有界上下文
这是关于DDD的最令人困惑的事情之一,但是当您对子域有清晰的定义时,实际上这是最简单的解释。
(子)域是宇宙中概念的互不排斥的任意子集。有界上下文是代表这些概念的模型。相同的子域可以由无数的建模选择表示。
由于有界上下文是一个模型,因此它可以包含来自多个子域的概念。或者可以将单个子域建模为多个有界上下文。
 
(banq注:领域或子域存在于人们从问题空间到解决方案空间的解决与设计过程中。Mathias:问题空间是我们无法接触的一切,解决方案空间是我们可以做出选择的一切。)

为什么问题空间与解决方案空间如此重要?