什么是DDD领域驱动设计的统一语言?


统一语言也称为无处不在的语言、通用语言、泛在语言,无处不在的语言是在有界的上下文中建模的,在其中标识表达了业务领域的术语和概念,并且不应该有歧义。
无处不在的语言是Eric Evans在“域驱动设计 - 处理软件核心中的复杂性”中使用的术语,用于构建由团队,开发人员,领域专家和其他参与者共享的语言。
无论您的软件是如何设计的,都需要在分隔的上下文中反映清晰且建模的泛在语言。
要产生清晰的无所不在的语言,您必须了解更多业务。

无所不在的语言的特征

  • 无处不在的语言必须在领域模型中表达。
  • 无处不在的语言统一了项目团队的员工表达语言。
  • 无所不在的语言消除了领域专家的不准确和矛盾。
  • 无所不在的语言不是领域专家强加的业务语言。
  • 无处不在的语言不是行业中使用的语言。
  • 无处不在的语言随着时间的推移而发展,它并不是完全在一次会议中定义的。
  • 应该拒绝不属于泛在语言的概念。

常见问题
我想强调我们应该避免的想法:

  • 由于缺少通用语言导致“翻译”,这对域模型不利,并导致错误的域模型的创建。
  • 由于缺乏共同语言,团队成员使用不同的术语而没有意识到。
  • 即使存在,也不使用普遍存在的语言进行通信。
  • 由技术团队创建用于构建域模型的抽象,域专家无法理解。
  • 技术团队无视领域专家参与领域模型,认为对领域专家而言过于抽象。但域专家必须参与,因为谁可以验证构建的域模型?

如何开发无所不在的语言?
你可能会问自己:但是如何开发无所不在的语言?有什么方法?谁参与了?有什么过程?
第一点是即使是领域专家也可能彼此不同意,只有通过公开讨论,分析现有文档,词典,标准等,我们才能提出更好的语言。

  1. 画:在白板上表达您的业务领域,不要担心它们是否是正式设计。
  2. 创建词汇表:定义开发所有术语的词汇表。
  3. 使用事件风暴:领域专家和开发人员可以使用Event Storming实现业务流程学习的快速循环,从而促进泛在语言的发展。
  4. 查看并更新:准备好以敏捷方式查看和更新​​生成的内容。

这些只是开发泛在语言的第一步。

沃恩弗农说:
代码是无所不在的语言的持久表达,准备放弃难以及时更新的图纸,术语表和其他文档。

代码需要表达无所不在的语言
想象一下,您正在开发电子商务系统,产品所有者提出以下要求:
“系统必须允许更改客户的电子邮件。”
简单,不是吗?但是你会如何在代码中表示这一点?
以下是一个实施示例:

public class People : Entity
{
    public string Name { get; set; }
    public string Email { get; set; }
    ...

    public void Update(string name, string email, ...)
    {
        if(!string.IsNullOrEmpty(name))
        {
            Name = name;
        }

        if(!string.IsNullOrEmpty(email))
        {
            Email = email;
        }

        ...
    }
}

你怎么看待这段代码?你认为它真的反映了无所不在的语言吗?
请记住,聚合,值对象,领域服务,存储库,命令,事件等需要表达泛在语言。

请参阅下面反映泛在语言的代码示例:

public class Client : Entity
{
    public string Name { get; private set; }
    public string Email { get; private set; }
    ...

    public void ChangeEmail(string email)
    {
        Email = email;
    }
}