1
no1xsyzy 2021-01-28 11:10:50 +08:00
1#. Finite State Machine (FSM)
2#. retry flag (reverse also ok) 1 retry_2_thru_4 = true while (retry_2_thru_4) { 2 3 if (4) retry_2_thru_4 = false; } 5 |
3
no1xsyzy 2021-01-28 11:38:02 +08:00
@bytesfold 第二种方法很正常,从很久以前(从 Dijkstra 反对 goto 观点被广泛使用之后)就是这么用的了
如果你觉得不够优雅,那就把 234 封装到一个函数里去,甚至把循环也带进去,跳出直接 return 。 第一种方法就是无限 goto 制,其实单这个还没到该用 FSM 的程度。 这就是个很简单的逻辑 |
4
yuelang85 2021-01-28 11:55:28 +08:00
你把每一步封装成一个函数,然后:
func_list = [ (func_1, None), (func_2, func_1), (func_3, func_1), (func_4, func_2), ] for f, f_err in func_list: try: f() except: f_err() |
5
ytymf 2021-01-28 12:16:30 +08:00 1
上状态机吧,没那么难,画好状态以及状态迁移图,能理顺就能写好。
|
6
frostming 2021-01-28 13:02:41 +08:00
|
7
est 2021-01-28 13:20:47 +08:00
|
8
freelancher 2021-01-28 13:42:30 +08:00
我是写 SHELL 脚本的。12345 每一步的最后给一个状态码。 然后 4 的状态码为 0 是成功。为 1 是错误的。然后写一个==判断就可以了。如果错了再回 2 步骤。
思路是这样。我不知道大家能不能懂的我意思。 |
9
cpstar 2021-01-28 14:13:25 +08:00
@yuelang85 如果这样的话,那就可以继续封装函数了
invoke(func, succ, err) { if (func()) succ() else err() } 然后就成了 invoke(func_1, invoke(func_2, invoke(func_3, invoke(func_4, null, func_2), null), null), null) null 根据实际情况继续配置 [套娃警告] |
10
cpstar 2021-01-28 14:14:39 +08:00
感觉 LZ 的想法应该是 4 失败了,要回退到 2 运行之前的状况
|
12
deplives 2021-01-28 16:15:23 +08:00
如果 12345 当成成不同的状态,不就是个状态机了?
|
13
zepc007 2021-01-28 18:26:16 +08:00
jump,jump,jump
|
14
q197 2021-01-28 19:29:07 +08:00
goto 完美
|
15
ideno 2021-01-28 19:44:02 +08:00 1
int nProc = 0;
while (true) { swith(nProc) { case 0: doProc0(); case 1: doProc1(); case 2: doProc2(); case 3: doProc3(); case 4: if(!doProc4()) {nProc=2; continue;} } break; } @freelancher 说的大概这么个意思(不是正确语法) |
16
HelloViper 2021-01-29 10:11:38 +08:00
transitions==0.8.1
|