V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Devin
V2EX  ›  .NET

类似于 Excel 的撤销功能是怎么实现的?

  •  
  •   Devin · 2018-02-07 19:11:20 +08:00 via iPhone · 4107 次点击
    这是一个创建于 2474 天前的主题,其中的信息可能已经有所发展或是发生改变。
    类似一些常用的可以编辑文字或表格的软件比如 Word,Excel 的撤销功能是怎么实现的?
    可以返回上一步,甚至返回几十步,逻辑是怎么样的?
    16 条回复    2018-02-08 13:56:56 +08:00
    coffeSlider
        1
    coffeSlider  
       2018-02-07 19:21:08 +08:00 via Android   ❤️ 1
    这是一种设计模式名字忘了,将用户每一部步操作压栈,undo 时 pop
    meefly
        2
    meefly  
       2018-02-07 19:22:22 +08:00 via Android
    红黑树可以么?
    SuperMild
        3
    SuperMild  
       2018-02-07 19:35:59 +08:00
    没有做过,但可以想到一种方法,把编辑器的每一个功能都定义一个指令名称,比如改变光标位置是 move(x, y),删除是 del(x, y)。然后把用户的每一个操作都记录下来,剩下的就好办了,什么队列啊栈啊之类的,一个不够弄两个,就能搞出来了。
    FanError
        4
    FanError  
       2018-02-07 19:43:11 +08:00 via iPhone
    command 设计模式吗
    wweir
        5
    wweir  
       2018-02-07 19:47:35 +08:00 via Android
    记录每个动作的回滚动作就可以了嘛
    paperseller
        6
    paperseller  
       2018-02-07 19:47:57 +08:00 via iPhone
    会是像 cad 的每一步都可以用命令实现,撤销时就将命令倒推?跟 3# 的思路差不多
    binsys
        7
    binsys  
       2018-02-07 19:51:19 +08:00   ❤️ 1
    去知乎 @vczh
    neoblackcap
        8
    neoblackcap  
       2018-02-07 19:54:21 +08:00   ❤️ 1
    数据库不是有 binlog 吗?你有 binlog 之类的机制就可以实现了。退出就情况吧
    est
        9
    est  
       2018-02-07 20:00:36 +08:00   ❤️ 1
    event sourcing 可以做到。
    Devin
        10
    Devin  
    OP
       2018-02-07 20:55:27 +08:00 via iPhone
    @wweir 执行操作完毕时,记录此操作的相反操作?
    geelaw
        11
    geelaw  
       2018-02-07 21:00:30 +08:00   ❤️ 1
    恰当使用 persistent data structure 可以在很省内存的情况下保存历史。

    不知道楼主是不是担心内存爆掉的问题——毕竟用一个 stack 记录历史做 undo manager 是平凡的思路。
    Philippa
        12
    Philippa  
       2018-02-07 21:48:27 +08:00 via Android
    redo log 日志机制, 和 oracle 的日志回滚是类似的
    gsls200808
        13
    gsls200808  
       2018-02-07 22:12:24 +08:00 via Android
    每一步动作都有记录,撤销历史可以看到具体内容,如在 xx 单元格键入 XX 内容,回滚的时候动作就是撤销 XX 动作,返回十几步也就是撤销十几个动作,操作都记录下来了,用文件内存存个队列就可以了。
    zjb861107
        14
    zjb861107  
       2018-02-07 22:35:54 +08:00 via iPhone   ❤️ 1
    如果你用过 xmind,就会发现持续编辑一个文件会导致体积特别大。然后 xmind 自己提供了瘦身的功能,我试过可以把一个文件缩小约 10 倍。
    所以其实也有一种实现方式是每个用户编辑的版本都做一个快照保存在文件里?
    Pain
        15
    Pain  
       2018-02-08 12:39:24 +08:00
    @coffeSlider 你这和设计模式不搭边吧 ,顶多就是个栈的使用技巧。
    coffeSlider
        16
    coffeSlider  
       2018-02-08 13:56:56 +08:00 via Android
    @Pain 抱歉,这个叫做命令模式,什么叫做顶多是个栈的使用技巧?那诸如观察者模式,就是顶多是个回调的使用技巧了?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1992 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:19 · PVG 00:19 · LAX 08:19 · JFK 11:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.