Chinaunix首页 | 论坛 | 博客
  • 博客访问: 191002
  • 博文数量: 28
  • 博客积分: 1490
  • 博客等级: 上尉
  • 技术积分: 310
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-17 10:01
文章分类
文章存档

2012年(3)

2011年(2)

2008年(2)

2007年(7)

2006年(14)

我的朋友

分类:

2006-11-10 09:45:18

以前写的两个关于 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) |
给主人留下些什么吧!~~