配置业务流程
工作流
工作流可以理解为在有向图中从一个节点出发,一步步将业务走下去的箭头。
通过编写工作流,可以将业务表示得更清晰
调用
d.startWorkflow('流程名')
,即为开始一个新的工作流,它同时标志着上一个工作流的结束(如果有上一个)任何写在工作流下面
节点对节点的链式调用
,都会被顺序记录下来,最终反映在 Web 动画上- 是的,用链式就连上了,让人忍俊不禁
链式调用可以断开,对应着流程可以分叉,如下示例代码
工作流示例
ts
const 管理员 = d.actor(/* ... */)
const 用户前置检查服务 = d.service(/* ... */)
const 用户已创建 = d.event(/* ... */)
const 用户创建失败了 = d.event(/* ... */)
const 创建用户外观命令 = d.facadeCmd(/* ... */)
const 创建用户命令 = d.command(/* ... */)
const 用户聚合 = d.agg(/* ... */)
const 创建用户流程 = d.startWorkflow('创建用户流程')
管理员
.facadeCmd(创建用户外观命令)
.service(用户前置检查服务)
.command(创建用户命令)
.agg(用户聚合)
用户聚合.event(用户已创建)
用户聚合.event(用户创建失败了)
其中涉及到的节点也可以和声明同时进行(不推荐)
存在缺陷
难以阅读、难以管理,容易写出一大坨复杂的参数
ts
const 创建用户流程 = d.startWorkflow('创建用户流程')
管理员
.command(
'CreateUserCommand',
[
/* ... */
],
'创建用户命令'
)
.agg(
'UserAgg',
[
/* ... */
],
'用户聚合'
)
.event(
'UserCreatedEvent',
[
/* ... */
],
'用户已创建'
)
// 这里将无法再调用`用户聚合.event(用户创建失败了)`,因为`用户聚合`是匿名的
用户故事
实验性功能
我意识到工作流与用户侧视角的“业务”贴合度不足。
设计用户故事,是帮助技术人员贴合用户思维的一种尝试,欢迎批评指正。
一个用户故事由若干个关系高度密切或有逻辑先后关系的工作流组成
用户故事在一开始时不是必要的,但如果一个系统演变得足够复杂了,维护良好的用户故事能够加快技术人员理解业务的速度
用户故事的划分粒度,视系统的复杂度而逐渐演化
用户故事示例
ts
const Shibor基准浮息类个人贷款流程 =
d.startWorkflow('Shibor基准浮息类个人贷款流程')
// ...
const 一般个人贷款流程 = d.startWorkflow('一般个人贷款流程')
// ...
const 逆回购流程 = d.startWorkflow('逆回购流程')
// ...
const 银行拆借流程 = d.startWorkflow('银行拆借流程')
// ...
const 个人贷合同重定价流程 = d.startWorkflow('外币收款结汇流程')
// ...
d.userStory('作为高贵的用户,我要办理Shibor基准浮息类个人贷款', [
银行拆借流程,
个人贷合同重定价流程,
Shibor基准浮息类个人贷款流程,
])
d.userStory('作为高贵的用户,我要办理一般个人贷款', [
个人贷合同重定价流程,
一般个人贷款流程,
])
现在我们胡编了一些流程。
假设现在新来了一个维护者,在金融专业知识方面储备不足,他可以通过阅读用户故事来快速了解“有前因后果的业务”。同时也能看出来Shibor基准浮息类个人贷款
到底“不一般在哪”。
如果让他去看各种节点的定义、各种 policy,工作量会比这大得多、难得多。