《平凡的DDD》第三弹: 理解并使用通用语言

1,268 阅读4分钟

前面说过,通用语言(Ubiquitous Language)是一种通用的面向业务的语言,也是DDD设计中的一项基础且关键的实践,其主要目标是避免误解和错误的认知。作为一种语言,如果每个人都能理解它,那么它可以使人们确信他人所讲的内容,所以理解并掌握通用语言是实践DDD的必备技能。事实上,即使不谈DDD,但凡对写代码有点讲究,通用语言也应该成为日常项目开发中的一部分,否则很容易出现“乱讲话”、“乱命名”的情况。

一、通用语言是什么?

那么,在一个项目中,通用语言是什么呢?理解通用语言是什么,可以遵循下面三条原则:

  • 领域中特有(domain-specific)的词汇:比如名词、动词、形容词、习惯性表达的固定词汇,甚至是副词;
  • 和项目中的所有参与方共享:毕竟通用语言的首要目标是避免误解和歧义;
  • 在日常的书面文稿和口头沟通中都会使用它:它是组织范围内的共同语言。

二、如何定义通用语言?

在接到一个需求后,你大概就可以开始定义通用语言了。识别并定义通用语言可以注意以下几点:

  • 自然语言,非个人主观臆造
  • 可以来自于与领域专家的对话或头脑风暴,也可以来自于产品文档、行业专业术语站点等
  • 非一蹴而就,在整个过程中不断地迭代、完善
  • 用词明确无歧义,通俗易懂
    • 满足领域专家的期望;
    • 满足技术人员的期望。

需要注意的是,通用语言中的所谓通用(Ubiquitous),你大致可以把理解为“使用无处不在(Used Everywhere)”。也就是说,一旦定义了通用语言,就应该在任何地方都使用它,比如产品文档、用户故事、会议中、邮件中、技术方案、代码中,尤其是代码中更需要使用。

通用语言定义简单示例

  • 新增(Add) 预约记录 --> 提交(Submit) 预约
  • 删除(Delete) 试驾预约记录--> 取消(Cancel) 预约
  • 试驾活动状态设置(Set State) --> 开始(Start)/结束(End) 试驾活动
  • 试驾预约(Subscribe) --> 预约(Appointment)

三、通用语言怎么管理

对于定义好的通用语言,在管理上并没有固定的做法。你可以根据组织现有的文档管理机制进行有效管理,不过下面的几点仍然可以供你参考:

  • 将通用语言列表按照组织标准统一保存到正式文档中:
    • 列表中的每个术语都应该有着清晰的解释和定义
    • 列表中的每个术语都应该有着明确的对应的英文词汇
    • 列表应该对组织内所有人开放。
  • 通用语言列表文档需要持续更新
    • 列表会随着时间的推进、领域的变化或对领域理解的加深而不断变化;
    • 这是产品与技术团队的职责之一。

四、通用语言指导模型设计

在设计领域模型时,绕不开对通用语言的定义使用。比如,模型中使用了某个关键概念,那么这个概念必然存在于通用语言中。对此,Eric认为应该将模型作为语言的主干,即:

Use the model as the backbone of a language.

通俗地讲,就是发现通用语言的过程,可以帮助你理解领域逻辑,并且有助于模型设计。

五、什么时候应该创建通用语言?

虽然通用语言很重要,但也并非应该在所有的场景中创建并使用,一刀切反而会增加不必要的开发负担。以下几个场景你可以考虑创建:

  • 确实有很多领域逻辑需要消化,也就是逻辑逻辑确实比较复杂的场景。这样的场景,你需要创建独立且标准的通用语言,并且要持续维护。定义好的通用语言,应该同步到相关同学,无论是产品、服务端、前端都应该遵守使用相同的表述
  • 领域逻辑还没有被完全定义时,对领域的认知还在持续中,此时创建领域通用语言可以很好的帮助梳理领域逻辑
  • 以上两个场景适用于组织级别对通用语言的管理,除了以上两个重要场景外,在日常开发中还有很多非核心业务,它们本身不是很杂,但又普通存在。针对这类场景,不必在固定的地方管理通用语言,但可以考虑把它们放到技术方案等过程文档中,对通用语言的识别和定义,往往可以反应出对业务的认知程度,对后来人理解业务也是很有帮助的。

关注公众号【MetaThoughts】,及时获取专栏文章更新通知。

如果本文对你有帮助,欢迎点赞关注