| name | ubiquitous-language |
| description | 从当前对话中提取 DDD 风格的通用语言词汇表,标记歧义并提出规范术语。保存到 UBIQUITOUS_LANGUAGE.md。当用户想要定义领域术语、构建词汇表、固化术语、创建通用语言,或提到 "领域模型" 或 "DDD" 时使用。 |
| disable-model-invocation | true |
通用语言
从当前对话中提取并规范领域术语,整理为一致的词汇表,保存到本地文件。
流程
- 扫描对话,找出与领域相关的名词、动词和概念
- 识别问题:
- 同一词语用于不同概念(歧义)
- 不同词语用于同一概念(同义词)
- 模糊或含义过载的术语
- 提出规范词汇表,做出有主见的术语选择
- 写入
UBIQUITOUS_LANGUAGE.md,保存到工作目录,使用以下格式
- 在对话中输出摘要
输出格式
编写一个结构如下的 UBIQUITOUS_LANGUAGE.md 文件:
# 通用语言
## 订单生命周期
| 术语 | 定义 | 应避免的别名 |
| ------------ | ------------------------------------ | --------------------- |
| **订单** | 客户购买一件或多件商品的请求 | 购买、交易 |
| **发票** | 交货后发送给客户的付款请求 | 账单、付款请求 |
## 人员
| 术语 | 定义 | 应避免的别名 |
| ------------ | ------------------------------------ | --------------------- |
| **客户** | 下订单的个人或组织 | 买方、账户 |
| **用户** | 系统中的认证身份 | 登录、账户 |
## 关系
- 一个**发票**仅属于一个**客户**
- 一个**订单**产生一个或多个**发票**
## 示例对话
> **开发:** "当**客户**下了**订单**,我们是否立即创建**发票**?"
> **领域专家:** "不 — **发票**只有在**履约单**确认后才生成。一个**订单**如果通过不同的**发货单**分开发货,可以产生多个**发票**。"
> **开发:** "所以如果一个**发货单**在发货前被取消,就不会产生它的**发票**?"
> **领域专家:** "没错。**发票**的生命周期与**履约单**绑定,而不是与**订单**绑定。"
## 标记的歧义
- "账户" 曾用于同时指**客户**和**用户** — 这是不同的概念:**客户**下订单,而**用户**是认证身份,可能代表也可能不代表**客户**。
规则
- 要有主见。 当同一概念存在多个词语时,选择最佳的一个,将其他列为应避免的别名。
- 明确标记冲突。 如果对话中某个术语被歧义使用,在"标记的歧义"部分明确指出来并给出清晰的建议。
- 仅包含与领域专家相关的术语。 跳过模块或类的名称,除非它们在领域语言中有意义。
- 保持定义紧凑。 最多一句话。定义它是什么,而非它做什么。
- 展示关系。 使用粗体术语名称,并在明显时注明基数关系。
- 仅包含领域术语。 跳过通用编程概念(数组、函数、端点),除非它们具有特定领域的含义。
- 当出现自然分组时,将术语分组到多个表格中(例如按子域、生命周期或参与者)。每个分组有其自己的标题和表格。如果所有术语属于单一内聚领域,一个表格即可 — 不必强行分组。
- 编写一段示例对话。 一段开发者和领域专家之间的简短对话(3-5 轮交流),展示术语如何自然地交互。对话应澄清相关概念之间的边界,并展示术语被精确使用。
示例对话
开发: "如何在没有 Docker 的情况下测试同步服务?"
领域专家: "使用文件系统层代替Docker 层。它实现了相同的沙箱服务接口,但使用本地目录作为沙箱。"
开发: "所以 sync-in 仍然会创建一个打包文件并解压它?"
领域专家: "没错。同步服务不知道它在与哪个层对话。它调用 exec 和 copyIn —— 文件系统层只是将它们作为本地 shell 命令来运行。"
重新运行
在同一对话中再次调用时:
- 阅读已有的
UBIQUITOUS_LANGUAGE.md
- 纳入后续讨论中的任何新术语
- 如果理解有所演进,更新定义
- 重新标记任何新的歧义
- 重写示例对话以纳入新术语