郭迪 吳海濤
摘? 要: 基于以開發(fā)人員驅動的代碼異味優(yōu)先級排序方法,結合優(yōu)化決策樹算法建立模型,對代碼異味的重構優(yōu)先級進行面向開發(fā)人員的排名,并在實證研究中評估了該模型,以模型可解釋性方法對特征的重要性進行評估,給出了相關影響較高的特征.結果表明,該模型的F1值為89%,分別較基線值和最新研究成果高出25%和5%.
關鍵詞: 代碼異味; 決策樹; 特征選擇; 軟件可維護性
中圖分類號: TP 311??? 文獻標志碼: A??? 文章編號: 1000-5137(2022)02-0210-07
GUO Di, WU Haitao
(College of Information, Mechanical and Electrical Engineering, Shanghai Normal University, Shanghai 201418, China)
Based on the prioritization method of developer-driven code smell, combining with the optimization decision tree algorithm, a model was built to rank the refactoring priority of code smell for developers, which was evaluated in the empirical study. The importance of features was evaluated by the interpretive methods and features with high correlation impact were provided. The experimental results showed that the F1 value of the model was 89%, which was 25% and 5% better than the benchmark value and the latest research result, respectively.
code smell; decision tree; feature selection; software maintainability
0? 引言
隨著軟件系統(tǒng)的演進,開發(fā)人員需要持續(xù)地修改代碼以適應新的需求和變化的業(yè)務場景.因此,在開發(fā)過程中會引入技術債務,即因軟件代碼問題導致軟件質量的下降,而代碼異味是一種典型的、可量化的技術債務.代碼異味與程序可理解性、可維護性、可測試性的降低以及維護工作量和額外成本的增加有關聯(lián),對代碼異味的人工分析也耗時且費力.因此,研究人員提出使用自動化機制,幫助開發(fā)人員識別和消除代碼異味,從而提升代碼質量.
FONTANA等提出了從軟件指標中衍生的代碼異味嚴重性度量方法,根據(jù)度量值對代碼異味的優(yōu)先級進行識別,但該方法過于依賴于主觀經(jīng)驗,導致工具之間的一致性較低且不符合開發(fā)人員的偏好,對于代碼異味檢測的實踐貢獻仍然有限.MARINESCU提出了開發(fā)人員驅動的代碼異味優(yōu)先級方法,根據(jù)開發(fā)人員提到的重要因素提取特征,用于對代碼異味進行優(yōu)先級排序,與文獻[7]相比,排序性能得到了提升,但該方法僅使用了最通用的特征選擇方法和機器學習模型實現(xiàn)排序功能,且沒有闡明選擇這些方法的具體理由,其模型的性能仍有待提升.本文作者基于上述文獻的數(shù)據(jù)集,提出了一種改進的模型,通過閾值篩選出合適的特征,避免了特征篩選中的局部最優(yōu)問題;另外,通過引入決策樹模型,提升預測優(yōu)先級的準確率,并采用信息增益方法計算特征的重要性,分析每個特征對每種代碼異味優(yōu)先級預測的貢獻.
1? 構建方法與建立模型
決策樹()原理
LightGBM是一個梯度boosting框架,使用基于學習算法的決策樹,解決了對每一個特征都要掃描所有的樣本點來選擇最好切分點的問題,是分布式且高效的.LightGBM主要具有以下特點:1) 能減少分割增益的計算量,通過將直方圖相減計算,進一步減少所占內(nèi)存的空間以及并行學習的通信代價;2) 制定決策樹生長策略,最優(yōu)分割類別的特征值;3) 優(yōu)化并行學習的LightGBM算法的兩個主要步驟:
① 基于梯度的單邊采樣 (GOSS),僅對樣本進行采樣來計算梯度,其偽代碼如圖1所示.
② 互斥特征捆綁(EFB),將某些特征捆綁,降低特征的維度,尋找最佳切分點,減少成本的消耗,其主要偽代碼如圖2所示.
模型建立
模型流程如圖3所示.數(shù)據(jù)處理包括:1) 數(shù)據(jù)預處理,對選取的軟件指標進行人工數(shù)據(jù)篩選,剔除空白指標數(shù)據(jù),刪除冗余數(shù)據(jù),將數(shù)據(jù)歸一化;2) 特征選擇,本研究采用spearman對軟件指標間的相關系數(shù)()進行相關性分析,spearman對原始變量的分布不作要求,屬于非參數(shù)統(tǒng)計方法,所選取的特征更符合數(shù)據(jù)集本身的要求.
通過對比各種分類器,選擇優(yōu)化后的LightGBM作為最佳分類器模型.為了訓練模型,采用了10折交叉驗證策略,將數(shù)據(jù)集隨機劃分為大小相等的10份,對數(shù)據(jù)集分層抽樣,每一折具有相同比例的臨界等級.將2份數(shù)據(jù)用作測試集,其余用于訓練模型.該過程重復10次,每次將數(shù)據(jù)集重新劃分成訓練集和測試集.
通過計算精度、召回率和F-measure評估實驗模型的性能.使用信息增益算法和Scott-Knot結果大小差異(SK-ESD)測試計算和評估軟件指標帶來的熵變化,其中Scott-Knott檢驗是一種統(tǒng)計度量,用于比較和區(qū)分模型性能,使用層次聚類方法對評估指標進行分組,以便分析評估指標對開發(fā)人員感知代碼異味嚴重性評估的準確性.
2? 仿真實驗
代碼異味
選取4種代碼異味進行研究:
1) 上帝類(God Class).上帝類會影響不遵循單一職責原則的類,造成代碼內(nèi)聚性變差且難以維護,上帝類通常會造成軟件缺陷,提高維護成本.
2) 復雜類(Complex Class).高度復雜的類會提高開發(fā)人員理解并優(yōu)化代碼的難度,開發(fā)人員通常需要識別這種異味,并評估其重要性.
3) 意大利面條代碼(Spaghetti Code).意大利面條代碼通常表現(xiàn)為混亂的代碼控制結構,且沒有正確使用面向對象編程原則的編程風格,會影響開發(fā)人員對源代碼的理解.
4) 霰彈式修改(Shotgun Surgery).當開發(fā)人員對一個類進行修改時,必須同時在大量不同的類中做相應修改,導致相關類出現(xiàn)缺陷的概率大幅提高.
PECORELLI等證明了這4種異味在真實的系統(tǒng)中廣泛分布;GRANO等證實了這4種異味對軟件系統(tǒng)的可維護性、可理解性和可測試性會產(chǎn)生負面影響;PALOMBA等提出開發(fā)人員不僅能準確分析這4種代碼異味,而且能感知它們的嚴重性.
軟件指標
參考文獻[19]選取一組涵蓋不同角度下的類結構和可維護性特征的指標,如表1所示.
數(shù)據(jù)集
代碼異味是隨著時間變化的一組特征,所以項目需滿足數(shù)據(jù)集完整性、連貫性的要求,選取Apache社區(qū)的7個開源項目進行實驗(表2).考慮類數(shù)超過500,更改歷史至少5年,至少提交1 000次,并且貢獻者數(shù)量高于20人的項目,篩選出341個上帝類、349個復雜類、313 個意大利面條代碼和329個霰彈式修改,共1 332條數(shù)據(jù).
實驗結果分析
通過對數(shù)據(jù)集的訓練和測試,得到的實驗結果對比如表3所示.結果表明,所建立模型的F1值為77%~90%,高于對比文獻[19]中的模型,其中對God Class,Complex Class及Shotgun Surgery的分類結果,F(xiàn)1值分別高出4%,6%及5%.
通過特征可解釋性工具,計算出每個特征的重要性,實驗結果如表4所示.通過信息增益算法,計算出每個特征對模型結果提供的增益值,利用Scott-Knott結果大小差異校驗進行評估打分,并對打分進行排序.本研究給出信息增益值大于0.5的結果.
影響代碼異味God Class的因素是由多種指標混合而成,不能僅僅通過某種單一指標進行描述.模型主要依賴EXP,LOC,OWN及ADS,同時LCOM5,C3以及NFI對其也有影響.
對于Complex Class,模型最為依賴的指標為EXP,OWN和NCH,此外其他指標對分類模型也有一定影響,如RA,表明在優(yōu)先考慮Complex Class時,開發(fā)人員認為可讀性很重要.其他影響因素包括WMC和LCOM5,證實了代碼異味的檢測涉及代碼結構方面的因素.
在分析Spaghetti Code時,發(fā)現(xiàn)沒有代碼結構因素對分類產(chǎn)生主要影響.RA是開發(fā)人員優(yōu)先考慮Spaghetti Code的首要因素,因此,開發(fā)人員在遇到遭受這種異味的實例時,優(yōu)先考慮語義上是否連貫.OWN和 LOC為次要因素,NCH和LCOM5的影響可以忽略不計.
Shotgun Surgery,NCH和ACS被證明是重要的指標.此外,PERS也被證明會影響分類的情況,證實了開發(fā)人員會根據(jù)單次代碼提交共同修改涉及類的數(shù)量,即Shotgun Surgery的強度, 評估Shotgun Surgery的嚴重程度.此外,C3和LCOM5也會有一定程度的影響,但與其他類型指標的貢獻相比,影響程度較低.
3? 結 論
基于面向開發(fā)人員的代碼異味優(yōu)先級排序方法,利用特征選擇方法選擇自變量,應用LightGBM機器學習算法,對描述代碼異味的關鍵性特征進行分類,用于預測開發(fā)人員對1 332個代碼異味實例標注的嚴重程度.通過實驗表明,對于4種代碼異味的分類,所設計模型的F1值為77%~90%,與基線模型相比,平均高出25%.本研究后續(xù)的工作包括:1) 增加數(shù)據(jù)集數(shù)量,優(yōu)化數(shù)據(jù)集處理方法;2) 替換其他模型,論述模型的對比與優(yōu)化情況;3) 更換其他開發(fā)語言應用,驗證本研究結論.
參考文獻:
[1]? BROWN N, CAI Y F, GUO Y P, et al. Managing technical debt in software?reliant systems [C]// Proceedings of the FSE/SDP Workshop on Future of Software Engineering Research. Santa Fe: ACM,2010:47-52.
[2]? SHULL F, FALESSI D, SEAMAN C, et al. Technical Debt: Showing the Way for Better Transfer of Empirical Results [M]// Perspectives on the Future of Software Engineering. Berlin: Springer,2013.
[3]? ABBES M, KHOMH F, GUEHENEUC Y G, et al. An empirical study of the impact of two antipatterns, blob and spaghetti code, on program comprehension [C]// 15th European Conference on Software Maintenance and Reengineering. Oldenburg: IEEE,2011:181-190.
[4]? PALOMBA F, BAVOTA G, PENTA M D, et al. On the diffuseness and the impact on maintainability of code smells: a large scale empirical investigation [C]// 2018 IEEE/ACM 40th International Conference on Software Engineering (ICSE). Gothenburg: IEEE,2017:1-34.
[5]? GRANO G, PALOMBA F, GALL H C. Lightweight assessment of test?case effectiveness using source?code?quality indicators [J]. IEEE Transactions on Software Engineering,2019,47(4):758-774.
[6]? SJ?BERG D I K, YAMASHITA A, ANDA B C D, et al. Quantifying the effect of code smells on maintenance effort [J]. IEEE Transactions on Software Engineering,2012,39(8):1144-1156.
[7]? FONTANA F A, ZANONI M. Code smell severity classification using machine learning techniques [J]. Knowledge?Based Systems,2017,128:43-58.
[8]? MARINESCU R. Assessing technical debt by identifying design flaws in software systems [J]. IBM Journal of Research and Development,2012,56(5):1-13.
[9]? AL?ANI A, DERICHE M. Feature selection using a mutual information based measure [C]// Proceeding of the 16th IEEE International Conference on Pattern Recognition. Quebec: IEEE,2002:82-85.
[10] KE G L, MENG Q, FINLEY T, et al. Lightgbm: a highly efficient gradient boosting decision tree [C]// Proceedings of the 31st International Conference on Neural Information Processing Systems. Long Beach: ACM,2017:3149-3157.
[11] BAEZA?YATES R, RIBEIRO?NETO B, MILLS D, et al. Modern Information Retrieval [M]. New York: ACM,1999.
[12] SCOTT A J, KNOTT M. A cluster analysis method for grouping means in the analysis of variance [J]. Biometrics,1974,30(3):507-512.
[13] BUDD T A. An Introduction to Object?Oriented Programming [M]. Boston: Addison?Wesley Publishing,2001.
[14] FOWLER M, BECK K. Refactoring: Improving the Design of Existing Code [M]. Boston: Addison?Wesley Publishing, 1999.
[15] KHOMH F, PENTA M D, GUE?HE?NEUC Y, et al. An exploratory study of the impact of antipatterns on class change-and fault?proneness [J]. Empirical Software Engineering,2012,17(3):243-275.
[16] SOH Z, YAMASHITA A, KHOMH F, et al. Do code smells impact the effort of different maintenance programming activities?[C]// IEEE 23rd International Conference on Software Analysis, Evolution, and Reengineering. Osaka: IEEE,2016:393-402.
[17] BROWN W H, MALVEAU R C, MCCORMICK H W, et al. Antipatterns: Refactoring Software, Architectures, and Projects in Crisis [M]. New York: John Wiley & Sons,1998.
[18] PALOMBA F, BAVOTA G, PENTA M D, et al. Do they really smell bad? A study on developers’ perception of bad code smells [C]// Software Maintenance and Evolution. Victoria: IEEE,2014:101-110.
[19] PECORELLI F, KHOMH F, LUCIA A D. Developer?driven code smell prioritization [C]// Proceedings of the 17th International Conference on Mining Software Repositories. New York: ACM,2020.
[20] HUANG Z J, CHEN J H, GAO J H. Quantifying anemia and bloodshot of layers in Web applications from the perspective of code smell [J]. Acta Electronica Sinica,2020,48(4):772-780.
[21] TUFANO M, PALOMBA F, BAVOTA G, et al. When and why your code starts to smell bad (and whether the smells go away) [J]. IEEE Transactions on Software Engineering,2017,43(11):1063-1088.
[22] TAIBI D, JANES A, LENARDUZZI V. How developers perceive smells in source code: a replicated study [J]. Information and Software Technology,2017,92:223-235.
(責任編輯:包震宇,馮珍珍)