文章目录
ChatGPT实战100例 - (18) 用事件风暴玩转DDD
一、标准流程
事件风暴(Event Storming)是一种DDD的实践方法,核心思想是通过大量的黏贴纸来描述和组织业务流程及事件,以此来促进团队成员对业务领域的理解和沟通。
以下是通过事件风暴进行DDD的标准流程:
-
定义目标和范围:明确本次事件风暴的目标是什么,范围覆盖哪些业务流程,参与人员包括哪些角色(如业务专家、开发人员、产品经理等)。
-
准备工具和环境:需要一张大的白板或者海报纸,各色标签贴纸、记号笔等。一般用橙色表示事件,蓝色表示命令,红色表示聚合等。
-
列举业务事件:让所有参与者一起列举出他们能想到的所有业务事件,并用黄色便签纸写下事件的名称,贴在白板上。事件应描述为“某某已经发生”,比如“订单已创建”、“支付已完成”等。
-
组织和排序事件:将列出的事件按照它们发生的顺序和关联性进行组织和排序。把相互关联的事件放在一起,形成一个业务流程。
-
确定聚合:找出那些影响事件发生的对象,这些就是可能的聚合。聚合负责保证业务规则的一致性。
-
引入命令:确定哪些命令会导致事件的发生,用蓝色便签纸表示。命令是对聚合的一个操作,它会改变聚合的状态并可能触发事件。
-
明确界限上下文:根据业务流程的不同,划分出不同的界限上下文。
-
识别领域事件和领域服务:找出流程中的领域事件和领域服务,领域事件表示业务流程中的重要变化,领域服务则是无法归类到聚合的一些业务操作。
-
验证和修正模型:让业务专家验证这个模型是否符合实际的业务流程,不断迭代和修正模型。
-
生成并验证软件设计:根据事件风暴的结果生成软件设计,然后通过编码和测试来验证设计的正确性。
二、定义目标和范围
定义目标和范围:明确本次事件风暴的目标是什么,范围覆盖哪些业务流程,参与人员包括哪些角色(如业务专家、开发人员、产品经理等)。
好的,关于网页打印小程序的设计,以下是更具体的目标和范围定义:
目标:
- 明确用户如何使用小程序完成网页打印的全流程。
- 揭示网页打印的主要业务逻辑和关键操作。
- 确定主要的领域模型,包括相关的事件、命令和聚合。
范围:
- 用户如何在小程序中选择或输入网页地址。
- 用户如何设置打印参数,比如打印的页数、颜色、纸张大小等。
- 小程序如何处理打印请求,包括生成打印预览、提交打印任务等。
- 如何反馈打印进度和结果给用户。
- 在出现问题时,如何处理异常和错误。
这样的定义可以帮助我们更清晰地理解和划分业务流程,为后续的事件风暴步骤奠定基础。
三、准备工具和环境
准备工具和环境:需要一张大的白板或者海报纸,各色标签贴纸、记号笔等。一般用橙色表示事件,蓝色表示命令,红色表示聚合等。
四、列举业务事件
列举业务事件:让所有参与者一起列举出他们能想到的所有业务事件,并用黄色便签纸写下事件的名称,贴在白板上。事件应描述为“某某已经发生”,比如“订单已创建”、“支付已完成”等。
使用事件风暴的方法,我们可以列举如下的业务事件:
-
网页地址输入事件:当用户在输入框中输入或粘贴网页地址时触发。
-
打印参数设置事件:当用户设置了打印页数、颜色、纸张大小等打印参数时触发。
-
打印预览生成事件:当系统根据用户输入的网页地址和设置的打印参数生成打印预览时触发。
-
打印任务提交事件:当用户确认打印预览无误,点击“打印”按钮提交打印任务时触发。
-
打印进度更新事件:当打印任务的进度发生变化时触发。例如,当打印任务被添加到打印队列,或者正在打印,或者打印完成。
-
打印结果反馈事件:当打印任务完成,系统生成打印结果并反馈给用户时触发。
-
打印记录保存事件:当用户选择保存打印记录时触发。
-
网页加载失败事件:当系统无法加载用户输入的网页地址时触发。
-
打印异常事件:当打印过程中出现问题时触发。例如,打印机缺纸,打印任务被取消等。
五、 组织和排序事件
这是一种可能的顺序和关联性组织:
- 网页地址输入事件
- 网页加载失败事件(如果适用)
- 打印参数设置事件
- 打印预览生成事件
- 打印任务提交事件
- 打印进度更新事件
- 打印异常事件(如果适用)
- 打印结果反馈事件
- 打印记录保存事件
当使用plantuml来展示这一流程时,代码可能如下:
@startuml
:网页地址输入;
if (网页加载失败) then (yes)
:处理失败事件;
stop
else (no)
:打印参数设置;
:打印预览生成;
if (打印预览确认) then (yes)
:打印任务提交;
:打印进度更新;
if (打印异常) then (yes)
:处理异常事件;
else (no)
:打印结果反馈;
:打印记录保存;
endif
else (no)
stop
endif
endif
@enduml
这将创建一个流程图,显示了各个业务事件的流程和可能的决策点。
六、确定聚合并引入命令
确定聚合:在上述事件中,可能的聚合有:
- 打印任务:包含了文件、打印参数、打印进度等信息,聚合的业务规则包括打印参数必须完全、打印进度必须是有序的等。
- 用户:产生打印任务的发起者,聚合的业务规则包括用户必须存在、用户的打印权限等。
引入命令:对应的命令可能有:
- 创建打印任务:用户提交打印任务后,系统需要创建打印任务。
- 更新打印进度:当打印任务开始执行后,需要更新打印进度。
- 完成打印任务:当打印任务完成后,需要更新打印任务的状态并通知用户。
- 保存打印记录:在打印完成后,用户可以选择保存打印记录。
- 加载网页:在用户输入网页地址后,系统需要加载网页并生成预览。
- 设置打印参数:用户在提交打印任务前,需要设置打印的参数。
七、明确界限上下文
明确界限上下文:根据业务流程的不同,划分出不同的界限上下文。
在这个业务场景中,我们可以划分出以下几个界限上下文:
-
网页加载上下文:负责处理用户输入的网页地址,加载网页并生成预览。
-
打印任务上下文:负责处理打印任务的创建,参数设定,进度更新和任务完成等操作。
-
打印结果反馈上下文:负责打印任务完成后,生成打印结果并反馈给用户。
-
打印记录保存上下文:负责在打印完成后,保存打印记录。
在这些界限上下文中,不同上下文的聚合可能存在交互和通信,例如,打印任务上下文中的“打印任务”聚合在打印完成后,可能需要与“打印记录保存”上下文中的“打印记录”聚合进行交互,保存打印记录。但界限上下文之间的交互应保持尽可能的松耦合,以保持系统的灵活性和可维护性。
八、识别领域事件和领域服务
识别领域事件:在我们的流程中,我们可以识别出以下的领域事件:
网页加载完成:这是用户提供的网页地址被成功加载的标志。
打印预览已生成:这表示针对用户设置的打印参数,预览已经成功生成。
打印任务已提交:用户提交打印任务,准备开始打印。
打印进度已更新:打印任务的状态改变,如:开始打印、打印中、打印完成等。
打印结果已反馈:打印任务完成后,结果被反馈给用户。
打印记录已保存:用户选择保存打印记录后,记录被成功保存。
识别领域服务:这些是一些无法归类到具体聚合,但又对业务流程至关重要的操作:
网页加载服务:负责根据用户提供的网页地址加载网页。
预览生成服务:根据用户设置的打印参数,生成打印预览。
打印服务:负责处理打印任务,包括打印进度的更新和打印结果的生成。
记录保存服务:在打印完成后,根据用户的选择,保存打印记录。
九、验证和修正模型
验证和修正模型:
- 业务专家可以对模型进行验证,确保它符合实际的业务流程。
- 如果有任何不完善的地方,可以进行修正和优化。
- 不断重复这个过程,直到模型完全符合业务需求。
十、生成并验证软件设计
生成并验证软件设计:根据事件风暴的结果生成软件设计,然后通过编码和测试来验证设计的正确性。
生成并验证软件设计:
- 生成代码:根据事件风暴的结果,生成相应的代码。
- 编写测试用例:根据业务流程和事件,编写相应的测试用例。
- 运行测试用例:运行测试用例,验证代码的正确性。
- 持续迭代和优化:根据测试结果,不断优化和迭代代码,直到代码完全符合业务需求。
十一、总结
-
事件风暴是一种DDD的实践方法,通过大量的黏贴纸来描述和组织业务流程及事件,以此来促进团队成员对业务领域的理解和沟通。
-
事件风暴的过程包括定义目标和范围、准备工具和环境、列举业务事件、组织和排序事件、确定聚合、引入命令、明确界限上下文、识别领域事件和领域服务、验证和修正模型、生成并验证软件设计等步骤。
-
AI真香!