国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

一種可用于開發(fā)平臺的撤銷/恢復通用算法

2015-09-18 12:57:26吳亞非臧義華王凱等
軟件導刊 2015年8期
關鍵詞:恢復

吳亞非 臧義華 王凱等

摘要:針對具有編輯功能軟件的撤銷/恢復功能無法做到操作與歷史記錄統(tǒng)一,二次開發(fā)中自有功能無法實現(xiàn)一體化設計的問題,設計了一種撤銷/恢復通用算法。采用雙向鏈表法記錄撤銷/恢復數(shù)據(jù),將用戶操作分為基本操作和復合操作,通過復合操作的方式保證操作與歷史記錄一致。同時,向二次開發(fā)用戶提供數(shù)據(jù)代管功能,以回調函數(shù)的方式實現(xiàn)應用軟件自有功能與平臺提供功能的一體化撤銷/恢復,以提高軟件用戶體驗。

關鍵詞:撤銷/恢復;雙向鏈表;數(shù)據(jù)代管

DOIDOI:10.11907/rjdk.151553

中圖分類號:TP312

文獻標識碼:A 文章編號文章編號:16727800(2015)008008903

0 引言

在具備編輯功能的應用軟件中,用戶常常需要針對編輯對象進行創(chuàng)建、刪除、復制、剪切、調整等多種操作,工作過程中誤操作不可避免。因此,提供撤銷/恢復(Undo/Redo)功能是提高應用系統(tǒng)易用性的必要手段之一。目前,幾乎所有的編輯類軟件都提供該項功能,而一些開發(fā)平臺類軟件卻不提供,特別是沿用以往技術成果的開發(fā)支撐軟件,需要二次開發(fā)用戶根據(jù)需要自行設計;另外一些提供撤銷/恢復功能的平臺類軟件開發(fā)函數(shù)往往存在諸多問題,例如無法支持所有操作、只支持基本動作的撤銷/恢復等,而二次開發(fā)后基于多個底層基本動作完成一項功能后,撤銷/恢復歷史記錄與操作不一致,令用戶體驗較差。

傳統(tǒng)的撤銷/恢復有兩種方法,即鏈表法和命令模式法,這兩種基本的實現(xiàn)方式在很多資料中都有詳細介紹,這里不再詳細說明。本文編寫的背景是,需要在一種嵌入式圖形開發(fā)平臺中增加撤銷/恢復功能,并且盡可能減少對原有功能的影響,保持軟件穩(wěn)定運行。如果采用命令模式法,勢必要對原有程序作大規(guī)模修改,而無論是鏈表法還是命令模式法,都難以滿足實現(xiàn)二次開發(fā)的撤銷恢復一體化的需要。本文設計了一種基于雙向鏈表的通用撤銷/恢復算法,一次性撤銷/恢復二次開發(fā)中使用的多個基本動作,實現(xiàn)二次開發(fā)后撤銷/恢復歷史記錄與用戶操作一致;同時可向二次開發(fā)用戶提供數(shù)據(jù)代管,以回調函數(shù)的方式實現(xiàn)應用軟件自有功能與平臺提供功能的一體化撤銷/恢復,提高用戶體驗。

1 設計思想

撤銷/恢復基本思想:開始執(zhí)行某一種操作命令后,撤銷命令生效,至少執(zhí)行了一條撤銷命令后,恢復命令生效;再執(zhí)行一次新的操作命令后,恢復命令全部清空。

一個設計良好的撤銷/恢復算法應該滿足下列條件:①能夠支持任意操作,盡可能減少誤操作帶來的損失;②能夠定義撤銷/恢復的最大步數(shù),防止內(nèi)存無限制增加帶來的系統(tǒng)健壯性問題;③能夠提供給用戶撤銷/恢復命令的名稱。

用于開發(fā)平臺的撤銷/恢復功能需要提供撤銷/恢復函數(shù)供二次開發(fā)用戶使用,這些函數(shù)除了滿足上述設計規(guī)則外,面臨的最大問題是,一次撤銷/恢復的命令可能來自創(chuàng)建、刪除等基本動作,也可能來自二次開發(fā)用戶利用多個編輯函數(shù)組合形成的復合動作,但這種復合動作對最終用戶來說是一個動作[1]。如圖1所示,在應用程序中有繪制矩形這種操作,根據(jù)需求繪制一個范圍矩形,然后修改為指定顏色、線寬、填充屬性等,由于用戶操作時是1次操作而非4次操作,撤銷時同樣要求1次撤銷而非4次撤銷。

圖1 基本操作與復合操作

2 算法設計

2.1 撤銷/恢復行為設計

具有撤銷/恢復功能的軟件中,需要把編輯對象保存到內(nèi)存中,以便在對象的整個生命周期實施增、刪、改、查等操作。這種操作是針對內(nèi)存中的對象,不考慮撤銷/恢復操作時,這些操作無需記錄,反之必須將這些操作過程記錄下來,形成操作歷史命令鏈表,為執(zhí)行撤銷/恢復作準備,并且為了快速遍歷,操作歷史命令鏈表應為雙向鏈表。圖2為執(zhí)行了4次操作的撤銷/恢復命令鏈表。

圖2 執(zhí)行了4次操作的撤銷/恢復命令鏈表

只要有操作發(fā)生,歷史鏈表就有對象加入鏈表尾部,撤銷由后向前執(zhí)行,恢復由前向后執(zhí)行。當Undo/Redo指針的前序節(jié)點為NULL時,不能執(zhí)行撤銷;后續(xù)節(jié)點為空時,不能執(zhí)行恢復。另外,在執(zhí)行撤銷/恢復過程中(Undo/Redo指針不在最后一個節(jié)點),有任意新操作發(fā)生時,Undo/Redo節(jié)點跳轉到最后一個節(jié)點,同時清空中間節(jié)點的數(shù)據(jù)。圖3示意了撤銷發(fā)生兩次后,有“操作5”發(fā)生,這時Undo/Redo鏈表跳轉到“操作5”,“操作3”和“操作4”的指針從內(nèi)存中清空,不再允許被撤銷與恢復[24]。

支持一次性撤銷多個操作組成的復合操作需要解決兩個問題,即標識基本動作為復合動作的組成部分(參見2.2的有關描述),Undo/Redo指針在判斷為復合動作時能一次性跳轉多個位置,如圖4所示。

圖3 執(zhí)行兩次撤銷后有新操作發(fā)生

圖4 撤銷復合動作(多個基本動作組成)

2.2 撤銷/恢復節(jié)點設計

撤銷/恢復鏈表的節(jié)點應記錄操作對象,但為了節(jié)省內(nèi)存空間,只需記錄一個指向對象的指針即可。其中應當注意的是,系統(tǒng)中增加撤銷/恢復功能后,只要對象被創(chuàng)建,內(nèi)存中就會有對應的數(shù)據(jù)存在,即使被刪除,內(nèi)存也不會被清空,否則會導致撤銷/恢復節(jié)點找不到正確對象。

一個撤銷/恢復動作應當有具體名稱,這樣在設計UI界面時,能夠幫助最終用戶了解能夠撤銷/恢復的歷史動作。圖5演示了圖形編輯系統(tǒng)中撤銷命令的歷史列表。

為了能夠撤銷/恢復到歷史狀態(tài),必須記錄操作前后對象的狀態(tài)(屬性)。這個狀態(tài)視操作類型的不同而有所區(qū)別,需要記錄的狀態(tài)值和類型各不相同,所以操作前和操作后狀態(tài)值設計為void*類型。

節(jié)點的狀態(tài)非常關鍵,由于要同時支持一次性撤銷一個基本工作或復合動作,每一次基本操作發(fā)生時都要增加到撤銷/恢復歷史鏈表中,但復合動作與基本動作要有所區(qū)分,必須以狀態(tài)位加以控制。定義GS_UndoRedoStatus枚舉類型用于標識動作狀態(tài),GS_UNDOSELF為基本動作,GS_UNDOBEGIN、GS_UNDOCENTER、GS_UNDOEND標識一個完整的復合動作,撤銷/恢復時將多個基本動作依次執(zhí)行。

2.3 撤銷/恢復一體化設計

使用復合操作類型可以將二次開發(fā)中的動作整合管理,但二次開發(fā)中并不是所有功能都利用底層平臺功能,有一些二次開發(fā)自有功能,應用系統(tǒng)則無法實現(xiàn)整體的撤銷/恢復。無論是自定義功能不支持撤銷/恢復,還是分開實現(xiàn),都會降低用戶體驗。利用上節(jié)撤銷恢復節(jié)點設計中的UndoRedoType類型,為二次開發(fā)用戶定義擴展類型GS_EXTEND,將二次開發(fā)中的自有功能添加到撤銷/恢復鏈表中。為了實現(xiàn)在撤銷/恢復中調用二次開發(fā)中的函數(shù),需要定義兩個回調函數(shù):

(1)撤銷操作回調函數(shù)。

typedef void (*GS_UndoOperation)(void *pValue,intiType)。

(2)恢復操作回調函數(shù)。

typedef void (*GS_RedoOperation)(void *pValue,intiType)。

系統(tǒng)執(zhí)行撤銷/恢復操作時,根據(jù)UndoRedoType類型判斷是否是用戶自定義動作,如果是用戶自定義動作,調用上述回調函數(shù),用戶根據(jù)iType值判斷具體執(zhí)行動作類型完成操作。

2.4 撤銷/恢復二次開發(fā)接口設計

撤銷/恢復主要開發(fā)接口如下:①復合動作開始函數(shù),需要設置復合動作在撤銷/恢復歷史中的名稱intGsBeginCommand(char* szCmdName);② 復合動作結束函數(shù)intGsEndCommand();③撤銷void Undo();④ 恢復void Redo();⑤判斷是否可以執(zhí)行撤銷命令boolifUndo();⑥判斷是否可以執(zhí)行恢復命令boolifRedo();⑦獲取撤銷命令名稱intGetUndoName(iIndex,char *szName);⑧ 獲取恢復命令名稱

intGetRedoName(intiIndex,char* szName);⑨設置撤銷/恢復最大步長IntSetUndoRedoMaxLength(intiLen)

需要說明的是,二次開發(fā)用戶需要成對使用BeginCommand()和EndCommand(),將復合動作代碼包裹起來,這樣才能保證一次撤銷/恢復能夠執(zhí)行多個基本動作。

3 結語

本文詳細介紹了基于雙向循環(huán)鏈表法、以復合動作的方式實現(xiàn)一次撤銷/恢復多步操作的算法設計,解決了二次開發(fā)后撤銷/恢復歷史記錄與用戶操作不一致的問題。同時通過代管用戶數(shù)據(jù),以回調函數(shù)的方式實現(xiàn)整個系統(tǒng)撤銷/恢復操作一體化。設計簡單有效,對原有程序影響小,特別適用于對已有成熟軟件的改造。該設計不僅能夠用于實現(xiàn)傳統(tǒng)的撤銷/恢復功能,而且能夠滿足二次開發(fā)的應用需要。

利用本文提出的設計思想,筆者在一個國內(nèi)廣為使用的嵌入式圖形平臺上增加了撤銷/恢復二次開發(fā)功能。在改造過程中,經(jīng)過對比分析,這種方法相對文獻[2]提出的命令模式方法,對原有代碼改動量減少30%以上;改造完成后,新提供的版本經(jīng)過各類二次開發(fā)用戶在多種應用場景下的使用驗證,證明這種方法是合理可行的。

參考文獻:

[1] 趙高長.多步無限撤消及恢復算法與實現(xiàn)[J].西安科技大學學報,2009(4):500504.

[2] 聶穎.圖形應用系統(tǒng)下Undo/Redo操作的設計與實現(xiàn)[J].計算機應用研究,2005(3):181182.

[3] 韓小俊,王珂.矢量圖軟件中Undo/Redo操作[J].圖形圖像處理與游戲編程,2007(3):6365.

[4] 朱靖飛,謝虎.圖形編輯系統(tǒng)下Undo/Redo操作的設計與實現(xiàn)[J].科學技術與工程,2009(6):15971599.

(責任編輯:黃 ?。?

猜你喜歡
恢復
探討智能配電網(wǎng)故障快速定位與故障恢復
CommVault軟件在企業(yè)中的應用
淺析游泳訓練的疲勞特點及恢復方法
淺談市政工程中給排水施工的質量控制
面部燒傷女性患者的臨床護理干預
論配網(wǎng)故障的診斷及恢復方法
產(chǎn)后優(yōu)質護理服務對產(chǎn)婦滿意度的影響
NUB恢復ORACLE數(shù)據(jù)庫
利用存儲系統(tǒng)恢復服務器系統(tǒng)
南江县| 平顺县| 长兴县| 广州市| 兰西县| 沿河| 西平县| 河东区| 荆州市| 镇沅| 仙游县| 新郑市| 泸水县| 沙河市| 东阿县| 吴忠市| 依安县| 和平县| 龙门县| 城口县| 京山县| 龙泉市| 姜堰市| 呼和浩特市| 集贤县| 阿克| 会同县| 临安市| 临城县| 江陵县| 交口县| 项城市| 甘孜| 江都市| 吴川市| 泾阳县| 拜泉县| 盘山县| 邯郸县| 丰原市| 马关县|