郭 雪
(山西大學軟件學院,山西太原030013)
即時重構系統下的switch語句檢測算法
郭 雪
(山西大學軟件學院,山西太原030013)
軟件重構是在不改變軟件外部特性的前提下重新組織其內部結構從而提高軟件的可維護性、可擴展性以及可重用性的技術統稱。代碼壞味是程序中存在的需要進行重構的代碼部分,是軟件的設計缺陷。軟件重構就是不斷進行壞味查找和修改的過程。基于監控的即時重構系統通過后臺運行的監控機制分析處理代碼的變化,并可選擇合適的檢測時機對代碼進行壞味檢測,并將檢測結果反饋給程序員,提醒其重構。Switch語句是在軟件開發過程中使用較多的一種分支結構語句,但大量使用該語句則會造成代碼冗余。本文將結合基于監控的即時重構特點,對代碼中的Switch語句進行查尋,并設計相應的檢測算法,尋找冗余部分。將該檢測算法應用于即時重構系統可顯著提高重構效率。
軟件重構;壞味;即時重構;Switch語句
重構是在不改變軟件外部特性的前提下重新組織其內部結構從而提高軟件的可維護性、可擴展性以及可重用性的技術統稱[1]。通過軟件重構可以使軟件對外界需求及變更始終具有較強的適應能力[2-3]。自軟件重構的概念被提出以來,軟件重構主要用于支持面向對象應用框架的設計與復用,其本質是改進已經寫好的設計。
代碼壞味是程序中存在的需要進行重構的代碼部分[1],是軟件的設計缺陷。軟件重構就是不斷進行壞味查找和修改。
軟件重構先后經歷了純手工式與半自動化式。在早期,程序員必須依據自己的經驗,遍歷整個項目代碼查找壞味。壞味查找的主觀性較強,且工作量大、容易出錯。隨后,人們研究出一系列的壞味檢測與重構工具[4-5]:檢測工具通過預先設定的度量值,通過對軟件結構的分析處理來查找并鎖定壞味;而重構工具可幫助程序員執行重構。重構工具將全部或部分重構活動自動化,不僅降低了軟件重構的成本使重構過程變得方便靈活,也降低了由于人們的主觀原因而導致的出錯概率。
雖然重構工具的產生極大的簡化了重構過程,提高了程序員的重構效率[5],但是最初的壞味檢測工具及重構工具都依賴程序員的調用——只有當程序員意識到需要對代碼進行重構時才會被調用。然而,在很多情況下,缺乏重構經驗的重構人員往往無法及時感知重構時機,從而很少調用重構工具,結果導致大量的重構機會流失。重構不足將導致軟件質量下降,而延遲重構又會導致重構成本的增加——沒有對軟件進行前期的優化導致其質量偏低;代碼中任何改動都有可能牽一發而動全身,增加了重構的成本;與前期開發的相隔時間較長(尤其針對大型項目),程序員必須重新回顧整個開發過程才能進行重構,消耗了大量的時間。
即時重構系統[6]的提出彌補了傳統重構中重構工具依賴程序員主觀調用的缺陷,可即時獲知代碼中的壞味并提醒程序員進行重構。該系統的調用無需人工干預,可在較短的時間間隔內對代碼進行壞味檢測,并將檢測結果及時反饋給程序員從而提醒其重構。且整個系統采用后臺線程(該線程與用戶主線程并行)的方式運行,開發人員可在系統對代碼進行壞味檢測的同時繼續編程。
多分支語句switch語句,也稱為開關語句,是編程過程中經常涉及的一種語法結構,其形式如圖1所示:

圖1 switch語句基本格式
其對應流程圖如圖2:

圖2 switch語句執行流程圖
然而,在面向對象程序設計中由于switch語句可能造成代碼重復,造成代碼冗余,不利于軟件的發展,所以應盡量少使用switch語句。在軟件重構中,將重復的幾個switch語句稱為“switch驚悚現身”[1],也可稱為switch語句壞味。在軟件重構過程中,該類壞味是壞味檢測的重點對象。
由于基于監控壞味檢測具有實時監測的特征,所以其檢測對象可以限定為當前源文件中的內容。在該過程中,對當前源文件中類的成分進行檢測和統計,得到當前源文件中所有Switch類型節點。
可利用Eclipse插件來實現。由于目前Java語言的應用較廣,所以在這里以Java項目為例實現檢測。Java模型是用來對Java程序相關聯的對象進行建模的一類。Java模型類是在org.eclipse.jdt.core中定義的。這些類將Java資源分解成各類元素。在這些元素中,IJavaElement是其他元素的基礎。本文中用到的主要模型元素包括:IJavaElement(模型中的所有元素)、IJavaProject(項目)、ICompilation?Unit(源文件)等。
對項目進行建模后可利用接口中的API函數來得到所需的檢測對象。Switch語句檢測的對象是當前文件的AST樹中所有的SwitchStatement類型的節點。其目的是查找文件中所有具有相同表達式的switch語句。當前源文件可利用已有的API函數可以獲得。假設已經得到的當前源文件為unit,先將現該文件解析成AST(抽象語法樹)的形式:

unit為當前源文件根節點,對應子節點的類型為TypeDeclaration(類),代表源文件中的類;類子節點為FunctionDeclaration(函數)類型,代表類中的函數,而函數的子節點為DateDwclaration(數據聲明)類型,代表函數中的數據。可通過逐級遍歷該AST樹來得到源文件中的函數,并對其進行中間人壞味檢測。檢測過程的偽碼如下:

在該過程中,鏈表types用來存放當前源文件中的類,數組meths用來存放類中的所有函數。然后在函數中尋找Switch類型節點,并對每個節點進行檢測。
完整的switch語句應該包括:switch后的(Ex?pression)和SwitchCase|Statement兩部分,查找相似的兩個switch語句,就應該分別對這兩部分進行檢測。圖3為該節點的結構圖。

圖3 switch節點結構圖
檢測兩個switch語句是否相同要分別對它們的switch表達式以及case表達式進行匹配(如果兩種表達式全部匹配成功則這兩個switch語句相同)。假設現有SwitchStatement類型的節點node_1與node_2,則它們的匹配過程如下:
(1)可通過node_1.getExpression()得到兩個節點的switch表達式,并對其進行相似性檢測。
(2)如果 switch(Expression)表達式不同,說明被檢測的兩個節點不具有相似性,則其不屬于switch語句壞味;而如果兩個switch語句的Expres?sion表達式相同則需進一步進行case表達式檢測。由于case表達式有多個,所以可將其存入數組并依次進行檢測。如果有一個case表達式不同,則檢測結束,跳出循環,重新開始檢測下一個case表達式。具體過程如下:


∕∕進行相似度檢測,如果有一個case不匹配則兩個switch節點不相同return false,否則return true。
...}
如果以上兩種情況都匹配成功則創建相應的壞味實例并將其加入壞味列表:
smellList.add(asmell);
該檢測算法是基于監控的即時檢測,檢測對象僅為當前源文件。檢測過程會由檢測系統通過調用插件自動進行,并將結果反饋給程序員提醒其進行重構。
假設當前源文件中含有的switch節點數量為n,而項目文件中的結點總數為N,由于檢測過程是在當前源文件中的節點ni與其余(N-1)個節點之間進行,所以該檢測過程的時間復雜度僅為(N-1)*n。與傳統檢測方式相比,該方法能夠節省大量的檢測時間,提高檢測效率。
即時重構系統是一種基于監控的重構系統。該系統的特點是:該系統通過監控工作區源代碼可自動調用相應的壞味檢測工具對代碼進行檢測,整個過程無需人工干預。該系統已經以插件的形式被實現[11]。同時,由于其獨特的壞味檢測方式(壞味檢測只針對工作區的當前源文件),并在較短的時間間隔內對代碼進行壞味檢測,可顯著提高檢測效率。
本文通過分析switch語句的特點,對switch(Expression)和SwitchCase|Statement兩部分設計檢測算法,通過遍歷項目文件找到相似的兩個switch節點。將該檢測算法應用于即時重構系統,通過后臺監控機制對代碼進行監控,并選擇適當的時機進行檢測,可顯著提高重構效率,降低軟件開發成本。
[1]MARTIN Fowler.重構-改善既有代碼的設計[M].熊節,譯.北京:人民郵電出版社,2010.
[2]程杰.大話設計模式 [M].北京:清華大學出版社,2010.
[3]林治.軟件重構在軟件開發過程中的作用分析[J].揚州教育學院學報,2007,25(3):21-24.
[4]劉輝,麻志毅,邵維忠.一維基于圖形轉換的模型重構描述語言[J].軟件學院,2009,20(8):2087-2101.
[5]王忠杰,徐曉飛,戰德臣.面向復用成本優化的構建重構方法[J].軟件學院,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-),女,山西原平人,碩士,助教,主要研究方向:軟件重構與軟件測試。
〔責任編輯 高海〕