V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
rrfeng
V2EX  ›  问与答

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

  •  
  •   rrfeng · 2020-11-05 18:15:29 +08:00 · 1254 次点击
    这是一个创建于 1508 天前的主题,其中的信息可能已经有所发展或是发生改变。

    以 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 )

    有什么更好的模式吗?

    5 条回复    2020-11-05 20:01:11 +08:00
    K1W1
        1
    K1W1  
       2020-11-05 18:22:53 +08:00 via Android
    goto ?
    ningmengmao
        2
    ningmengmao  
       2020-11-05 18:28:48 +08:00 via Android
    用职责链模式试试?
    seth19960929
        3
    seth19960929  
       2020-11-05 18:55:13 +08:00 via Android
    用一个数组包装所有函数
    执行失败数组指针回滚一位
    回滚了两次直接跳出数组循环
    aragakiyuii
        4
    aragakiyuii  
       2020-11-05 19:09:48 +08:00 via iPhone
    写个接口,包括操作和回滚方法,分别实现然后放到数组里...😂
    jinhan13789991
        5
    jinhan13789991  
       2020-11-05 20:01:11 +08:00 via Android
    设计模式在备忘录模式
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1019 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:27 · PVG 02:27 · LAX 10:27 · JFK 13:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.