什么是泛在语言UL:Ubiquitous Language? - Jonathan


泛在语言(无处不在的语言UL:Ubiquitous Language) 是 DDD 核心的一个强大的想法。但领域语言并不总是能满足我们的领域需求,有时“标准”对于实际工作更具吸引力。

泛在语言是一种通用的、严格的语言,由程序员、设计师和领域专家在一个单一的语境上下文内共享和商定。它是由Eric Evans在他的《领域驱动设计(DDD)》一书中提出的。应对软件核心的复杂性。


UL谱系
1、自然语言(左端 领域语言)

  • - 领域语言
  • - 特定领域的语言
  • - 现实世界的抽象
  • - 抽象和代数数据类型
  • - 设计模式
  • - 标准词汇表
  • - 内置数据抽象
  • - 原始数据类型
  • - 通用语言
  • - 符号语义学

无处不在的语言和领域语言经常被交替使用,但它们并不一样。
领域语言是由领域专家和在该领域工作的人使用的自然语言。它有时是混乱的,可以在没有协议或严谨的情况下引入,这导致了领域概念的模糊性。

类型类为标准接口的不同实现提供了一种机制[基于标准词汇表]。许多这些接口是建立在数学传统上的,因此不仅有类型的规律性,而且有必须成立的属性(规律)。
“类型类提供了一种方便的方式,通过标准词汇表将接口的一部分打包"。- Conal Elliott 8

标准词汇表是由Conal Elliott在其关于指称设计的工作中引入的,作为一种精确、简单和引人注目的规范,在不纠缠的情况下指导使用和实施。一个建立在指称语义学和类型类之上的代数抽象。
库包设计者可以将一个类型的部分界面呈现为标准类型类的实例,这样就为库包的用户提供了 "标准词汇",从而使库包更容易学习

无处不在的语言UL和标准词汇的想法都不是万能的,它们实际上可以在同一领域内共存。
例如,无处不在的语言在核心商业模式中找到了自己的位置,在那里,新颖性是必须的。相反,标准词汇是设计关键软件系统的完美匹配,在那里严格的规范和验证是必须的。

无所不在的语言UL并不意味着'不那么严格',而标准词汇也不是'循规蹈矩'。在任何情况下,我们都不能滥用其中之一,这完全取决于用例和领域的需求。问题在于完全强迫它们,或者认为它们是理所当然的。

2、形式化Formal (右端:编程语言或DSL)
"DSL是一种专门针对某个领域的可编译语言。这是泛在语言(UL)的另一端。- Eric Evans

(领域语言 - UL - DSL)


讨论

1、 "原始数据类型 "可以成为我的领域的一部分吗?
有一种罕见的可能性,即原始数据类型可以成为 "算术 "领域的一部分,例如,它可以由参与该领域的所有人同意。

2、DDD与设计模式:
"设计模式与领域无关:如果你有一个Visitor模式,'visitor'在大多数时候并不是你的泛在语言UL的一部分,除非你正在构建一个编译器。"- — Cyrille Martraire

3、”你不能将语义与领域建模分开。一个'名字'永远不会只是一个字符串"。- Will Sargent

4、软件工程中的过度建模偏差:比如假设世界上所有人都有一对姓氏和名字。
"你可以将某人的姓氏声明为一个String[30],这很可能是它被存储的方式,但定义一个'surname'类型将更能显示出意图。"- 丹尼尔-特霍斯特-诺斯的《领域语言中的代码》。