事件风暴法
事件风暴法是一种以事件为核心的领域建模方法,适用于捕捉复杂系统的业务逻辑,并将其转化为可操作的领域模型。该方法通过识别系统中的关键事件,逐步推导出命令、行动者、策略、聚合、系统交互等领域元素,从而形成一个完整的系统设计。
事件风暴法的核心问题
在复杂系统的设计中,往往存在以下关键问题:
- 如何准确捕捉业务需求:确保业务需求得到准确表达,并为系统实现提供指导。
- 如何构建有效的领域模型:确保领域模型全面覆盖业务逻辑,并能够支撑系统的运行。
- 如何建立团队的统一语言:确保团队成员之间在讨论系统时使用一致的术语,避免沟通误解。
事件风暴法通过系统化的步骤来解决这些问题,将业务需求转化为技术实现。
事件风暴法的关键概念
在事件风暴法中,我们需要理解以下核心概念:
-
行动者(Actors):系统的使用者,可能是现实中的人,也可能是其他系统。这些行动者发起系统中的关键行为。
-
命令(Command):由行动者发起的行为,通常代表某种决定,是事件的起因。命令通常以“动词 + 名词”的形式表示,例如“注册用户”。这种命名方式体现了行动者在系统中的主动性。
-
事件(Event):系统中发生的行为或状态变化,是命令执行后的结果。事件以“名词 + 动词被动式”的形式表示,例如“用户已注册”。这种命名方式反映了系统状态的变化。
-
聚合(Aggregate):领域驱动设计(DDD)中的核心概念,表示一组相关的领域对象。在事件风暴中,聚合可以泛指某些领域概念,不需要在初期细化。
-
系统(System):指不需要了解细节的第三方系统。在建模时,这些系统可以被视为一个整体,不需深入细节。
-
阅读模型(Read Model):用于支撑决策的信息结构,通常与界面布局有关,决定了系统如何为用户或其他系统展示信息。
-
策略(Policy):对事件的响应,通常表示不属于某些聚合的逻辑。策略可以触发新的命令,这些命令称为系统触发命令(SIC, System Initiated Command)。
事件风暴法的流程
事件风暴法的流程包括以下步骤:
- 头脑风暴,寻找领域事件:通过团队讨论,找出系统中的关键领域事件。
- 根据事件寻找触发命令与行动者:分析每个事件,确定触发事件的命令及其行动者。
- 通过事件寻找策略以及由策略触发的 SIC:识别系统中的策略,并确定这些策略触发的命令。
- 根据命令与事件,寻找产生变化的聚合和生成的阅读模型:通过命令和事件,识别领域中的聚合和阅读模型。
- 完善、细化领域模型:整合前面找到的所有元素,完善领域模型。
示例:在线订餐平台
我们以一个稍微复杂的在线订餐平台为例,详细展示如何通过事件风暴法构建领域模型。
1. 头脑风暴,寻找领域事件
首先,通过头脑风暴找出在线订餐平台中的关键领域事件。事件的表达形式为“名词 + 动词被动式”,例如“用户已注册”。
领域事件示例:
- 用户已注册
- 用户已登录
- 菜单已浏览
- 餐品已添加至购物车
- 订单已提交
- 订单已支付
- 餐品已开始准备
- 餐品已送出
- 餐品已送达
这些事件涵盖了用户从浏览菜单到最终收到餐品的整个过程。
2. 根据事件寻找触发命令与行动者
接下来,分析每个事件,确定触发事件的命令和行动者。命令的表达形式为“动词 + 名词”,例如“注册用户”。
分析示例:
- 事件:用户已注册
- 命令:注册用户
- 行动者:用户(现实中的人)
- 事件:订单已提交
- 命令:提交订单
- 行动者:用户
- 事件:餐品已送出
- 命令:发出配送指令
- 行动者:系统(系统自动发出)
通过这种分析,我们能够理解系统中的关键行为及其背后的发起者。
3. 通过事件寻找策略以及由策略触发的 SIC
在处理某些事件时,系统可能会执行特定的策略(Policy)。策略是对事件的响应,并可能触发新的命令,这些命令称为系统触发命令(SIC)。
策略与SIC示例:
-
事件:订单已支付
- 策略:确认支付状态,并开始准备餐品。
- SIC:生成“餐品已开始准备”事件。
-
事件:餐品已送达
- 策略:记录配送完成状态,并通知用户。
- SIC:生成“配送已完成”的记录,并向用户发送确认通知。
通过识别策略和SIC,我们能够理解系统在处理复杂业务逻辑时的行为。
4. 根据命令与事件,寻找产生变化的聚合和生成的阅读模型
在这个步骤中,我们分析命令和事件,确定领域中的聚合和阅读模型。
聚合和阅读模型示例:
- 聚合:订单聚合
- 包含:订单详情(订单状态、餐品列表、用户信息、配送信息)
- 聚合:用户聚合
- 包含:用户信息(注册信息、历史订单、支付方式)
- 阅读模型:订单跟踪视图
- 显示:订单当前状态(准备中、配送中、已送达)、预计送达时间
通过聚合和阅读模型的构建,我们为领域模型添加了关键的结构和展示层次。
5. 完善、细化领域模型
最后一步是将以上分析的内容整合起来,逐步完善并细化领域模型。
最终领域模型示例:
- 用户(包含用户信息、历史订单)
- 订单(包含订单详情、配送信息)
- 餐品(包含餐品信息、库存状态)
- 支付(包含支付信息、支付状态)
- 通知系统(负责向用户发送通知)
总结
事件风暴法是一种从业务需求出发,通过系统化分析事件、命令、行动者、策略等领域元素,逐步构建领域模型的方法。在在线订餐平台的示例中,我们通过头脑风暴找出领域事件,分析命令和行动者,确定策略和系统触发的命令,最终构建出一个详细的领域模型。事件风暴法不仅帮助我们捕捉业务逻辑,还确保了系统设计的准确性和一致性。