MyException - 我的异常网
当前位置:我的异常网» C++ » 请问关于undo命令设计的有关问题

请问关于undo命令设计的有关问题

www.MyException.Cn  网友分享于:2013-03-04  浏览:1次
请教关于undo命令设计的问题
我最近在做一些用户界面方面的内容,需要对用户的各种操作提供undo,redo的支持。
  在开发过程中发现这些改变文档状态的操作,一般分为三种类型:创建一个对象,修改一个对象和删除一个对象。
  在创建和删除对象的时候,由于修改命令中会保存修改对象的引用。如果创建和删除对象真的删掉了实际的对象再重建一个,会导致修改命令中的引用对象失效。当然这点可以通过保存ID引用,或者直接在对象原地址上析构和重构来实现。
  碰到比较麻烦的问题是一个对象中又包含了子对象,可以对这些子对象进行添加删除修改等操作。如果用ID的方式来实现这种命令,那还必须构建一个层次结构的ID。
  不知道有没有人处理过这种层次结构对象的编辑,并提供undo,redo命令的一些经验,谢谢~

------解决方案--------------------
用一个结构,指明当前操作的类型,并包含相应类型的具体对象的指针
------解决方案--------------------
一点愚见:

删除对象,并不是delete,而是置一个擦除标记。所以删除对象的执行和undo,就是对擦除标记的维护。

对象修改的undo,可以用读入,写出接口来实现。
比如对象的基类有dataIn,dataOut两个虚接口,在修改对象之前,调用dataOut,将现在的数据写出,然后修改。如果undo,则调用dataIn,读入最近一次dataOut写出的数据。
dataIn和dataOut要求数据匹配。比如dataIn是读入2个int则dataOut也必须是写出2个int。
如果A对象有子对象B,则A::dataOut()里会调用B::dataOut(),A::dataIn()里也会调用B::dataIn()
------解决方案--------------------
不理解为什么要构建一个层次结构的ID。

我原来做过的一个工程是这样做的,把每一步的操作解析成一个命令帧,保存到历史操作栈里。一般的操作都是可逆的,undo的时候把栈顶指针回退1,并执行这组命令的逆命令。如果该组命令是不可逆的,则打开该帧前的最后一个关键帧,再一步步redo到该帧。redo很简单,直接交给命令解释器就可以了。
------解决方案--------------------
探讨

不理解为什么要构建一个层次结构的ID。

我原来做过的一个工程是这样做的,把每一步的操作解析成一个命令帧,保存到历史操作栈里。一般的操作都是可逆的,undo的时候把栈顶指针回退1,并执行这组命令的逆命令。如果该组命令是不可逆的,则打开该帧前的最后一个关键帧,再一步步redo到该帧。redo很简单,直接交给命令解释器就可以了。

文章评论

要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
 程序员的样子
程序员的样子
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
10个调试和排错的小建议
10个调试和排错的小建议
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
总结2014中国互联网十大段子
总结2014中国互联网十大段子
程序员必看的十大电影
程序员必看的十大电影
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
为什么程序员都是夜猫子
为什么程序员都是夜猫子
Java程序员必看电影
Java程序员必看电影
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
一个程序员的时间管理
一个程序员的时间管理
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
那些争议最大的编程观点
那些争议最大的编程观点
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员和编码员之间的区别
程序员和编码员之间的区别
我是如何打败拖延症的
我是如何打败拖延症的
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序员都该阅读的书
程序员都该阅读的书
代码女神横空出世
代码女神横空出世
我的丈夫是个程序员
我的丈夫是个程序员
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
每天工作4小时的程序员
每天工作4小时的程序员
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
程序员应该关注的一些事儿
程序员应该关注的一些事儿
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
漫画:程序员的工作
漫画:程序员的工作
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
编程语言是女人
编程语言是女人
程序员的鄙视链
程序员的鄙视链
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
鲜为人知的编程真相
鲜为人知的编程真相
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有