如果一段代码流程里有很多顺序操作,在某个步骤失败的时候,需要回退之前的操作,怎么写优雅呢?

2020-11-05 18:15:29 +08:00
 rrfeng

以 golang 为例:

func do() {
    err := step1()
    if err != nil { return err}

    err = step2()
    if err != nil {
        rollback_err = undo_step1();
        if rollback_err != nil {
            return err
        }
    }
}

这样写的缺点是,步数越多后面越复杂。

尝试每个步骤后使用 defer 注册 rollback,带来的问题是无法直接跳出 defer 栈: 比如 step3 错误,undo_step2() 也要进行错误处理,如果也错误,那应该直接返回错误而不是继续执行 undo_step1 (在 step1 之后注册的 defer )

有什么更好的模式吗?

1121 次点击
所在节点    问与答
5 条回复
K1W1
2020-11-05 18:22:53 +08:00
goto ?
ningmengmao
2020-11-05 18:28:48 +08:00
用职责链模式试试?
seth19960929
2020-11-05 18:55:13 +08:00
用一个数组包装所有函数
执行失败数组指针回滚一位
回滚了两次直接跳出数组循环
aragakiyuii
2020-11-05 19:09:48 +08:00
写个接口,包括操作和回滚方法,分别实现然后放到数组里...😂
jinhan13789991
2020-11-05 20:01:11 +08:00
设计模式在备忘录模式

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/722124

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX