我们在做需求时,会遇到需要梳理(业务)状态的情况,不仅是后台产品,前端或是用户侧产品也会遇到,比如朋友圈内容状态,文章状态,直播状态等。
先来看下状态怎么命名:
首先,要明确“状态”是一个进行时态,即ing状态。
它不是一个动作,而是由一个动作触发,到达这个状态,再由另一个动作触发,完成这个状态。
如果这个状态是起始态或中间态,则完成这个状态的同时会进入下一个状态;
如果这个状态是终态,则完成这个状态,这件事就结束了,状态不会再更改了;
如果这个状态是起始态,则初始条件下就是这个状态,不需要动作触发产出。
因此,状态的命名应该用"未xx","待xx","xx中"或"已xx"等状中短语定义,而不用动词。
比如,朋友圈的状态可以有:待发布-已发布-已撤销-已删除。
直播状态可以有:未开始-直播中-已结束。
那么,怎么梳理状态呢?
1.先拆解要完成这件事的步骤。
比如把一头大象装进冰箱这件事,分3步:开门、放象、关门。
比如和朋友微信聊天说一句话这件事,分2步:编辑、发送。
比如直播节目这件事,分3步:上播、直播、下播。
2.给每个步骤定义状态名称。
把一头大象装进冰箱:待装箱、装箱中、已装箱。
和朋友微从聊天说一句话:未发送、已发送。
直播节目:未开始、直播中、已结束。
3.给每个状态转变设置触发条件,即动作。
大象装冰箱:通过[开冰箱门]动作,将“待装箱”状态转变为“装箱中”状态;通过[关冰箱门]动作,将“装箱中”状态转变为“已装箱”状态。
微信聊天一句话:通过[单击发送按钮]动作,将“未发送”状态转变为“已发送”状态。
直播节目:通过[单击上播按钮]动作,将“未开始”状态转变为“直播中”状态;通过[单击下播按钮]动作,将“直播中”状态转变为“已结束”状态。
4.给每个状态,设置可操作动作。
大象装冰箱:“待装箱”时可以[清洗大象]、[关冰箱门]等;“装箱中”可以[关冰箱门]等;“已装箱”可以没有动作。
微信聊天一句话:“未发送”时可以[关闭输入键盘]、[点发送按钮]等,“已发送”时可以[撤回]等。
直播节目:“未开始”时可以[编辑修改直播宣传文案]、[上播]等;“直播中”时可以[下播]、[发布文字消息到直播间]等;“已结束”时可以[回放直播]等。
5.检查状态是否完整,补充所需状态。
需要补充状态的情况:
a.增加步骤:比如直播节目上播前,增加编辑直播信息步骤,则完整状态为“编辑直播信息-上播-直播-下播”,完整状态为“待发布-未开始-直播中-已结束”。
b.增加判断:比如微信聊天一句话撤回后,让用户判断是重新编辑撤回的话,还是另写一句新话,就不是直接撤回到“未发送”状态,而是新增一个“已撤回”状态了。
c.区分统计:比如直播节目,因特殊情况在“未开始”状态要先[取消发布]这条信息,另择时间发布,如果需要统计有多少直播在发布后暂时取消发布这种情况,就不能将状态置回“待发布”,而是新增一个“已取消”的状态。
一些常见的状态误区:
1.状态不是越多越好,越细越好。
做产品是越简单越好,状态也不例外,尽可能的简单,降低用户的学习成本。但要够用。
2.注意区分动作和状态
某一状态下,可以允许某一动作;某一动作可触发某一状态的转变。
状态是doing,动作是do。
可选的设置项不是不同的状态。举个例子:有些“已结束”的直播,可以设置[看回放]这个动作,有些不能,这是通过设置项完成的,不是状态。
3.动作不一定需要人为操作,可以系统触发。
有些状态变更的触发条是通过到达某一时间等条件满足,而非人为条件触发,比如定时发布;或有一些环节对用户价值不大,用户便不一定会来执行这步操作,但产品流程还要走下去,所以也需要增加条件自动触发进入下一状态,比如“已归档”。
4.复杂流程可以有父子状态
比如购物流程的订单流程和物流流程就是父子关系,订单是父,物流单是子。
订单状态:待付款-待发货-待收货-已收货-已完成/已退货
物流状态:已揽收-已发出-待分拣-派送中-已签收
当子状态-物流揽收,即物流状态变更为“已揽收”的同时,父状态-订单状态变更为“待收货”;当子状态-物流状态变更为“已签收”时,父状态-物流状态变更为“已收货”。
这是因为放到一起状态链条过长,不好显示,且不利于业务和代码上的解耦合。
拆分为父子关系,则可以订单是订单,物流是物流,订单受物流影响是否可以完成,但同时也可以更换物流已完成订单,而不必更换订单。
6.必要时可允许状态回退
比如审批流,通过是正向进行,驳回则是逆向回退到上状态节点或初始状态节点。
7.状态可跳跃,可分流
只要定义好触发条件规则,和目标状态即可。