主要观点总结
该文章强调了统一语言在领域驱动设计中的重要性,介绍了统一语言的定义、组成部分以及其在领域模型中的角色。文章还通过案例解释了统一语言在团队交流、需求描述、领域模型构建等方面的应用,并阐述了统一语言与限界上下文的关系。最后,文章总结了统一语言的本质和价值。
关键观点总结
关键观点1: 统一语言是领域驱动设计中的核心原则。
统一语言指导着领域建模,有助于团队成员之间达成共识,消除误解和分歧。
关键观点2: 统一语言的组成部分包括领域概念、领域行为和业务规则的术语。
这些术语用于描述和明确领域知识,是领域模型的重要输入。
关键观点3: 统一语言的价值体现在战略阶段的限界上下文与战术阶段的领域模型。
限界上下文成为语言的边界,在其边界内维持的统一语言可以有效消除分歧与误解。
关键观点4: 需求描述和术语表是领域模型的重要输入,领域模型是统一语言的支柱。
清晰的领域模型和统一语言有助于企业知识的积累和传承。
关键观点5: 统一语言不仅适用于领域驱动设计,也适用于软件研发过程的各个阶段。
统一语言对于任何强调沟通和团队协作的软件开发方法都具有重要意义。
正文
《领域驱动设计》一书在第2章就特别强调了
交流与语言的使用
,并提出了
统一语言(Ubiquitous Language)
这一模式。虽说Eric Evans并没有在该书清晰给出统一语言的定义,但从字里行间,我们可以得出如下结论:
统一语言是开发团队与领域专家对问题域展开交流时所使用的共同的交流语言,它将清晰地明确领域概念、领域行为和业务规则,并在各个团队角色之间达成共识,形成的统一语言将是领域模型的唯一参考。
统一语言的重要性无论如何强调都不为过,它的质量直接影响领域模型的质量,我甚至认为它提供了领域建模的方法,得到的领域模型实则就是
对统一语言进一步抽象和精炼的结果
。
组成统一语言的重要组成部分是准确表达领域概念、领域行为和业务规则的术语。Eric就在《领域驱动设计》一书中明确指出:“统一语言的词汇包括类和主要操作的名称。语言中的术语,有些用来讨论模型中已经明确的规则,还有一些则来自施加于模型上的高级组织原则。……模型之间的关系成为所有语言都具有的组合规则。词和短语的意义反应了模型的语义。”
图中左侧所示的统一语言除了包括需求描述与术语表,各个团队角色之间的交流内容也属于统一语言的一部分,实际上,需求描述不过是这些交流内容的形式化表述而已。
Naresh Bhatia在Medium上发表了关于DDD的系列文章(https://www.nareshbhatia.dev/articles/domain-driven-design)就提出:
领域模型使用统一语言为领域提供了丰富的可视化视图,并确保了精确地实现业务需求。
他在文中用形象的卡通画表达开发人员与领域专家之间的交流。这是来自金融行业的案例,第一幅图如下所示:
图中对话内容中标记为红色的部分,体现了清晰的领域概念,并组成了统一语言的术语表。注意对话中的contains和owned,它们还表达了领域概念之间的关系。
领域专家提出了“Lot”的概念,并标明每购买一份有价证券(Security),都会产生一份新的Lot(即证券交易的一手),卖出时,股票(Share)需要从现有交易的一手中取出,如此才能计算出收益(Gain)。这一描述同时也说明了Security、Lot与Share之间的关系,顺着这样交流下去,也能逐步弄清楚计算收益的规则。
开发人员要善于发现领域概念,并在与领域专家达成一致意见后,将其及时地加入到统一语言和领域模型中。如下图所示:
通过以上开发人员和领域专家之间的沟通,可以快速得到如下所示的领域模型:
我将这样的领域模型称之为“
领域分析模型
”,它主要体现
领域概念以及概念之间的关系
。接下来,运用DDD方法将它们识别为实体或值对象,并由此设计出聚合,同时,找出作为补充的领域服务,共同构成领域设计模型。从领域分析模型到领域设计模型是DDD专家要完成的,但在分析需求并得到领域模型的过程中,统一语言扮演了非常重要的角色。
但我并不打算止步于此,尤其是Naresh Bhatia的案例似乎传递出一种错觉,让人以为
统一语言就是术语
表。这一认识未免显得狭隘,它无疑缩小了统一语言的作用,轻视了统一语言的价值。
我认为:
统一语言是描述领域知识时需要遵循的最高原则
。上述提及的领域概念、领域行为和业务规则都是领域知识,而所谓的“描述”,包括了:
-
-
绘制在白板或绘图工具上形成的各种文字与图形(主要是UML模型图)
-
-
包括领域层产品代码与测试代码在内的领域模型
当我们口头交流领域知识时,需要遵循统一语言;当我们尝试用文本或图形表达领域知识时,需要遵循统一语言;当我们用领域模型表达领域知识,尤其是通过代码表达领域知识时,还是需要遵循统一语言。统一语言传递的基本原则包括:
只要在描述领域知识,就应该时刻提醒自己:
这些描述遵循了统一语言吗?
换言之,就是不断质问:描述的领域知识正确吗?达成一致了吗?使用了业务语言吗?
我们还不能忽略
在战略设计过程中统一语言的价值
,因为我们必须清晰地认识到,
限界上下文(bounded context)不仅是领域模型的边界,还是语言的边界
。
我常常将bounded context中的context理解为“
语境
”,也就是用语言表达领域知识时所处的上下文。不少人或许都看过罗永浩到StarBucks点咖啡的搞笑桥段。在StarBucks店员的语境(注意,是指中文交流的语言表述)中,只有三种size,分别是中杯,大杯和超大杯:
而在罗永浩的点单语境中,他理解的“中杯”,实际是目前柜台上看到的三种杯型中位于中间尺寸的中杯(即店员所谓的大杯):
两个人在完全不同的语境中争论着“中杯”的含义,犹如鸡同鸭讲,当然没法沟通,郁闷到只有自扇耳光以泄愤了:
这充分体现统一语言对促进语言一致性的价值了!二者之所以出现分歧,实际上是因为对“中杯”的不同理解,店员口中的中杯是StarBucks的“中杯”,罗老师的中杯实则指的是“中间杯型”。