目录
概述
统一语言是在有限的上下文中建模,其中确定了业务领域的术语和概念。
统一语言的目的是构建一种由团队、开发人员、领域专家和其他参与者共享的语言。
要开发统一语言必须先充分了解业务
存在的问题
- 领域专家有自己的语言,而开发人员可以有自己的语言来讨论领域。这意味着语言的不统一,从而对项目产生影。
- 同一个人在记录或在演讲中使用一个术语时,可以以不同的方式表达一个术语。这就产生了知识痛苦的贫血。
- 缺乏共同语言,产生“翻译”,这对领域模型不利,并导致创建错误的领域模型
- 由于缺乏共同语言,团队成员在不知不觉中使用了不同的术语。
- 即使团队有统一的语言也会存在不使用统一语言交流的现象
- 领域专家所不理解技术团队为构建领域模型而创建的抽象
- 技术团队忽视了领域专家对领域模型的参与,认为它对于领域专家来说过于抽象。但是领域专家的参与是必要的,因为他们能够验证构建的领域模型
解决方案-统一语言
- 在图表、文档和演讲中使用统一语言
- 通过对话消除和解决术语和表达上的混淆
- 模型和统一语言必须始终保持一致
- 概念思维是关键
- 从统一语言到概念模型
统一语言的特点
- 统一语言必须在领域模型中表达
- 统一语言消除了领域专家的不准确和矛盾
- 不属于统一语言的概念应该被拒绝
如何开发统一语言
您可能在问自己:如何开发统一语言?有些什么方法?谁参与?有哪些过程是
第一点是,即使是领域专家也可能存在分歧,只有通过公开讨论、分析现有文档、词典、标准等,我们才能提出更好的语言
提取概念
画图
在白板上表达你的领域,不要担心它们是否是正式的设计。
创建术语、概念表
编制一个含有定义的所有术语的词汇表。
使用事件风暴
领域专家和开发人员可以使用事件风暴实现业务流程学习的快速循环,这有助于统一语言的开发。
构建模型
审查和更新
准备好以敏捷的方式审查和更新生成的内容。
统一语言好坏的标准
您的代码需要表达统一语言
💡
代码是统一语言最终的表达方式,准备好放弃那些难以保持最新的绘图、术语表和其他文档
想象一下,你正在开发一个电子商务系统,产品负责人提出了以下需求
““系统必须允许更改客户的电子邮件。”
下面是一个实现示例:
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;
}
}
总结
讨论、研究、概念化、开发和使用领域模型的统一语言