石偉 楊春花
摘 要:代碼重構(gòu)普遍存在于軟件的開發(fā)維護(hù)過程中,將重構(gòu)從代碼變更中檢測并提取出來有利于對變更的理解。針對重構(gòu)可視化研究方面的欠缺,本文設(shè)計(jì)了一個(gè)代碼重構(gòu)展示系統(tǒng),實(shí)現(xiàn)了基于變更塊的代碼重構(gòu)展示。通過該展示系統(tǒng)使代碼變更中存在的重構(gòu)模式變得更加簡單、直觀,便于用戶對代碼變更的分析、理解。
關(guān)鍵詞:代碼重構(gòu);變更塊;展示系統(tǒng)
文章編號:2095-2163(2019)04-0075-04 中圖分類號:TP311.5 文獻(xiàn)標(biāo)志碼:A
0 引 言
隨著軟件項(xiàng)目的不斷演化,軟件系統(tǒng)的維護(hù)也變得越來越困難。重構(gòu)[1]概念的提出,為軟件系統(tǒng)的開發(fā)維護(hù)提供了幫助。重構(gòu)是通過對軟件結(jié)構(gòu)進(jìn)行調(diào)整,進(jìn)而在軟件特征功能不改變的前提下,對軟件的性能質(zhì)量進(jìn)行改善。代碼變更每天都在產(chǎn)生,由代碼重構(gòu)檢測工具檢測出的重構(gòu)代碼數(shù)量也是巨大的,在面對大量的沒有規(guī)律的復(fù)雜代碼信息時(shí),將重構(gòu)從代碼變更中檢測并提取出來有助于對代碼變更的理解。然而正是由于軟件規(guī)模的不斷擴(kuò)大,這種理解也變得很困難。為了解決這個(gè)問題,Ware[2]提出,可視化方法是瀏覽大量數(shù)據(jù)并快速熟悉數(shù)據(jù)的首選方法??梢暬夹g(shù)為理解代碼變更提供了便利。
現(xiàn)有的代碼重構(gòu)方法和可視化方法都有著自身的優(yōu)缺點(diǎn),如何更好地運(yùn)用這些可視化方法和模型來幫助代碼重構(gòu)分析人員觀察代碼重構(gòu)檢測結(jié)果、分析系統(tǒng)的重構(gòu)關(guān)系及重構(gòu)分布仍需要結(jié)合實(shí)際的問題?,F(xiàn)有的代碼重構(gòu)檢測工具由于實(shí)現(xiàn)原理有所不同,因此檢測出的結(jié)果形式各不相同。代碼重構(gòu)可視化相應(yīng)的展示只側(cè)重于代碼重構(gòu)數(shù)據(jù)的展示,未對其中的重構(gòu)模式進(jìn)行展示,這對分析人員查看結(jié)果并進(jìn)行分析及可視化的工作都造成了困難。目前,在重構(gòu)檢測及可視化方面的研究包括函數(shù)抽取重構(gòu)的檢測算法[3]、基于變更相似性的跨語言克隆檢測方法[4]、基于MVC框架的系統(tǒng)重構(gòu)方法研究[5]、克隆代碼可視化的研究[6]、可視化在大數(shù)據(jù)分析實(shí)現(xiàn)的研究[7]等。本文設(shè)計(jì)了一個(gè)代碼重構(gòu)展示系統(tǒng),基于變更塊對一個(gè)源文件的2個(gè)連續(xù)版本中的代碼變更數(shù)據(jù)進(jìn)行分析處理,實(shí)現(xiàn)了代碼重構(gòu)模式的相關(guān)展示,使用戶能夠更好地分析、理解代碼變更數(shù)據(jù)信息。
1 系統(tǒng)開發(fā)相關(guān)技術(shù)
1.1 MVC設(shè)計(jì)模式
MVC設(shè)計(jì)模式包括3個(gè)模塊:模型(Model)、視圖(View)和控制器(Controller)。這3個(gè)模塊都有各自的功能和特點(diǎn),彼此間相互獨(dú)立,改變一個(gè)模塊不會(huì)影響到其它模塊,多個(gè)視圖可以共享一個(gè)模型,提高了代碼的可重用性。模型用于封裝應(yīng)用程序的數(shù)據(jù)和用于控制、訪問和修改數(shù)據(jù)的規(guī)則,視圖用于數(shù)據(jù)信息的可交互界面設(shè)計(jì),控制器用于對請求進(jìn)行響應(yīng),并根據(jù)請求進(jìn)行相應(yīng)的操作,完成用戶請求。
1.2 GNU Diff工具
GNU Diff工具是一個(gè)文本差異化工具,處理輸出的基本對象是一個(gè)變更塊(hunk)。用于顯示文件是否存在差異,并提供了一些抑制某些看起來不重要的差異的方法。最常見的差異是指文字或線條之間的空白量的變化。工具還提供了抑制字母表中的差異的方法,或者與匹配的正規(guī)表達(dá)式的行相匹配,將2個(gè)文檔的內(nèi)容進(jìn)行比較,以便用戶對文檔內(nèi)容信息進(jìn)行分析和處理。
1.3 ChangeDistiller工具
ChangeDistiller工具是Beat Fluri等人[8-9]編寫的一個(gè)Tree differ算法。是一種基于細(xì)粒度的源代碼抽象語法樹差分算法。通過對代碼變更前后抽象語法樹的對比,獲取代碼變更數(shù)據(jù)并對其進(jìn)行分類。該算法將源代碼變更數(shù)據(jù)定義為一個(gè)或一組基本抽象語法樹的邏輯操作,通過比較2個(gè)抽象語法樹節(jié)點(diǎn)之間的匹配和最小編輯腳本對變更數(shù)據(jù)進(jìn)行提取。
1.4 XLoadTree組件
XLoadTree組件是基于AJAX和XML的動(dòng)態(tài)加載JS樹組件,通過對樹節(jié)點(diǎn)的source屬性定義指向一個(gè)xml文件,從而使數(shù)據(jù)進(jìn)行載入,其可以包含嵌套的子節(jié)點(diǎn)以及指向其它xml文件的子節(jié)點(diǎn),利用DOM進(jìn)行轉(zhuǎn)換。
1.5 Layout布局
JQuery EasyUI布局插件—Layout,布局是包含5個(gè)區(qū)域的容器。布局中心的區(qū)域面板是必不可少的,邊緣區(qū)域面板是可供選擇的,每個(gè)邊緣區(qū)域面板都是可以通過拖拽邊框調(diào)整邊框尺寸的,并且還可以通過折疊觸發(fā)器對面板區(qū)域進(jìn)行折疊。布局是可以嵌套的,可以進(jìn)行復(fù)雜的界面布局,通過布局將界面分為相應(yīng)的區(qū)域,分別展示不同的信息。
2 系統(tǒng)分析與設(shè)計(jì)
基于對系統(tǒng)需求的綜合分析,設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)Web端的代碼重構(gòu)展示系統(tǒng),將代碼重構(gòu)檢測與可視化技術(shù)結(jié)合起來,應(yīng)用到一個(gè)系統(tǒng)中。用戶可以通過該系統(tǒng)對一個(gè)源文件的2個(gè)連續(xù)修改版本中的變更數(shù)據(jù)信息進(jìn)行代碼重構(gòu)檢測、變更塊展示和重構(gòu)模式展示等操作,使代碼重構(gòu)變得更加簡單、直觀,便于用戶對存在重構(gòu)的代碼變更進(jìn)行分析、理解。
2.1 系統(tǒng)功能設(shè)計(jì)
在代碼重構(gòu)展示系統(tǒng)中,主要分為2個(gè)部分:前臺和后臺管理。在前臺方面,未登錄用戶可以通過選擇本地?cái)?shù)據(jù)的修改版本數(shù)據(jù)進(jìn)行文件信息瀏覽、變更塊數(shù)據(jù)展示和重構(gòu)模式展示;登錄用戶可以通過上傳文件進(jìn)行代碼重構(gòu)檢測從而進(jìn)行變更塊數(shù)據(jù)展示和代碼重構(gòu)模式方面的相關(guān)展示。在后臺管理方面,管理員可以對本地?cái)?shù)據(jù)信息進(jìn)行管理,并對用戶的數(shù)據(jù)信息進(jìn)行相應(yīng)的管理。系統(tǒng)功能設(shè)計(jì)如下。
2.1.1 前臺功能設(shè)計(jì)分析
(1)注冊與登錄:用戶可以通過注冊設(shè)置用戶名和密碼進(jìn)行登錄操作;
(2)修改個(gè)人信息:用戶可以在登錄系統(tǒng)之后對自己的個(gè)人信息進(jìn)行修改;
(3)查詢文件信息:用戶可以根據(jù)源文件的修改版本和文件名對文件信息進(jìn)行查詢;
(4)上傳文件數(shù)據(jù):用戶通過上傳文件的方式,對文件進(jìn)行代碼重構(gòu)檢測,展示其變更塊數(shù)據(jù)信息,如存在代碼重構(gòu)則進(jìn)行重構(gòu)模式展示;
(5)變更塊展示:對存在代碼變更的代碼變更塊數(shù)據(jù)進(jìn)行相應(yīng)模式的展示;
(6)重構(gòu)模式展示:對代碼變更中存在重構(gòu)關(guān)系的重構(gòu)模式進(jìn)行相應(yīng)的展示。
2.1.2 后臺管理功能設(shè)計(jì)分析
(1)用戶信息管理:管理員可以對用戶信息進(jìn)行管理;
(2)文件數(shù)據(jù)管理:管理員可以對數(shù)據(jù)信息進(jìn)行添加、刪除和修改等操作;
(3)文件數(shù)據(jù)查詢:管理員可以根據(jù)源文件的修改版本和文件名對文件信息進(jìn)行查詢;
(4)變更塊展示數(shù)據(jù)管理:管理員可以對變更塊展示的數(shù)據(jù)進(jìn)行管理;
(5)重構(gòu)模式展示數(shù)據(jù)管理:管理員可以對重構(gòu)模式展示的數(shù)據(jù)信息進(jìn)行管理。
根據(jù)上述分析,可以得到系統(tǒng)的功能結(jié)構(gòu)如圖1所示。
2.2 數(shù)據(jù)庫設(shè)計(jì)
在系統(tǒng)設(shè)計(jì)中,數(shù)據(jù)庫設(shè)計(jì)是非常重要的一個(gè)環(huán)節(jié)。數(shù)據(jù)是系統(tǒng)設(shè)計(jì)的基礎(chǔ),數(shù)據(jù)庫設(shè)計(jì)的合理、完善程度將直接決定系統(tǒng)的成敗。在本系統(tǒng)中,數(shù)據(jù)庫采用MySQL數(shù)據(jù)庫。根據(jù)對系統(tǒng)功能需求的深入分析、并結(jié)合各實(shí)體之間的聯(lián)系建立的。數(shù)據(jù)庫結(jié)構(gòu)見表1。
(1)用戶信息表(users):用于記錄前臺用戶的基本數(shù)據(jù)信息;
(2)管理員信息表(admin):用于記錄管理員的基本數(shù)據(jù)信息;
(3)版本信息表(revisions):用于記錄版本庫中版本數(shù)據(jù)的數(shù)據(jù)信息;
(4)變更記錄表(actions):用于記錄版本信息的變更操作數(shù)據(jù)信息;
(5)文件表(files):用于記錄版本庫中的所有文件數(shù)據(jù)信息;
(6)開發(fā)者表(authors):用于記錄項(xiàng)目版本開發(fā)者數(shù)據(jù)信息;
(7)內(nèi)容表(contents):用于記錄在版本庫中首次添加的文件內(nèi)容數(shù)據(jù)信息;
(8)變更內(nèi)容表(diffs):用于記錄一個(gè)源文件的2個(gè)連續(xù)版本之間的diff數(shù)據(jù)信息;
(9)變更塊數(shù)據(jù)表(hunks):用于記錄代碼變更的變更塊及其行號范圍等數(shù)據(jù)信息。
3 系統(tǒng)實(shí)現(xiàn)
該代碼重構(gòu)展示系統(tǒng)應(yīng)用B/S架構(gòu),采用 MVC設(shè)計(jì)模式,利用JSP+JavaBean+Servlet技術(shù)設(shè)計(jì)實(shí)現(xiàn)。系統(tǒng)整體由數(shù)據(jù)表現(xiàn)層、業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層3個(gè)功能模塊組成,使系統(tǒng)結(jié)構(gòu)更加清晰,運(yùn)行效率更高,降低了系統(tǒng)層與層之間的耦合性,便于系統(tǒng)運(yùn)行維護(hù)。其中,數(shù)據(jù)表現(xiàn)層由JSP實(shí)現(xiàn),業(yè)務(wù)邏輯層由JavaBean實(shí)現(xiàn),數(shù)據(jù)訪問層由Servlet實(shí)現(xiàn)。在系統(tǒng)實(shí)現(xiàn)過程中,主要包括前臺和后臺2個(gè)管理模塊。系統(tǒng)前臺模塊主要是接收用戶的請求,實(shí)現(xiàn)相應(yīng)數(shù)據(jù)的展示功能。后臺管理模塊主要是用于對相關(guān)數(shù)據(jù)的管理。
3.1 前臺功能實(shí)現(xiàn)
主要實(shí)現(xiàn)相關(guān)數(shù)據(jù)的展示和用戶發(fā)送數(shù)據(jù)請求:
(1)查詢文件信息。用戶通過源文件的修改版本和文件名對文件信息進(jìn)行查詢,并可以查看文件的變更塊展示及其是否存在重構(gòu),如存在則可查看其重構(gòu)模式展示;
(2)上傳文件數(shù)據(jù)。用戶登錄后可以通過上傳文件數(shù)據(jù),利用ChangeDistiller工具、GNU Diff工具和Levenshtein算法對文件數(shù)據(jù)進(jìn)行重構(gòu)檢測。然后,進(jìn)行相應(yīng)的代碼變更塊展示和重構(gòu)模式展示;
(3)變更塊展示。利用GNU Diff工具對一個(gè)源文件的2個(gè)連續(xù)修改版本文件進(jìn)行變更數(shù)據(jù)獲取,獲取hunk,形成hunk集,進(jìn)行變更塊展示;
(4)重構(gòu)模式展示。利用獲取的hunk數(shù)據(jù)進(jìn)行代碼重構(gòu)識別,提取相關(guān)重構(gòu)參數(shù)和變更塊數(shù)據(jù),選取相應(yīng)的重構(gòu)模式展示模塊,進(jìn)行重構(gòu)模式展示。
3.2 后臺管理功能實(shí)現(xiàn)
主要實(shí)現(xiàn)本地?cái)?shù)據(jù)的獲取、查詢、分析、管理等功能:
(1)文件數(shù)據(jù)管理。本地?cái)?shù)據(jù)來源是利用MiniGit工具獲取的開源項(xiàng)目數(shù)據(jù),并將數(shù)據(jù)進(jìn)行分析、處理之后存儲到本地?cái)?shù)據(jù)庫。該模塊實(shí)現(xiàn)了本地?cái)?shù)據(jù)的管理并對用戶上傳的文件信息進(jìn)行管理,可以對相關(guān)數(shù)據(jù)進(jìn)行刪除、修改和查詢等功能;
(2)變更數(shù)據(jù)管理。實(shí)現(xiàn)了對系統(tǒng)實(shí)現(xiàn)過程中的變更數(shù)據(jù)的管理。通過該模塊可以實(shí)現(xiàn)數(shù)據(jù)的刪除、修改和查詢等功能,以便更好地對變更數(shù)據(jù)進(jìn)行管理。
系統(tǒng)主要功能運(yùn)行界面如圖2、3所示。
4 結(jié)束語
代碼重構(gòu)展示系統(tǒng)實(shí)現(xiàn)了代碼變更塊和重構(gòu)模式的相關(guān)展示,實(shí)現(xiàn)了對一個(gè)源文件的2個(gè)連續(xù)修改版本的代碼重構(gòu)檢測和重構(gòu)模式展示。系統(tǒng)使用目前較成熟的框架和開發(fā)工具進(jìn)行開發(fā),為后期系統(tǒng)維護(hù)和后續(xù)開發(fā)提供了便利。
參考文獻(xiàn)
[1]FOWLER M, BECK K, BRANT J,et al. Refactoring:Improving the design of existing code[M]. Sebastopol,CA:Addison-Wesley Professional,1999.
[2] WARE C. Information visualization:Perception for design[M]. 2nd ed. San Francisco:Elsevier,2004.
[3] 劉陽,劉秋榮,劉輝. 函數(shù)抽取重構(gòu)的自動(dòng)檢測方法[J]. 計(jì)算機(jī)科學(xué),2015,42(12):105-107.
[4] 柳萌宇,鐘浩,于海波. 基于變更相似性的跨語言克隆檢測方法[J]. 計(jì)算機(jī)與現(xiàn)代化,2016(4):79-84, 99.
[5] 李景炤,咼文承,胡伶俐,等. 基于MVC框架的系統(tǒng)重構(gòu)方法研究與實(shí)踐[J]. 電腦知識與技術(shù),2015, 11(22):63-66.
[6] 何薔. 克隆代碼可視化系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D]. 哈爾濱:哈爾濱工業(yè)大學(xué),2015.
[7] 王博,沈方方. 可視化在大數(shù)據(jù)分析領(lǐng)域的實(shí)現(xiàn)要點(diǎn)[J]. 中國新通信,2017,19(14):72.
[8] FLURI B, GALL H C. Classifying change types for qualifying change couplings[C]//ICPC'06 Proceedings of the 14th IEEE International Conference on Program Comprehension. Washington, DC, USA:IEEE,2006:35-45.
[9] FLURI B,WRSCH M, PINZGER M, et al.Change distilling:Tree differencing for fine-grained source code change extraction[J]. IEEE Transactions on Software Engineering,2007,33(11):725-743.