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

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

不知道楼主是不是担心内存爆掉的问题——毕竟用一个 stack 记录历史做 undo manager 是平凡的思路。
Philippa
2018-02-07 21:48:27 +08:00
redo log 日志机制, 和 oracle 的日志回滚是类似的
gsls200808
2018-02-07 22:12:24 +08:00
每一步动作都有记录,撤销历史可以看到具体内容,如在 xx 单元格键入 XX 内容,回滚的时候动作就是撤销 XX 动作,返回十几步也就是撤销十几个动作,操作都记录下来了,用文件内存存个队列就可以了。
zjb861107
2018-02-07 22:35:54 +08:00
如果你用过 xmind,就会发现持续编辑一个文件会导致体积特别大。然后 xmind 自己提供了瘦身的功能,我试过可以把一个文件缩小约 10 倍。
所以其实也有一种实现方式是每个用户编辑的版本都做一个快照保存在文件里?
Pain
2018-02-08 12:39:24 +08:00
@coffeSlider 你这和设计模式不搭边吧 ,顶多就是个栈的使用技巧。
coffeSlider
2018-02-08 13:56:56 +08:00
@Pain 抱歉,这个叫做命令模式,什么叫做顶多是个栈的使用技巧?那诸如观察者模式,就是顶多是个回调的使用技巧了?

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

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

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

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

© 2021 V2EX