李炎武
(四川大學(xué)計(jì)算機(jī)學(xué)院,成都 610065)
軟件工程中代碼異味檢測(cè)方法的研究
李炎武
(四川大學(xué)計(jì)算機(jī)學(xué)院,成都 610065)
在軟件工程中,軟件重構(gòu)具有重要意義,它可以提高軟件的可維護(hù)性、可擴(kuò)展性、可重用性,進(jìn)而改善軟件質(zhì)量。在軟件重構(gòu)中,代碼異味檢測(cè)是其中的重要組成部分。目前,代碼異味檢測(cè)的相關(guān)研究劃分為幾個(gè)類別。在對(duì)基于搜索的代碼異味檢測(cè)方法進(jìn)行研究后,選擇決策樹算法來(lái)對(duì)四個(gè)代碼異味進(jìn)行檢測(cè),并取得不錯(cuò)的效果。
軟件工程;軟件重構(gòu);代碼異味;決策樹
隨著計(jì)算機(jī)科學(xué)的進(jìn)步和發(fā)展,越來(lái)越多的行業(yè)和領(lǐng)域中需要使用計(jì)算機(jī)技術(shù),各個(gè)行業(yè)的相關(guān)軟件也相繼被開發(fā)出來(lái)。蘋果商店的應(yīng)用超過(guò)了百萬(wàn),桌面軟件和專業(yè)軟件數(shù)量更多。在軟件開發(fā)中維護(hù)費(fèi)用是開發(fā)成本的2-100倍[1]。因此,為了降低軟件開發(fā)中維護(hù)費(fèi)用,改善軟件的結(jié)構(gòu),提高軟件的可擴(kuò)展性和可重用性,有必要進(jìn)行軟件重構(gòu)[2]。在軟件工程中,軟件重構(gòu)用于調(diào)整面向?qū)ο筌浖膬?nèi)部結(jié)構(gòu),提高軟件的可維護(hù)性、可擴(kuò)展性、可重用性,進(jìn)而改善軟件質(zhì)量,同時(shí)軟件的外部行為保持不變[3-4]。軟件經(jīng)過(guò)重構(gòu),可以提高代碼的可讀性,改善內(nèi)部結(jié)構(gòu)并且延長(zhǎng)代碼的生命周期。對(duì)于大型軟件項(xiàng)目的開發(fā),軟件重構(gòu)具有重要意義。在軟件重構(gòu)中,需要先進(jìn)行代碼異味檢測(cè),代碼異味會(huì)暴露出一些軟件中的問(wèn)題,根據(jù)這些問(wèn)題,工程師會(huì)做進(jìn)一步檢查和重構(gòu)。在重構(gòu)過(guò)程中,代碼異味檢測(cè)是重要步驟。
代碼異味檢測(cè)的相關(guān)研究從1999年開始,至今有將近20年研究歷史。隨著計(jì)算機(jī)學(xué)科的發(fā)展,對(duì)于代碼異味檢測(cè)的研究出現(xiàn)了不同的分支,主要分為以下幾個(gè)類別。
基于手工的代碼異味檢測(cè)方法,這個(gè)方法在代碼異味研究早期使用。Travassos等人創(chuàng)建了一個(gè)“閱讀技術(shù)”的集合,通過(guò)在紙上列舉清單,使用觀察方法幫助人們找到相關(guān)信息,并識(shí)別軟件構(gòu)件中的缺點(diǎn),通過(guò)這種方式來(lái)改善軟件質(zhì)量[5]。但這類方法具有一定缺點(diǎn),對(duì)于大型系統(tǒng)來(lái)說(shuō),手工進(jìn)行代碼異味檢測(cè)的效率低下。
基于度量的代碼異味檢測(cè)方法,通過(guò)使用如代碼行數(shù)、參數(shù)個(gè)數(shù)、代碼字符數(shù)等數(shù)據(jù)作為度量來(lái)檢測(cè)代碼異味。Marinescu等人開發(fā)了一個(gè)Eclipse插件,插件將設(shè)計(jì)問(wèn)題量化,根據(jù)問(wèn)題設(shè)置相應(yīng)的度量值,并用于檢測(cè)4種代碼異味。通過(guò)使用插件能夠持續(xù)評(píng)估系統(tǒng)質(zhì)量,并幫助開發(fā)者進(jìn)行軟件重構(gòu)[6]?;诙攘康姆椒?,準(zhǔn)確性依賴于閾值的選擇,但對(duì)于標(biāo)準(zhǔn)閾值,現(xiàn)在沒(méi)有一致的定論。并且該方法受限于檢測(cè)比較簡(jiǎn)單的代碼異味,對(duì)于較復(fù)雜的代碼異味不能直接用度量檢測(cè)。
基于癥狀的代碼異味檢測(cè)方法,通過(guò)對(duì)代碼異味定義和描述進(jìn)行分析,提取特征和標(biāo)記,利用檢測(cè)算法進(jìn)行檢測(cè),判斷是否具有代碼異味。Moha等人通過(guò)分析獲取代碼異味關(guān)鍵詞列表,然后使用領(lǐng)域特殊語(yǔ)言形成規(guī)則卡片,最后根據(jù)建模生成檢測(cè)算法,對(duì)15個(gè)代碼異味進(jìn)行檢測(cè)[7]?;诎Y狀的方法和代碼異味癥狀有關(guān),但是目前對(duì)于異味癥狀沒(méi)有一致的標(biāo)準(zhǔn)定義,因此該方法受到一定的限制。
基于概率的代碼異味檢測(cè)方法,統(tǒng)計(jì)代碼中類之間的屬性和關(guān)系的數(shù)據(jù),結(jié)合模糊邏輯規(guī)則和數(shù)學(xué)分析來(lái)檢測(cè)代碼異味。Ananda等人提出一種量化方法,結(jié)合直接關(guān)聯(lián)和間接關(guān)聯(lián)的數(shù)量關(guān)系,利用傳播概率矩陣來(lái)檢測(cè)2種重要代碼異味[8]。這類方法使用概率統(tǒng)計(jì)來(lái)分析檢測(cè)代碼異味,對(duì)于不方便量化的代碼異味檢測(cè)效果有限。
基于可視化的代碼異味檢測(cè)方法,結(jié)合自動(dòng)檢測(cè)工具和人的手動(dòng)檢測(cè)來(lái)識(shí)別代碼異味。Emerson等人使用一個(gè)可交互的代碼異味檢測(cè)工具來(lái)快速觀察和認(rèn)識(shí)代碼異味,通過(guò)不同的角度來(lái)理解和可視化代碼異味[9]。由于在方法中結(jié)合人的手動(dòng)檢測(cè),因此該類方法受限于人的效率,可擴(kuò)展性不強(qiáng)。
基于搜索的代碼異味檢測(cè)方法,使用不同的算法直接從源代碼中識(shí)別和檢測(cè)代碼異味,其中大部分檢測(cè)使用機(jī)器學(xué)習(xí)相關(guān)算法。對(duì)于機(jī)器學(xué)習(xí)方法,需要對(duì)輸入進(jìn)行處理,根據(jù)標(biāo)準(zhǔn)輸入來(lái)得到最后的分類輸出結(jié)果。Fontana等人使用機(jī)器學(xué)習(xí)技術(shù)進(jìn)行代碼異味檢測(cè),利用機(jī)器學(xué)習(xí)方法對(duì)代碼異味進(jìn)行分類,自動(dòng)檢測(cè)代碼異味。他們使用了16種機(jī)器學(xué)習(xí)算法,對(duì)4種代碼異味Data Class,Large Class,Feature Envy,Long Method進(jìn)行檢測(cè),并在軟件系統(tǒng)中進(jìn)行實(shí)驗(yàn),并通過(guò)人工確認(rèn)來(lái)構(gòu)造代碼異味樣本,把這些樣本作為機(jī)器學(xué)習(xí)的標(biāo)準(zhǔn)輸入,最后通過(guò)交叉驗(yàn)證對(duì)實(shí)驗(yàn)結(jié)果進(jìn)行評(píng)價(jià)[10]?;谒阉鞯姆椒ǖ乃惴ǔ晒σ蕾囉跀?shù)據(jù)集和訓(xùn)練集的質(zhì)量,在處理未知和變化的代碼異味時(shí)受到一定限制。
基于協(xié)作的代碼異味檢測(cè)方法,以合作的方式執(zhí)行不同的活動(dòng)來(lái)改善方法效果,提高檢測(cè)方法的準(zhǔn)確性和性能。目前相關(guān)文獻(xiàn)較少,Abdelmoez等人使用兩個(gè)并行算法加速搜索過(guò)程,減少搜索空間,使用風(fēng)險(xiǎn)評(píng)估來(lái)檢測(cè)代碼異味[11]。但這個(gè)方法用于檢測(cè)其他代碼異味時(shí),存在一些泛化問(wèn)題。
本文選擇基于搜索的代碼異味檢測(cè)方法,采用機(jī)器學(xué)習(xí)算法來(lái)對(duì)所選擇的幾種代碼異味進(jìn)行識(shí)別。在選擇代碼異味時(shí),主要考慮幾個(gè)方面,代碼異味有較高出現(xiàn)頻率,代碼異味對(duì)于軟件質(zhì)量有較大負(fù)面影響,代碼異味已經(jīng)有相關(guān)研究文獻(xiàn)和應(yīng)用實(shí)現(xiàn)[10]。根據(jù)要求,最后本文選擇了Data Class,Duplicated Code,Inappropriate Intimacy,Long Method四個(gè)代碼異味進(jìn)行檢測(cè)。通過(guò)對(duì)相關(guān)機(jī)器學(xué)習(xí)算法的研究和比較,發(fā)現(xiàn)在代碼異味檢測(cè)中,決策樹算法具有較好的分類效果[10]。在本文中,使用J48決策樹算法作為檢測(cè)算法,對(duì)所選擇的四個(gè)代碼異味進(jìn)行識(shí)別。
本文使用k重交叉驗(yàn)證來(lái)對(duì)實(shí)驗(yàn)結(jié)果進(jìn)行驗(yàn)證,通過(guò)算法的精確率,召回率以及定義的到目標(biāo)精確率平均距離來(lái)比較算法效果[12],公式如下:
其中,P表示精確率,R表示召回率,TP表示正確正類,F(xiàn)P表示錯(cuò)誤正類,F(xiàn)N表示錯(cuò)誤負(fù)類,D表示到目標(biāo)精確率平均距離,TAPi表示某個(gè)實(shí)驗(yàn)中精確率,TAP表示目標(biāo)精確率。
通過(guò)比較實(shí)驗(yàn),可以知道,本文使用的異味檢測(cè)方法,在選擇的四種代碼異味上具有較好的識(shí)別效果。
現(xiàn)有的代碼異味檢測(cè)方法劃分為幾個(gè)類別,在對(duì)基于搜索的代碼異味檢測(cè)方法進(jìn)行研究后,本文選擇決策樹算法來(lái)對(duì)代碼異味進(jìn)行檢測(cè),并在選擇的四種代碼異味上取得了不錯(cuò)的識(shí)別效果。
[1]Palomba F,Bavota G,Di Penta M,et al.Detecting Bad Smells in Source Code Using Change History Information[C].Automated Software Engineering(ASE),2013 IEEE/ACM 28th international conference on.IEEE,2013:268-278.
[2]Rasool G,Arshad Z.A Review of Code Smell Mining Techniques[J].Journal of Software:Evolution and Process,2015,27(11):867-895.
[3]Mens T,Tourwé T.A Survey of Software Refactoring[J].IEEE Transactions on Software Engineering,2004,30(2):126-139.
[4]Opdyke W F.Refactoring Object-Oriented Frameworks[D].University of Illinois at Urbana-Champaign,1992.
[5]Travassos G,Shull F,Fredericks M,et al.Detecting Defects in Object-Oriented Designs:Using Reading Techniques to Increase Software Quality[C].ACM Sigplan Notices.ACM,1999,34(10):47-56.
[6]Marinescu R,Ganea G,Verebi I.inCode:Continuous Quality Assessment and Improvement[C].Software Maintenance and Reengineering(CSMR),2010 14th European Conference on.IEEE,2010:274-275.
[7]Moha N,Gueheneuc Y G,Duchien L,et al.DECOR:A Method for the Specification and Detection of Code and Design Smells[J].IEEE Transactions on Software Engineering,2010,36(1):20-36.
[8]Rao A A,Reddy K N.Detecting Bad Smells in Object Oriented Design Using Design Change Propagation Probability Matrix[J].Lecture Notes in Engineering&Computer Science,2008,2168(1).
[9]Murphy-Hill E,Black A P.An Interactive Ambient Visualization for Code Smells[C].Proceedings of the 5th International Symposium on Software Visualization.ACM,2010:5-14.
[10]Fontana F A,Mantyla M V,Zanoni M,et al.Comparing and Experimenting Machine Learning Techniques for Code Smell Detection [J].Empirical Software Engineering,2016,21(3):1143-1191.
[11]Abdelmoez W,Kosba E,Iesa A F.Risk-Based Code Smells Detection Tool[C].The International Conference on Computing Technology and Information Management(ICCTIM).Society of Digital Information and Wireless Communication,2014:148.
[12]Liu H,Liu Q,Niu Z,et al.Dynamic and Automatic Feedback-Based Threshold Adaptation for Code Smell Detection[J].IEEE Transactions on Software Engineering,2016,42(6):1-1.
Research on Code Smell Detection Method in Software Engineering
LI Yan-wu
(College of Computer Science,Sichuan University,Chengdu 610065)
In software engineering,software refactoring is very important,it can improve the quality of software in maintainability,extensibility and reusability.Code smell detection is one of the important components in software refactoring.At present,the research of code smell detection is divided into several categories.After studying of search-based code smell detection,the decision tree algorithm is selected to detecting the four code smells and it gets a good results.
Software Engineering;Software Refactoring;Code Smell;Decision Tree
1007-1423(2017)05-0031-03
10.3969/j.issn.1007-1423.2017.05.008
李炎武(1992-),男,四川宜賓人,碩士研究生,研究方向?yàn)閿?shù)字娛樂(lè)與人機(jī)交互
2016-12-01
2017-02-10