V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
rrfeng
V2EX  ›  问与答

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

  •  
  •   rrfeng · Nov 5, 2020 · 1777 views
    This topic created in 2012 days ago, the information mentioned may be changed or developed.

    以 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 replies    2020-11-05 20:01:11 +08:00
    K1W1
        1
    K1W1  
       Nov 5, 2020 via Android
    goto ?
    ningmengmao
        2
    ningmengmao  
       Nov 5, 2020 via Android
    用职责链模式试试?
    SethShi
        3
    SethShi  
       Nov 5, 2020 via Android
    用一个数组包装所有函数
    执行失败数组指针回滚一位
    回滚了两次直接跳出数组循环
    aragakiyuii
        4
    aragakiyuii  
       Nov 5, 2020 via iPhone
    写个接口,包括操作和回滚方法,分别实现然后放到数组里...😂
    jinhan13789991
        5
    jinhan13789991  
       Nov 5, 2020 via Android
    设计模式在备忘录模式
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5684 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 07:57 · PVG 15:57 · LAX 00:57 · JFK 03:57
    ♥ Do have faith in what you're doing.