现在的位置: 首页 > 综合 > 正文

撤销和重做(Undo和Redo)的C++完美实现(1)

2013年10月05日 ⁄ 综合 ⁄ 共 1221字 ⁄ 字号 评论关闭
        经过一年多的时间的摸索,终于找到了一种比较完美的撤销和重做(Undo和Redo)的C++实现方案,因为现在很多的应用程序都需要这种功能,所以我将我的经历写出来让大家分享,同时也能够让更多的人帮助我来更加完善这种架构,同时也能够让更多的人能够利用这种架构更好的完成它的程序。这种架构充分利用了STL的容器和算法来简化代码,因此有着比较高的正确性和可读性。
       在解析我的架构之前先分析一下(我所知道的)目前存在的一些实现撤销和重做的方案的优缺点。当前存在的撤销和重做的方案主要是:
撤销和重做的方案优点和缺点
撤销和重做方案
优点和缺点
将整个应用程序的状态序列化到文件 撤销和重做的步骤数量一般不多,最常见的是只能够撤销和重做一步,因为步骤多了会占用非常多的磁盘空间,同时撤销和重做的操作消耗时间也非常多,但是代码组织却非常简单
 自定义分配器管理内存池的方法  有着非常复杂的内存分配算法,代码不容易理解,使用也有点不方便,方法和上面的序列化方案类似,只不过序列化到了内存中,代码组织也非常简单
仿函数保存反操作的方法 用仿函数保留每一步操作所对应的反操作,虽然占用的内存空间不大,操作消耗的时间也不多,但是为每一步操作都必须写出相应的反操作是一个非常繁重的任务,况且一些操作还不一定存在着反操作,因此必然导致采用其它的方法进行补充那些没有反操作或者即使有反操作,但是反操作也很难写出的情况。虽然有了时间和空间上的优点但是代码组织却比较混乱,不便于维护

        从上面的撤销和重做方案中我们可以看出共同的毛病,撤销和重做机制消耗的时间和空间都比较大,但是都有着共性:撤销之前备份应用程序当前的状态信息,在撤销的时候就用这个备份的状态信息修改应用程序的当前状态,从而达到了撤销的功能,同样为了能够实现重做功能,也需要在重做之前备份应用程序的状态信息,在重做的时候使用这个备份的状态信息修改应用程序的当前状态,从而达到了重做的功能。
       虽然大多数应用程序中都有撤销和重做的功能,但是仍然有许多的程序没有撤销和重做的功能,即使有也非常弱,原因当然是撤销和重做功能不易实现的原因了。
       好了,对我所知道的这些撤销和重做的方案经过分析之后,可以看出比较理想的是最后一种,即:仿函数保存反操作的方法,但是这里面需要写非常多的反操作。为了减少书写反操作的代码,自己的方案里面采用和仿函数保存反操作类似的方法,但是又没有大量书写反操作的麻烦,同时代码组织非常简洁(通常来说撤销和重做机制可以以库的形式提供,使用该库的你仅仅只需要用仅有的几个封装的非常完美的操作来表达你的任意操作即可。这种表达方式和一般的编码过程非常类似,因而就不需要考虑反操作的问题)。这将在本系列的后续文章中详细讨论!(敬请关注)
       

    下一篇:撤销和重做(Undo和Redo)的C++完美实现(2)
我的博客
http://blog.csdn.net/pandaxcl/

抱歉!评论已关闭.