以前写的两个关于 undo/redo 的实现的小小心得:
正在写 undo/redo 的实现undo / redo 功能轻松实现这里面需要注意的是,在 undo 以后有一个注意的事项,那就是
一旦有新的操作进入 undo stack 时,必须要清空 redo stack 。
我想这里面有一个准则,那就是 redo 紧跟在 undo 后面做才有意义──"redo 是因为 undo 而存在的", redo 并不是要让你以前操作的每一步都能 redo 。 因为这里面存在不可预知的因素。
1. 如果后面的操作和以前的操作根本一点关系都没有的话,这样让 redo 能实现到以前的每一步的话,是可行的,但这样会造成逻辑上的一些混乱,还有另一个原因:
2. 在 undo 以后,如果这时 redo 栈没有清空,而后的新操作对象与 redo 栈里面的某一对象相同或者相关的话,后面的行为是不可预期的,但可以预期的一点是如果冲突了,redo 操作是没有意义的,或者说是非法的。比如:
1) 移动某一对象
2) undo // 注: 这时移动对象的操作进入 redo stack, 以备 redo
3) 删除了该对象 // 注: 如果这时没有清空 redo stack
4) redo // 注: 这时执行的是 “1) 移动这个对象”,但其实他已经被删除了!!! |
结论: 所以不论从避免逻辑混乱上还是实际的实现可行性中,这里应该采取一刀切的方式,
一旦新操作进入 undo stack, 这时必须清空 redo stack !
阅读(1768) | 评论(0) | 转发(0) |