限界上下文画布
限界上下文画布是一种协作工具,用于设计和记录单个限界上下文的设计。
如果你不确定什么是限界上下文,可以查看Eric Evans的DDD参考和Martin Fowler的文章。
画布通过要求你考虑并选择其设计的关键元素,从命名到职责,再到公共接口和依赖关系,引导你完成限界上下文的设计过程。
下载空白画布模板。
摘要
如何使用
要快速开始使用限界上下文画布,请按照章节定义中呈现的顺序完成画布 首先填写画布的名称和描述,用一两句话阐明其存在的理由和主要职责。然后你可以按任意顺序填写画布的其他部分。你可以从外向内设计,从入站通信开始;或从内向外设计,从业务规则和领域语言开始。 你可能没有足够的信息来完成画布的某些部分。在这种情况下,你需要使用其他建模技术来找到所需的信息。
替代格式
上面展示的默认限界上下文画布格式并不是唯一的格式,以下是其他格式。也欢迎你尝试新的和创新的格式。
- 用例泳道:这种风格将通信部分组织成泳道,以以下格式显示交互发生的顺序:输入消息 -> 做出决策 -> 输出消息
板块定义
以下是画布各个板块的简要说明。
名称
命名很难。写下你的上下文名称并在团队中达成一致,将为你设计上下文提供框架。
目的
用几句话描述上下文的原因和内容,使用商业语言。这里不涉及技术细节。 写下目的迫使你清晰地表达模糊的想法,并确保团队中的每个人都达成共识。 从商业角度描述目的,你也可以列出这个限界上下文为谁提供价值的关键角色。
战略分类
这个上下文对你组织的成功有多重要?:
- 核心领域:关键战略举措
- 支持领域:必要但不是差异化因素
- 通用领域:许多领域中常见的能力
这个上下文在你的商业模式中扮演什么角色:
- 收入生成器:人们直接为此付费
- 参与度创造者:用户喜欢但不为此付费
- 合规执行者:保护你的业务声誉和存续
这个概念的演进程度如何(参见Wardley Maps):
- 创生期:新的未探索领域
- 定制构建:公司正在构建自己的版本
- 产品:存在具有差异化的现成版本
- 商品:存在高度标准化的版本
关于创生期、定制构建、产品和商品的详细描述,请参见Wardley Maps演进定义。 填写画布的这一部分时,可参考核心领域图表。
领域角色
如何描述这个限界上下文的行为?它是接收大量数据并将其转化为洞见的分析上下文吗?还是执行工作流的执行上下文?识别上下文扮演的不同角色可以帮助避免职责耦合。
查看Alberto Brandolini的限界上下文原型和Rebecca Wirfs-Brock的对象角色原型以深入分析这个领域。模型特征工作表包含社区生成的角色示例(模型特征是领域角色的前身)。
入站通信
入站通信代表由其他协作者发起的协作。
消息
消息是一个协作者发送给另一个协作者的信息。限界上下文之间可以发生三种类型的对话:执行某事的请求(命令)、请求某些信息(查询)或通知某事已发生(事件)。
这里的"消息"一词是泛指,不局限于任何特定实现。不一定要求使用消息总线或异步工作流。例如,命令可以简单地通过HTTP POST方法提交HTML表单数据。
协作者
协作者是向此上下文发送消息的其他系统或子系统。它们可以是其他限界上下文、前端(网页或移动端)或其他内容。
如果限界上下文拥有用户界面(例如微前端),那么协作者类型就是直接用户交互。
关系类型
两个限界上下文之间的关系类型表明模型和团队如何相互影响。参见上下文映射了解关系类型。
组织为泳道
协作者可以被组织成水平泳道,显示他们发送的消息。
出站通信
出站通信代表由该上下文发起的、与其他协作者互动的协作。适用与入站通信相同的消息类型和表示法。
通用语言
这个上下文中存在哪些关键领域术语,它们的含义是什么?
业务决策
这个上下文中的关键业务规则和政策是什么?
假设
你在设计决策时永远不可能对领域中的一切都了如指掌。大多数设计都是基于假设进行的,强烈建议将这些假设明确化。可以在限界上下文设计画布的这个部分做到这一点。
验证指标
领域驱动设计是一种基于持续学习的迭代建模和设计方法。指标可以帮助你收集有价值的学习输入(想想构建-测量-学习循环)。考虑你和你的团队可以定义哪些指标,以了解所选择的限界上下文边界是否合适。
你可以从以下来源收集这些指标:
- 你的CI / CD环境
- 像JIRA这样的工具
- 从你的线上系统
开放问题
如果在进行研讨会时有一些问题房间里没人能回答,你可以将它们输入画布的这个部分。这样可以确保不遗漏任何开放问题,同时也可以直观地了解团队对给定限界上下文设计的确定程度。大量问题表明存在高度不确定性。
示例
以下是一个填写完整的限界上下文画布。
工具
以下是一些可以帮助你使用限界上下文画布的工具。
HTML版本
一个画布的HTML版本,你可以在浏览器中编辑,并与你的代码一起在源代码控制中进行版本管理。由Nelson da Costa贡献。
Miro版本
一个免费的MiroHQ模板,用于限界上下文画布。
目前在Miroverse上的模板版本是v4。同时,你可以从本仓库下载Miro板的备份。
draw.io版本
一个draw.io画布模板,包含限界上下文画布作为模板。
Excalidraw版本
一个Excalidraw画布模板,包含限界上下文画布作为模板。
设计技巧
通过在画布上展示限界上下文设计的重要元素,你可以更容易地质疑和改进设计。以下是一些帮助你质疑和改进设计的技巧。
欢迎通过创建拉取请求分享你的技巧。
通用技巧
- 尝试将画布上的某些内容移到另一个上下文中。这会如何影响设计?
接口设计技巧
限界上下文的公共接口是它与系统其他部分的契约。契约对协作者有重大影响,且难以更改,因此良好的设计至关重要。以下是一些帮助你评判限界上下文接口设计的技巧。
- 消息的命名是否与彼此以及上下文的描述保持一致?
- 每种消息类型是否最优(例如,命令是否应该是事件)?
- 接口是否过大(过多独特的消息类型)?
- 上下文是否暴露了过多内部细节?
- 是否有任何消息看起来应该属于其他地方?
额外资源
翻译
贡献者
感谢所有现有和未来的贡献者,以及以下为限界上下文画布做出贡献的个人:
- Kenny Baas
- Kim Lindhard
- Michael Plöd
- Maxime Sanglan-Charlier 限界上下文画布的一个重要灵感来源是商业模式画布。
贡献和反馈
您可以免费使用有界上下文画布。此外,我们欢迎您提供反馈和想法,以改进画布或创建新版本。
欢迎您也向我们发送包含您的示例或新翻译的拉取请求。
本作品采用知识共享署名 4.0 国际许可协议进行许可。