郭 雪
(山西大學(xué)軟件學(xué)院,山西太原030013)
即時重構(gòu)系統(tǒng)下的switch語句檢測算法
郭 雪
(山西大學(xué)軟件學(xué)院,山西太原030013)
軟件重構(gòu)是在不改變軟件外部特性的前提下重新組織其內(nèi)部結(jié)構(gòu)從而提高軟件的可維護(hù)性、可擴(kuò)展性以及可重用性的技術(shù)統(tǒng)稱。代碼壞味是程序中存在的需要進(jìn)行重構(gòu)的代碼部分,是軟件的設(shè)計(jì)缺陷。軟件重構(gòu)就是不斷進(jìn)行壞味查找和修改的過程?;诒O(jiān)控的即時重構(gòu)系統(tǒng)通過后臺運(yùn)行的監(jiān)控機(jī)制分析處理代碼的變化,并可選擇合適的檢測時機(jī)對代碼進(jìn)行壞味檢測,并將檢測結(jié)果反饋給程序員,提醒其重構(gòu)。Switch語句是在軟件開發(fā)過程中使用較多的一種分支結(jié)構(gòu)語句,但大量使用該語句則會造成代碼冗余。本文將結(jié)合基于監(jiān)控的即時重構(gòu)特點(diǎn),對代碼中的Switch語句進(jìn)行查尋,并設(shè)計(jì)相應(yīng)的檢測算法,尋找冗余部分。將該檢測算法應(yīng)用于即時重構(gòu)系統(tǒng)可顯著提高重構(gòu)效率。
軟件重構(gòu);壞味;即時重構(gòu);Switch語句
重構(gòu)是在不改變軟件外部特性的前提下重新組織其內(nèi)部結(jié)構(gòu)從而提高軟件的可維護(hù)性、可擴(kuò)展性以及可重用性的技術(shù)統(tǒng)稱[1]。通過軟件重構(gòu)可以使軟件對外界需求及變更始終具有較強(qiáng)的適應(yīng)能力[2-3]。自軟件重構(gòu)的概念被提出以來,軟件重構(gòu)主要用于支持面向?qū)ο髴?yīng)用框架的設(shè)計(jì)與復(fù)用,其本質(zhì)是改進(jìn)已經(jīng)寫好的設(shè)計(jì)。
代碼壞味是程序中存在的需要進(jìn)行重構(gòu)的代碼部分[1],是軟件的設(shè)計(jì)缺陷。軟件重構(gòu)就是不斷進(jìn)行壞味查找和修改。
軟件重構(gòu)先后經(jīng)歷了純手工式與半自動化式。在早期,程序員必須依據(jù)自己的經(jīng)驗(yàn),遍歷整個項(xiàng)目代碼查找壞味。壞味查找的主觀性較強(qiáng),且工作量大、容易出錯。隨后,人們研究出一系列的壞味檢測與重構(gòu)工具[4-5]:檢測工具通過預(yù)先設(shè)定的度量值,通過對軟件結(jié)構(gòu)的分析處理來查找并鎖定壞味;而重構(gòu)工具可幫助程序員執(zhí)行重構(gòu)。重構(gòu)工具將全部或部分重構(gòu)活動自動化,不僅降低了軟件重構(gòu)的成本使重構(gòu)過程變得方便靈活,也降低了由于人們的主觀原因而導(dǎo)致的出錯概率。
雖然重構(gòu)工具的產(chǎn)生極大的簡化了重構(gòu)過程,提高了程序員的重構(gòu)效率[5],但是最初的壞味檢測工具及重構(gòu)工具都依賴程序員的調(diào)用——只有當(dāng)程序員意識到需要對代碼進(jìn)行重構(gòu)時才會被調(diào)用。然而,在很多情況下,缺乏重構(gòu)經(jīng)驗(yàn)的重構(gòu)人員往往無法及時感知重構(gòu)時機(jī),從而很少調(diào)用重構(gòu)工具,結(jié)果導(dǎo)致大量的重構(gòu)機(jī)會流失。重構(gòu)不足將導(dǎo)致軟件質(zhì)量下降,而延遲重構(gòu)又會導(dǎo)致重構(gòu)成本的增加——沒有對軟件進(jìn)行前期的優(yōu)化導(dǎo)致其質(zhì)量偏低;代碼中任何改動都有可能牽一發(fā)而動全身,增加了重構(gòu)的成本;與前期開發(fā)的相隔時間較長(尤其針對大型項(xiàng)目),程序員必須重新回顧整個開發(fā)過程才能進(jìn)行重構(gòu),消耗了大量的時間。
即時重構(gòu)系統(tǒng)[6]的提出彌補(bǔ)了傳統(tǒng)重構(gòu)中重構(gòu)工具依賴程序員主觀調(diào)用的缺陷,可即時獲知代碼中的壞味并提醒程序員進(jìn)行重構(gòu)。該系統(tǒng)的調(diào)用無需人工干預(yù),可在較短的時間間隔內(nèi)對代碼進(jìn)行壞味檢測,并將檢測結(jié)果及時反饋給程序員從而提醒其重構(gòu)。且整個系統(tǒng)采用后臺線程(該線程與用戶主線程并行)的方式運(yùn)行,開發(fā)人員可在系統(tǒng)對代碼進(jìn)行壞味檢測的同時繼續(xù)編程。
多分支語句switch語句,也稱為開關(guān)語句,是編程過程中經(jīng)常涉及的一種語法結(jié)構(gòu),其形式如圖1所示:
圖1 switch語句基本格式
其對應(yīng)流程圖如圖2:
圖2 switch語句執(zhí)行流程圖
然而,在面向?qū)ο蟪绦蛟O(shè)計(jì)中由于switch語句可能造成代碼重復(fù),造成代碼冗余,不利于軟件的發(fā)展,所以應(yīng)盡量少使用switch語句。在軟件重構(gòu)中,將重復(fù)的幾個switch語句稱為“switch驚悚現(xiàn)身”[1],也可稱為switch語句壞味。在軟件重構(gòu)過程中,該類壞味是壞味檢測的重點(diǎn)對象。
由于基于監(jiān)控壞味檢測具有實(shí)時監(jiān)測的特征,所以其檢測對象可以限定為當(dāng)前源文件中的內(nèi)容。在該過程中,對當(dāng)前源文件中類的成分進(jìn)行檢測和統(tǒng)計(jì),得到當(dāng)前源文件中所有Switch類型節(jié)點(diǎn)。
可利用Eclipse插件來實(shí)現(xiàn)。由于目前Java語言的應(yīng)用較廣,所以在這里以Java項(xiàng)目為例實(shí)現(xiàn)檢測。Java模型是用來對Java程序相關(guān)聯(lián)的對象進(jìn)行建模的一類。Java模型類是在org.eclipse.jdt.core中定義的。這些類將Java資源分解成各類元素。在這些元素中,IJavaElement是其他元素的基礎(chǔ)。本文中用到的主要模型元素包括:IJavaElement(模型中的所有元素)、IJavaProject(項(xiàng)目)、ICompilation?Unit(源文件)等。
對項(xiàng)目進(jìn)行建模后可利用接口中的API函數(shù)來得到所需的檢測對象。Switch語句檢測的對象是當(dāng)前文件的AST樹中所有的SwitchStatement類型的節(jié)點(diǎn)。其目的是查找文件中所有具有相同表達(dá)式的switch語句。當(dāng)前源文件可利用已有的API函數(shù)可以獲得。假設(shè)已經(jīng)得到的當(dāng)前源文件為unit,先將現(xiàn)該文件解析成AST(抽象語法樹)的形式:
unit為當(dāng)前源文件根節(jié)點(diǎn),對應(yīng)子節(jié)點(diǎn)的類型為TypeDeclaration(類),代表源文件中的類;類子節(jié)點(diǎn)為FunctionDeclaration(函數(shù))類型,代表類中的函數(shù),而函數(shù)的子節(jié)點(diǎn)為DateDwclaration(數(shù)據(jù)聲明)類型,代表函數(shù)中的數(shù)據(jù)??赏ㄟ^逐級遍歷該AST樹來得到源文件中的函數(shù),并對其進(jìn)行中間人壞味檢測。檢測過程的偽碼如下:
在該過程中,鏈表types用來存放當(dāng)前源文件中的類,數(shù)組meths用來存放類中的所有函數(shù)。然后在函數(shù)中尋找Switch類型節(jié)點(diǎn),并對每個節(jié)點(diǎn)進(jìn)行檢測。
完整的switch語句應(yīng)該包括:switch后的(Ex?pression)和SwitchCase|Statement兩部分,查找相似的兩個switch語句,就應(yīng)該分別對這兩部分進(jìn)行檢測。圖3為該節(jié)點(diǎn)的結(jié)構(gòu)圖。
圖3 switch節(jié)點(diǎn)結(jié)構(gòu)圖
檢測兩個switch語句是否相同要分別對它們的switch表達(dá)式以及case表達(dá)式進(jìn)行匹配(如果兩種表達(dá)式全部匹配成功則這兩個switch語句相同)。假設(shè)現(xiàn)有SwitchStatement類型的節(jié)點(diǎn)node_1與node_2,則它們的匹配過程如下:
(1)可通過node_1.getExpression()得到兩個節(jié)點(diǎn)的switch表達(dá)式,并對其進(jìn)行相似性檢測。
(2)如果 switch(Expression)表達(dá)式不同,說明被檢測的兩個節(jié)點(diǎn)不具有相似性,則其不屬于switch語句壞味;而如果兩個switch語句的Expres?sion表達(dá)式相同則需進(jìn)一步進(jìn)行case表達(dá)式檢測。由于case表達(dá)式有多個,所以可將其存入數(shù)組并依次進(jìn)行檢測。如果有一個case表達(dá)式不同,則檢測結(jié)束,跳出循環(huán),重新開始檢測下一個case表達(dá)式。具體過程如下:
∕∕進(jìn)行相似度檢測,如果有一個case不匹配則兩個switch節(jié)點(diǎn)不相同return false,否則return true。
...}
如果以上兩種情況都匹配成功則創(chuàng)建相應(yīng)的壞味實(shí)例并將其加入壞味列表:
smellList.add(asmell);
該檢測算法是基于監(jiān)控的即時檢測,檢測對象僅為當(dāng)前源文件。檢測過程會由檢測系統(tǒng)通過調(diào)用插件自動進(jìn)行,并將結(jié)果反饋給程序員提醒其進(jìn)行重構(gòu)。
假設(shè)當(dāng)前源文件中含有的switch節(jié)點(diǎn)數(shù)量為n,而項(xiàng)目文件中的結(jié)點(diǎn)總數(shù)為N,由于檢測過程是在當(dāng)前源文件中的節(jié)點(diǎn)ni與其余(N-1)個節(jié)點(diǎn)之間進(jìn)行,所以該檢測過程的時間復(fù)雜度僅為(N-1)*n。與傳統(tǒng)檢測方式相比,該方法能夠節(jié)省大量的檢測時間,提高檢測效率。
即時重構(gòu)系統(tǒng)是一種基于監(jiān)控的重構(gòu)系統(tǒng)。該系統(tǒng)的特點(diǎn)是:該系統(tǒng)通過監(jiān)控工作區(qū)源代碼可自動調(diào)用相應(yīng)的壞味檢測工具對代碼進(jìn)行檢測,整個過程無需人工干預(yù)。該系統(tǒng)已經(jīng)以插件的形式被實(shí)現(xiàn)[11]。同時,由于其獨(dú)特的壞味檢測方式(壞味檢測只針對工作區(qū)的當(dāng)前源文件),并在較短的時間間隔內(nèi)對代碼進(jìn)行壞味檢測,可顯著提高檢測效率。
本文通過分析switch語句的特點(diǎn),對switch(Expression)和SwitchCase|Statement兩部分設(shè)計(jì)檢測算法,通過遍歷項(xiàng)目文件找到相似的兩個switch節(jié)點(diǎn)。將該檢測算法應(yīng)用于即時重構(gòu)系統(tǒng),通過后臺監(jiān)控機(jī)制對代碼進(jìn)行監(jiān)控,并選擇適當(dāng)?shù)臅r機(jī)進(jìn)行檢測,可顯著提高重構(gòu)效率,降低軟件開發(fā)成本。
[1]MARTIN Fowler.重構(gòu)-改善既有代碼的設(shè)計(jì)[M].熊節(jié),譯.北京:人民郵電出版社,2010.
[2]程杰.大話設(shè)計(jì)模式 [M].北京:清華大學(xué)出版社,2010.
[3]林治.軟件重構(gòu)在軟件開發(fā)過程中的作用分析[J].揚(yáng)州教育學(xué)院學(xué)報(bào),2007,25(3):21-24.
[4]劉輝,麻志毅,邵維忠.一維基于圖形轉(zhuǎn)換的模型重構(gòu)描述語言[J].軟件學(xué)院,2009,20(8):2087-2101.
[5]王忠杰,徐曉飛,戰(zhàn)德臣.面向復(fù)用成本優(yōu)化的構(gòu)建重構(gòu)方法[J].軟件學(xué)院,2005,16(2):2157-2165.
[6]HUI Liu,XUE Guo,WEI Zhomgshao.Monitor-based Instant Software Refactoring[J].IEEE Transactions on Software Engineering,2013,39(8):1112-1126.
Switch Statements Detection Algorithm Based on Real-time Reconstruction System
GUO Xue
(School of Software,Shanxi University,Taiyuan Shanxi,030013)
Software reconstruction means to reconstruct the inside of the organization to improve the maitainability,ex?tendibility and reusability without changing the outside of software.Bad smell,the design defect of software,is the code needed to be reconstructed existing in the program.Software reconstruction is a process to look for and modify the bad smell continually.Real-time reconstruction system analyzes the changes of code through monitoring mechanism of back?ground operation,tests the bad smell at a proper time,gives the feedback to programmer and informs them to reconstruct.Switch statements are used frequently in the development of software,however,using too much can cause code redundance.This paper,based on the real-time reconstruction of monitoring,looked up the Switch statements in code,designed the de?tection algorithm,found the redundance.To apply the detection alforithm in the real-time reconstruction system can im?prove the efficiency of reconstruction.
software reconstruction;bad smell;real-time reconstruction;Switch statements
O141.4
A
1674-0874(2015)05-0009-04
2014-08-06
郭雪(1987-),女,山西原平人,碩士,助教,主要研究方向:軟件重構(gòu)與軟件測試。
〔責(zé)任編輯 高?!?/p>