您的位置:C++老鼠窝编程 【专题讨论】 正文
原作者:pandaxcl 添加时间:2008-06-17 原文发表时间:2008-06-17 人气:6

本文章共4610字,分3页,当前第1页,快速翻页:
 

     经过一年多的时间的摸索,终于找到了一种比较完美的撤销和重做(Undo和Redo)的C++实现方案,因为现在很多的应用程序都需要这种功能,所以我将我的经历写出来让大家分享,同时也能够让更多的人帮助我来更加完善这种架构,同时也能够让更多的人能够利用这种架构更好的完成它的程序。这种架构充分利用了STL的容器和算法来简化代码,因此有着比较高的正确性和可读性。
       在解析我的架构之前先分析一下(我所知道的)目前存在的一些实现撤销和重做的方案的优缺点。当前存在的撤销和重做的方案主要是:
撤销和重做的方案优点和缺点
撤销和重做方案
优点和缺点
将整个应用程序的状态序列化到文件 撤销和重做的步骤数量一般不多,最常见的是只能够撤销和重做一步,因为步骤多了会占用非常多的磁盘空间,同时撤销和重做的操作消耗时间也非常多,但是代码组织却非常简单
 自定义分配器管理内存池的方法  有着非常复杂的内存分配算法,代码不容易理解,使用也有点不方便,方法和上面的序列化方案类似,只不过序列化到了内存中,代码组织也非常简单
仿函数保存反操作的方法
用仿函数保留每一步操作所对应的反操作,虽然占用的内存空间不大,操作消耗的时间也不多,但是为每一步操作都必须写出相应的反操作是一个非常繁重的任务,况且一些操作还不一定存在着反操作,因此必然导致采用其它的方法进行补充那些没有反操作或者即使有反操作,但是反操作也很难写出的情况。虽然有了时间和空间上的优点但是代码组织却比较混乱,不便于维护
        从上面的撤销和重做方案中我们可以看出共同的毛病,撤销和重做机制消耗的时间和空间都比较大,但是都有着共性:撤销之前备份应用程序当前的状态信息,在撤销的时候就用这个备份的状态信息修改应用程序的当前状态,从而达到了撤销的功能,同样为了能够实现重做功能,也需要在重做之前备份应用程序的状态信息,在重做的时候使用这个备份的状态信息修改应用程序的当前状态,从而达到了重做的功能。
       虽然大多数应用程序中都有撤销和重做的功能,但是仍然有许多的程序没有撤销和重做的功能,即使有也非常弱,原因当然是撤销和重做功能不易实现的原因了。
       好了,对我所知道的这些撤销和重做的方案经过分析之后,可以看出比较理想的是最后一种,即:仿函数保存反操作的方法,但是这里面需要写非常多的反操作。为了减少书写反操作的代码,自己的方案里面采用和仿函数保存反操作类似的方法,但是又没有大量书写反操作的麻烦,同时代码组织非常简洁(通常来说撤销和重做机制可以以库的形式提供,使用该库的你仅仅只需要用仅有的几个封装的非常完美的操作来表达你的任意操作即可。这种表达方式和一般的编码过程非常类似,因而就不需要考虑反操作的问题)。这将在本系列的后续文章中详细讨论!(敬请关注)
        通过前面的讨论,我们所希望的是具备有“仿函数保存反操作法”的时间和空间优势,但是又不希望有“仿函数保存反操作法”的书写反操作的繁琐过程,另外还要保证代码的组织非常简洁,当然这是为了方便维护了:)

#if 0
在前面的章节中讨论了目前常见的实现撤销和重做的方案,其中的仿函数保存反操作
的方案的空间和时间优势非常吸引人,但是需要为每一个操作实现一个反操作,这个过程
 
本文章更多内容1 - 2 - 3 - 下一页>>
本页地址
相关文章


相关评论


本文章所属分类:首页 【专题讨论】