当一个状态流程满足以下几个条件时,可以使用 Switch case
的方法提高代码复用率及逻辑可读性
func TranferStateMachineByCurrentStatus {
switch {
case Status1:
...
fallthrough
case Status2:
...
fallthrough
case EndStatus:
...
default:
panic("unknown status")
}
}
为了防止某个函数的执行过程并发,通常需要再该函数调用时增加锁。
当一个流程因特殊原因被切分成两个部分时,需要考虑在两部分中间中断时能否有效重试,需要依赖一下两个特性
当一个流程涉及多个交互方时理论上要注意一下几点
自驱状态机
,通过将状态与每个状态下固定的动作绑定,能够很好模拟实现预先设计的状态机转换推进。状态机结构设计如下
// Drive 自驱推进至终态
func (s *SelfDriveStateMachineImpl) Drive(ctx context.Context, params interface{}) {
if s.curState == nil {
panic(fmt.Sprintf("CurState is nil. Please set curstate."))
}
for !s.curState.IsFinal() {
s.Next(ctx, params)
}
}