Devin
V2EX  ›  .NET

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

  •  
  •   Devin · Feb 7, 2018 via iPhone · 5272 views
    This topic created in 3191 days ago, the information mentioned may be changed or developed.
    类似一些常用的可以编辑文字或表格的软件比如 Word,Excel 的撤销功能是怎么实现的?
    可以返回上一步,甚至返回几十步,逻辑是怎么样的?
    16 replies  •  2018-02-08 13:56:56 +08:00
    coffeSlider
    coffeSlider
    Feb 7, 2018 via Android❤️1
    1
    这是一种设计模式名字忘了,将用户每一部步操作压栈,undo 时 pop
    meefly
    meefly
    Feb 7, 2018 via Android
    2
    红黑树可以么?
    SuperMild
    SuperMild
    Feb 7, 2018
    3
    没有做过,但可以想到一种方法,把编辑器的每一个功能都定义一个指令名称,比如改变光标位置是 move(x, y),删除是 del(x, y)。然后把用户的每一个操作都记录下来,剩下的就好办了,什么队列啊栈啊之类的,一个不够弄两个,就能搞出来了。
    FanError
    FanError
    Feb 7, 2018 via iPhone
    4
    command 设计模式吗
    wweir
    wweir
    Feb 7, 2018 via Android
    5
    记录每个动作的回滚动作就可以了嘛
    paperseller
    paperseller
    Feb 7, 2018 via iPhone
    6
    会是像 cad 的每一步都可以用命令实现,撤销时就将命令倒推?跟 3# 的思路差不多
    binsys
    binsys
    Feb 7, 2018❤️1
    7
    去知乎 @vczh
    neoblackcap
    neoblackcap
    Feb 7, 2018❤️1
    8
    数据库不是有 binlog 吗?你有 binlog 之类的机制就可以实现了。退出就情况吧
    est
    est
    Feb 7, 2018❤️1
    9
    event sourcing 可以做到。
    Devin
    Devin
    OP
    Feb 7, 2018 via iPhone
    10
    @wweir 执行操作完毕时,记录此操作的相反操作?
    geelaw
    geelaw
    Feb 7, 2018❤️1
    11
    恰当使用 persistent data structure 可以在很省内存的情况下保存历史。

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