吳海濤,蔡詠琦,高建華
上海師范大學(xué) 信息與機(jī)電工程學(xué)院,上海 200234
代碼異味[1]是代碼的不良設(shè)計(jì)和實(shí)現(xiàn)的癥狀,會阻礙開發(fā)人員理解代碼并增加代碼的更改次數(shù)以及維護(hù)成本[2]。Fowler[1]對22 種代碼異味進(jìn)行了定義,這些代碼異味可能源自不良設(shè)計(jì)模式[3],但更多來自開發(fā)人員的編碼過程。由于代碼異味的存在,重構(gòu)操作變得至關(guān)重要。通過重構(gòu),開發(fā)人員可以在不改變系統(tǒng)功能的情況下提升軟件內(nèi)部結(jié)構(gòu)質(zhì)量、提高軟件可讀性和可理解性、定位軟件缺陷并促進(jìn)軟件開發(fā)過程。
過去的研究[4-7]已經(jīng)提出多種代碼異味檢測技術(shù),其中大部分是基于規(guī)則或啟發(fā)式的方法。這些方法使用一組基于代碼度量標(biāo)準(zhǔn)或閾值的預(yù)定義規(guī)則,但通常存在閾值校準(zhǔn)問題,導(dǎo)致發(fā)生誤報(bào)或遺漏[8]。機(jī)器學(xué)習(xí)作為發(fā)展中的技術(shù),是解決上述問題的一種方法。機(jī)器學(xué)習(xí)能夠自動組合代碼度量,并且無需指定任何閾值。盡管大部分機(jī)器學(xué)習(xí)算法在代碼異味檢測方面取得了較高的性能[9],但單一算法仍然存在適應(yīng)性限制。
在模型選擇方面,沒有一種單一模型能夠在所有異味上表現(xiàn)良好[10],因?yàn)榇a異味的識別是具有主觀性的[11],不同的異味類型可能存在不同的最佳模型。因此,集成學(xué)習(xí)被應(yīng)用于代碼異味檢測。然而,以往的研究更多關(guān)注同構(gòu)集成,忽視了異構(gòu)集成。因此,Alazba等人[12]使用Stacking方法,將14個(gè)異質(zhì)基分類器組合成更為強(qiáng)大的Stacking集成模型,展現(xiàn)出更為出色的檢測性能。
在模型輸出方面,由于開發(fā)人員的經(jīng)驗(yàn)和認(rèn)知存在差異,對代碼異味的判斷也會有所不同。因此,代碼異味的檢測是非常主觀的。然而,過去的研究[4-12]只為開發(fā)人員提供布爾決策,沒有參考開發(fā)人員的主觀認(rèn)知并提供代碼異味存在的概率。Boutaib 等人[11]引入了可能性分布的概念,旨在模擬開發(fā)人員的主觀認(rèn)知,提高代碼異味識別的準(zhǔn)確率。
在異味重構(gòu)方面,現(xiàn)有的大多數(shù)異味檢測方法僅識別出異味實(shí)例,缺乏后續(xù)的重構(gòu)操作。Boutaib等人[11]提出將可能性分布應(yīng)用于代碼重構(gòu)的想法,為開發(fā)人員提供重構(gòu)優(yōu)先級劃分。然而,他們并未對這一想法進(jìn)行相應(yīng)的研究來驗(yàn)證其有效性。
為了探究上述問題,本文在Alazba 等人與Boutaib等人研究的基礎(chǔ)上,提出一種Bagging 異構(gòu)集成模型(bagging heterogeneous ensemble model,BHE)。該模型集成多個(gè)基分類器,綜合考慮不同分類器的預(yù)測能力,通過F1 集成策略結(jié)合多個(gè)基分類器的預(yù)測結(jié)果,得到類、方法存在代碼異味的概率。隨后在重構(gòu)中引入可能性分布,將異味概率通過可能性變換公式[13]轉(zhuǎn)化為可能性分布后,作為重構(gòu)優(yōu)先級的指導(dǎo)意見提供給開發(fā)人員。
本文的主要貢獻(xiàn)如下:
(1)采用F1加權(quán)集成策略的Bagging異構(gòu)集成模型相較于6個(gè)基分類器,在代碼異味檢測的性能上有顯著提升。
(2)通過Bagging異構(gòu)集成模型,證實(shí)了最佳分類器因代碼異味類型的不同而存在差異。
(3)將Bagging 異構(gòu)集成模型輸出的異味概率通過可能性分布公式進(jìn)行轉(zhuǎn)化后,得到的重構(gòu)優(yōu)先級與6名受訪者的排序具有高度一致性,能夠?yàn)殚_發(fā)人員提供可靠的重構(gòu)順序,節(jié)省開發(fā)人員的工作量。
代碼異味是不良的設(shè)計(jì)和代碼實(shí)現(xiàn)的癥狀,會對軟件維護(hù)帶來一定影響,通常利用代碼重構(gòu)解決。本文主要研究3 種代碼異味,其描述與影響如表1。代碼異味的選擇具有一定標(biāo)準(zhǔn),田迎晨等人[14]和Azeem等人[10]指出工業(yè)界更關(guān)注質(zhì)量、成本和效率之間的平衡,同時(shí)表1中的代碼異味被工業(yè)界關(guān)注且廣泛認(rèn)可。通過研究工業(yè)界所關(guān)注的對象,為開發(fā)人員提供重構(gòu)優(yōu)先級建議,更貼近開發(fā)生產(chǎn)中的實(shí)際需要。
表1 代碼異味描述Table 1 Description of code smell
源代碼的結(jié)構(gòu)數(shù)據(jù)可以用McCabe 圈復(fù)雜度[15]或Chidamber等人[16]研究中的結(jié)構(gòu)度量進(jìn)行統(tǒng)計(jì)。代碼的結(jié)構(gòu)度量在許多研究中都被證實(shí)適合通過機(jī)器學(xué)習(xí)進(jìn)行研究[17-18]。Das等人[19]發(fā)現(xiàn),基于代碼度量的模型在識別代碼異味時(shí),其準(zhǔn)確率可以達(dá)到90%。實(shí)驗(yàn)中,選擇了以Chidamber等人[16]研究為基礎(chǔ)開發(fā)的代碼度量挖掘工具CK[20],并以其提供的代碼度量指標(biāo)作為數(shù)據(jù)。該CK工具在Chidamber等人的基礎(chǔ)上進(jìn)行了擴(kuò)展,其中類級代碼度量47個(gè),方法級代碼度量28個(gè),如表2所示。
表2 代碼度量及其相關(guān)信息Table 2 Code metrics and related information
代碼重構(gòu)是在不改變軟件系統(tǒng)外部行為的前提下,改善代碼內(nèi)部結(jié)構(gòu),即通過調(diào)整程序代碼改善軟件的質(zhì)量、性能,使程序的設(shè)計(jì)模式和架構(gòu)更合理,提高軟件的擴(kuò)展性和維護(hù)性。
Tufano等人[2]指出超過50%的代碼異味在項(xiàng)目開發(fā)的1 000天后仍然“活躍”,并認(rèn)為如何開始重構(gòu),即如何確定重構(gòu)順序,嚴(yán)重困擾著開發(fā)人員。因此,即使機(jī)器學(xué)習(xí)能夠識別出大量的代碼異味實(shí)例,但對于開發(fā)人員來說,確定重構(gòu)優(yōu)先級才能真正幫助開發(fā)人員進(jìn)行代碼質(zhì)量維護(hù)。
可能性分布是一種主觀的不確定性,與概率分布的隨機(jī)性不同,后者反映事件發(fā)生的規(guī)律,具有客觀性,而前者代表模糊性,即開發(fā)人員由于不明確哪個(gè)實(shí)例需要優(yōu)先重構(gòu),從而產(chǎn)生主觀上的不確定性,這種主觀不確定性能夠用可能性分布進(jìn)行表示。概率分布能夠和可能性分布進(jìn)行轉(zhuǎn)化,變換公式如式(1)??赡苄苑植嫉挠行栽贐outaib 等人[21]的工作中已得到證實(shí),在檢測代碼異味中取得良好的效果。
其中,π表示可能性分布,ω表示狀態(tài)空間,在本文中即Smelly、Non-Smelly 兩種狀態(tài)空間,p表示概率分布。π(ωk)=1 表示ωk的實(shí)現(xiàn)是完全可能的,而π(ωk)=0 表示ωk是拒絕狀態(tài)。將p轉(zhuǎn)換為π之前應(yīng)將p按降序排序,即p(ω1)≥p(ω2)≥…≥p(ωn),其中p的總和為1??赡苄苑植贾稻哂幸韵滦问街唬篬X,Y]或[Y,X],其中X在[0,1]之間,Y等于1。
在可能性分布中,X定義了不可能性,即對于某個(gè)存在代碼異味的類、方法,X表示Non-Smelly的可能性分布,X越小,該類、方法越傾向于不是Non-Smelly,因此該實(shí)例的重構(gòu)優(yōu)先級越高。由于可能性分布的存在,且可能性分布的和≥1,開發(fā)人員可在已知實(shí)例存在或不存在代碼異味的情況下,通過可能性分布大小判斷該實(shí)例是否急迫需要進(jìn)行重構(gòu)。
本文提出的Bagging 異構(gòu)集成模型構(gòu)建過程如圖1 所示,主要分為3 個(gè)步驟:(1)尋找合適的基分類器;(2)通過網(wǎng)格搜索尋找基分類器的最優(yōu)超參數(shù);(3)根據(jù)F1值對基分類器分配在預(yù)測中所持有的權(quán)重。
圖1 Bagging異構(gòu)集成模型構(gòu)建流程Fig.1 Building flowchart of Bagging heterogeneous ensemble mode
Bagging算法[22]是并行式集成學(xué)習(xí)中的最具代表性的算法之一,其通常對訓(xùn)練樣本采用Bootstrap 抽樣策略,并行地訓(xùn)練多個(gè)獨(dú)立的基分類器,通過結(jié)合多個(gè)分類器降低泛化誤差。然而在Bagging 算法中,大多都采用同構(gòu)分類器訓(xùn)練,因此在基分類器的構(gòu)成上存在一定的改進(jìn)空間。
本文使用6種有監(jiān)督機(jī)器學(xué)習(xí)分類器作為Bagging異構(gòu)集成模型的基分類器,即RandomForest(RF)、SVM、DecisionTree(DT)、Adaboost(AST)、LogisticRegression(LR)、KNN。選擇過程遵循2個(gè)標(biāo)準(zhǔn):
(1)選擇的分類器應(yīng)是公認(rèn)的分類技術(shù),例如SVM、DT。
(2)分類器應(yīng)涵蓋不同的分類簇,例如基于規(guī)則、基于回歸和基于投票的。
對于每一種代碼異味數(shù)據(jù)集,將總數(shù)據(jù)集分為80%的訓(xùn)練集和20%的測試集。在訓(xùn)練集上,分別在6種模型上進(jìn)行訓(xùn)練。這6種模型之間具有一定差異,能通過使用不同學(xué)習(xí)策略,從不同角度和空間學(xué)習(xí)特征,實(shí)現(xiàn)模型間的互補(bǔ),從而提升Bagging 模型的整體性能。在測試集上,通過F1來評估各模型的性能。
為了能夠最大程度地觀察各個(gè)基分類器在不同代碼異味檢測上的性能,并提高Bagging 異構(gòu)集成模型的檢測能力,同時(shí)為重構(gòu)優(yōu)先級劃分提供可靠基礎(chǔ),本文在訓(xùn)練過程中對所有6種基分類器進(jìn)行網(wǎng)格搜索,以得到最優(yōu)參數(shù)從而提高自身的預(yù)測能力,各個(gè)基分類器所選超參數(shù)如表3。
表3 分類器超參數(shù)Table 3 Hyper parameters of classifiers
選擇表3中的超參數(shù)主要有2個(gè)原因:
(1)所有超參數(shù)對于各自的分類器具有較高的重要性。
(2)適當(dāng)控制超參數(shù)數(shù)量,減少網(wǎng)格搜索的交叉驗(yàn)證時(shí)間。
在訓(xùn)練過程中采用10折交叉驗(yàn)證對基分類器進(jìn)行網(wǎng)格搜索,以得到模型的最優(yōu)參數(shù)。該策略允許所有觀察樣本用于訓(xùn)練和測試,且已在機(jī)器學(xué)習(xí)相關(guān)領(lǐng)域中被廣泛使用[23]。該策略將數(shù)據(jù)隨機(jī)劃分成10份,其中9份作為訓(xùn)練集,剩余1 份作為測試集,交叉驗(yàn)證后重復(fù)10次,允許10 個(gè)子集中的每一個(gè)恰好成為一次測試集[24]。由于實(shí)驗(yàn)中的代碼異味數(shù)據(jù)集處于不平衡狀態(tài),因此在實(shí)驗(yàn)中的每一折都應(yīng)用分層抽樣,以保證代碼異味的分布與原始訓(xùn)練集相同[7]。
Bagging 算法將基分類器訓(xùn)練完成后,通常將它們的結(jié)果以簡單投票或模型平均的方法進(jìn)行結(jié)合。然而在集成階段僅僅以簡單的多數(shù)投票或整體平均進(jìn)行綜合并不合理,沒有考慮不同代碼異味具有不同的最適分類器,因此在集成策略上仍然存在改進(jìn)空間。
本文提出的Bagging異構(gòu)集成模型需要將6個(gè)異構(gòu)基分類器的預(yù)測結(jié)果進(jìn)行加權(quán)融合,因此在獲得基分類器的最優(yōu)超參數(shù)并完成訓(xùn)練后,對基分類器在測試集上的F1 進(jìn)行降序排序并賦予相應(yīng)的權(quán)重,權(quán)重之和為1,如公式(2):
每個(gè)基分類器乘上各自的權(quán)重后相加,即得到Bagging異構(gòu)集成模型,模型架構(gòu)如圖2,其輸出為某個(gè)類、方法存在代碼異味的概率。
圖2 Bagging異構(gòu)集成模型架構(gòu)Fig.2 Architecture of Bagging heterogeneous ensemble model
通過設(shè)定概率的閾值,能夠輸出某個(gè)類、方法存在代碼異味的標(biāo)簽。實(shí)驗(yàn)中選擇0.5 作為概率閾值,異味標(biāo)簽的判斷方法如公式(3):
一方面,選擇加權(quán)是因?yàn)閷?shí)驗(yàn)中不同分類器的性能存在差異,通過加權(quán)能夠強(qiáng)化對應(yīng)于代碼異味的最適分類器對結(jié)果的影響,其性能由基分類器在測試集上的F1來表示。另一方面,選擇F1作為賦予權(quán)重的依據(jù),是由于F1 是Precision 和Recall 的加權(quán)調(diào)和平均,能夠有效地對極端值進(jìn)行懲罰,不偏向Precision和Recall的任何一方,使得模型在任何情況下對數(shù)據(jù)不平衡率都不敏感。
實(shí)驗(yàn)研究包含6個(gè)軟件系統(tǒng)的32個(gè)版本,分析的系統(tǒng)包括:
(1)Apache 基金會的5 個(gè)系統(tǒng):Xerces、Hadoop、Hbase、Hive、Manifoldcf。
(2)Eclipse基金會的1個(gè)系統(tǒng):Eclipse。
表4報(bào)告了實(shí)驗(yàn)中研究的系統(tǒng)特征,即系統(tǒng)、版本、系統(tǒng)版本數(shù)、類的數(shù)量、方法的數(shù)量。實(shí)驗(yàn)將通過6個(gè)在軟件開發(fā)領(lǐng)域應(yīng)用廣泛且一直較為活躍的開源系統(tǒng)來驗(yàn)證。
表4 軟件系統(tǒng)描述Table 4 Description of software system
選擇這6個(gè)系統(tǒng)的原因是:
(1)本次實(shí)驗(yàn)挖掘的代碼異味及統(tǒng)計(jì)代碼度量的靜態(tài)工具只適用于由Java語言編寫的系統(tǒng),所選系統(tǒng)都基于Java程序語言開發(fā)的。
(2)上述6 個(gè)系統(tǒng)中有一定的代碼異味實(shí)例數(shù),具備進(jìn)行研究的條件。
Bagging 異構(gòu)集成模型的實(shí)驗(yàn)流程如圖3 所示,主要分為4個(gè)步驟,分別是獲取數(shù)據(jù)集、Bagging異構(gòu)集成模型的構(gòu)建、模型檢測性能評估以及可能性分布下的重構(gòu)優(yōu)先級一致性檢驗(yàn)。
3.2.1 數(shù)據(jù)集的獲取及數(shù)據(jù)預(yù)處理
實(shí)驗(yàn)采用由Palomba等人[25]人工識別的代碼異味實(shí)例數(shù)據(jù)集,文獻(xiàn)[25]的數(shù)據(jù)集只有代碼異味標(biāo)簽,因此實(shí)驗(yàn)中采用CK工具獲取6個(gè)軟件系統(tǒng)的32個(gè)版本的代碼度量數(shù)據(jù),再與文獻(xiàn)[25]中的異味實(shí)例一一對應(yīng)并進(jìn)行歸一化后形成實(shí)驗(yàn)所需的數(shù)據(jù)集。其中,類級代碼異味Complex Class、Spaghetti Code 數(shù)據(jù)集由1 個(gè)標(biāo)簽、47個(gè)特征組成,方法級代碼異味Long Method數(shù)據(jù)集由1個(gè)標(biāo)簽、28個(gè)特征組成,數(shù)據(jù)集格式如圖4。
實(shí)驗(yàn)中每種代碼異味實(shí)例較少,僅1%左右,如表5所示。但根據(jù)先前的研究表明[7,26],將不平衡算法應(yīng)用于代碼異味檢測相關(guān)的數(shù)據(jù)會損害模型的性能。因此實(shí)驗(yàn)中不應(yīng)用任何不平衡算法對少數(shù)類進(jìn)行平衡。
3.2.2 Bagging異構(gòu)集成模型
在確定了實(shí)驗(yàn)包含的軟件系統(tǒng)、3 種代碼異味以及相關(guān)的數(shù)據(jù)集后,首先選擇6種有監(jiān)督機(jī)器學(xué)習(xí)分類器RF、SVM、DT、AST、LR 與KNN 作為Bagging 異構(gòu)集成模型的基分類器。
隨后對3種代碼異味數(shù)據(jù)集依次進(jìn)行訓(xùn)練,通過網(wǎng)格搜索得到6 種基分類器的最佳超參數(shù)。為了減輕因?qū)嶒?yàn)數(shù)據(jù)集不平衡給實(shí)驗(yàn)結(jié)果帶來的影響,實(shí)驗(yàn)在基分類器訓(xùn)練過程中進(jìn)行分層抽樣訓(xùn)練,以保證代碼異味的分布與原始數(shù)據(jù)集相同,并采用10折交叉驗(yàn)證策略[23]。
最后將6種基分類器通過F1集成策略賦予權(quán)重后,組合為Bagging異構(gòu)集成模型,并給出類、方法存在代碼異味的概率,為重構(gòu)優(yōu)先級提供依據(jù)。
3.2.3 模型檢測性能評估
本次實(shí)驗(yàn)通過計(jì)算經(jīng)典的性能指標(biāo),即通過Precision、Recall、F1 和AUC[27]以及四分位數(shù)來驗(yàn)證6 種基分類器在檢測3種代碼異味上的穩(wěn)定性,并評估實(shí)驗(yàn)中構(gòu)建的Bagging異構(gòu)集成模型的分類性能。
3.2.4 重構(gòu)優(yōu)先級與一致性檢驗(yàn)
本文提出的Bagging異構(gòu)集成模型在輸出異味概率后,仍然可能擁有額外的價(jià)值。通過可能性變換公式,將異味概率轉(zhuǎn)化為可能性后,能夠作為重構(gòu)優(yōu)先級提供給開發(fā)人員。
在重構(gòu)優(yōu)先級劃分的有效性評估上,采用Cohen’s Kappa[28]對Bagging 異構(gòu)集成模型轉(zhuǎn)化后的重構(gòu)優(yōu)先級與6 名受訪者得出的重構(gòu)優(yōu)先級進(jìn)行一致性檢驗(yàn)。Kappa 一致性是一種衡量分類精度的指標(biāo),Kappa 系數(shù)越大表明一致性越高。一般認(rèn)為0~0.20為極低一致性,0.21~0.40 為一般一致性,0.41~0.60 為中等的一致性,0.61~0.80為高度一致性,0.81~1為幾乎完全一致。顯著性p值表示出現(xiàn)極端樣本的概率,一般認(rèn)為p值<0.05時(shí)具有統(tǒng)計(jì)學(xué)差異,并拒絕原假設(shè)。
在具有先后順序的一致性檢驗(yàn)中,即對于本文給出的重構(gòu)優(yōu)先級,優(yōu)先級差距越大,懲罰力度也應(yīng)越大,因此選擇使用平方加權(quán)Kappa(quadratic weighted Kappa)[29]。
為了驗(yàn)證Bagging異構(gòu)集成模型檢測實(shí)驗(yàn)中提到的3 種代碼異味的有效性,本文就以下3 個(gè)問題展開實(shí)驗(yàn)與結(jié)果分析:
RQ1:在不同代碼異味檢測中,表現(xiàn)最好的基分類器是哪個(gè)?
RQ2:在代碼異味檢測中,Bagging異構(gòu)集成模型在多大程度上提高基分類器的檢測性能?
RQ3:將Bagging 異構(gòu)集成模型輸出的異味概率轉(zhuǎn)化為可能性分布是否具有潛在的附加價(jià)值?即提供的重構(gòu)優(yōu)先級建議是否有效?
本次實(shí)驗(yàn)通過計(jì)算傳統(tǒng)的性能指標(biāo),包括Precision(P)、Recall(R)、F1 和AUC[27]來驗(yàn)證Bagging 異構(gòu)集成模型在檢測Complex Class、Long Method、Spaghetti Code上的有效性,其公式如(4)~(6):
其中,TP表示真陽性,F(xiàn)P表示假陽性,TN表示真陰性,F(xiàn)N表示假陰性,Precision 表示所有預(yù)測值為陽性的樣本中被正確預(yù)測的比例,Recall表示在所有實(shí)際值為陽性的樣本中被正確預(yù)測為陽性的比例。
AUC[27]是接受者操作員特征(ROC)曲線下方面積的百分比。AUC的取值范圍為[0,1],其中0表示最差分類器,1 表示最優(yōu)分類器。AUC 值為0.5 的分類器類似于隨機(jī)猜測分類器。
為了回答RQ1,本節(jié)給出6 種基分類器在3 種代碼異味上的性能,并通過分析6種基分類器在不同代碼異味檢測上的穩(wěn)定性來驗(yàn)證不同代碼異味是否存在不同的最適分類器。
基分類器對類級和方法級代碼異味的檢測性能如表6 所示。在類級代碼異味中,所有分類器在Complex Class 上表現(xiàn)出高性能而在Spaghetti Code 上則有所下滑。其中,LR的檢測性能最差,F(xiàn)1僅為47.76%和24.24%,而RF與KNN分別是檢測Complex Class、Spaghetti Code中性能最高的分類器,F(xiàn)1 達(dá)到80.29%和63.64%。與類級代碼異味相比,所有分類器在Long Method的檢測上都能取得較好的性能,但LR 的表現(xiàn)仍非常一般。上述分析表明,針對不同的代碼異味,其最佳分類器可能因代碼異味類型而異。
表6 基分類器性能Table 6 Performance of base classifiers 單位:%
由于最適分類器的數(shù)量可能不止一個(gè),需繼續(xù)研究分類器的穩(wěn)定性。表7 總結(jié)了各代碼異味類型的最佳和最差分類器。若分類器的F1 在前25%(Q3),則認(rèn)為該分類器是此異味類型檢測中性能最好的分類器之一;反之若低于后25%(Q1),則是性能最差的分類器。表7中,“+”表示該分類器是檢測該異味類型的最佳分類器之一,而“-”則相反。此外,N/A表示空白項(xiàng),不表示最佳或最差以及任何數(shù)字。
表7 基于F1值的各代碼異味中最佳/差分類器Table 7 Best and worst classifiers for each code smell in terms of F1
通過表7中數(shù)據(jù)可以觀察到RF、SVM、KNN分別是檢測Complex Class、Long Method、Spaghetti Code 的最適分類器,其中RF 的性能最為穩(wěn)定,而LR 則始終是最差的分類器。由于選擇的分類器數(shù)量有限,不能排除存在性能更好或更差的分類器,就上述結(jié)論而言,導(dǎo)致RF 性能最為穩(wěn)定而LR 性能最差的原因可能有以下四點(diǎn),從分類器原理角度解釋:(1)RF作為Bagging中最具代表性的機(jī)器學(xué)習(xí)算法,引入?yún)?shù)、樣本等的隨機(jī),能避免單棵決策樹的過擬合。(2)RF的結(jié)果由許多棵不同的簡單決策樹投票構(gòu)成,具有強(qiáng)泛化能力。從代碼異味角度分析:(3)代碼異味的產(chǎn)生存在諸多原因,表現(xiàn)出復(fù)雜的特征(尤其是類級代碼異味),LR 不能很好地處理較大的特征空間,易欠擬合。(4)代碼異味數(shù)據(jù)集不一定是線性可分的,對LR的性能影響巨大。
此外,即使分類器在檢測某個(gè)代碼異味時(shí)表現(xiàn)良好,但不能保證對其他代碼異味的檢測仍然保持性能穩(wěn)定。例如,SVM是檢測Long Method的最佳分類器,但對Complex Class的性能卻排在倒數(shù)。
總結(jié)RQ1,分類器的性能因代碼異味類型而異。在所有分類器中,RF、SVM、KNN 都存在各自適合檢測的代碼異味,其中RF 的性能最為穩(wěn)定。另一方面,LR 始終是最差的分類器。
為了回答RQ2,本文將在每一種代碼異味實(shí)驗(yàn)中分為7組,第一組為Bagging異構(gòu)集成模型的預(yù)測性能,后6 組為基分類器與Bagging 異構(gòu)集成模型性能的差值。利用從6個(gè)系統(tǒng)的32個(gè)版本中獲取的相關(guān)數(shù)據(jù)集,對本次實(shí)驗(yàn)構(gòu)建的Bagging 異構(gòu)集成模型進(jìn)行驗(yàn)證,性能結(jié)果如表8 所示。其中BHE 表示Bagging 異構(gòu)集成模型(下同)。
表8 模型性能對比Table 8 Comparison of model performance
對于Complex Class 和Spaghetti Code,表8 所示結(jié)果表明Bagging異構(gòu)集成模型的性能在F1與AUC上相較于其他6 種基分類器有明顯優(yōu)勢,分別提升1.11~40.51個(gè)百分點(diǎn)和0.76~28.37個(gè)百分點(diǎn)。Bagging異構(gòu)集成模型優(yōu)于基分類器的原因如下:(1)從模型優(yōu)化出發(fā),集成多種模型可以減少單一模型陷入局部最優(yōu)點(diǎn)而導(dǎo)致模型泛化能力不佳的風(fēng)險(xiǎn);(2)從集成策略出發(fā),Bagging異構(gòu)集成模型通過加權(quán)結(jié)合多種分類器,在充分發(fā)揮最適分類器的同時(shí)降低性能較差的分類器對結(jié)果的影響。
對于Long Method,Bagging 異構(gòu)集成模型雖然沒有在全部指標(biāo)上取得最好的得分,但與性能最好的基分類器SVM 差距非常小。同時(shí)Bagging 異構(gòu)集成模型在Precision 上提高1.44~7.81 個(gè)百分點(diǎn),說明Bagging 異構(gòu)集成模型的性能與最優(yōu)基分類器相差不大,同樣具有良好的檢測能力。
總結(jié)RQ2,本文提出的Bagging 異構(gòu)集成模型是通過使用6 種有監(jiān)督機(jī)器學(xué)習(xí)模型,采用F1 集成策略的概率模型,在Complex Class、Long Method、Spaghetti Code上都具有良好的檢測能力。
為了回答RQ3,并進(jìn)一步探究Bagging 異構(gòu)集成模型中采用的可能性分布是否可以作為有效的重構(gòu)優(yōu)先級提供給開發(fā)人員,本文利用可能性分布轉(zhuǎn)化公式[13],將模型輸出的概率分布轉(zhuǎn)化為可能性分布。為驗(yàn)證可能性分布作為重構(gòu)優(yōu)先級的有效性,本文共邀請39 位受訪者,以探究轉(zhuǎn)化后的重構(gòu)優(yōu)先級與實(shí)際應(yīng)用中的一致程度。最后收到其中6 位的回復(fù):2 位從事后端開發(fā)(Dev1、Dev2),1位從事硬件開發(fā)(Dev3),3位是軟件工程方向研究生(Dev4、Dev5、Dev6)。為了確保受訪者的響應(yīng)率,必須控制每位受訪者所需執(zhí)行的任務(wù)數(shù)量,因此在每種代碼異味中選擇5 個(gè)已知存在異味的實(shí)例作為對象,并讓受訪者為每個(gè)實(shí)例分配一個(gè)重構(gòu)優(yōu)先級,從1(最優(yōu)先)到5(最滯后)進(jìn)行排序。雖然受訪者的數(shù)量很少(占回復(fù)率的15.4%),但也符合關(guān)于最低回復(fù)率的調(diào)查研究[30]。
由Bagging異構(gòu)集成模型轉(zhuǎn)化得到的概率分布與可能性分布如表9所示。為了更直觀地判斷Bagging異構(gòu)集成模型提供的重構(gòu)優(yōu)先級是否有效,實(shí)驗(yàn)采用平方加權(quán)Kappa進(jìn)行一致性檢驗(yàn),結(jié)果如表10所示。
表9 三種代碼異味的概率分布與可能性分布Table 9 Probability and possibility distributions of three code smells
由于每一種代碼異味的異味實(shí)例過少,因此將15個(gè)異味實(shí)例作為整體進(jìn)行分析。表10 結(jié)果表明,Bagging異構(gòu)集成與Dev1~Dev6 的p值都小于0.05,拒絕原假設(shè),即兩者具有一致性。此外,Bagging異構(gòu)集成模型轉(zhuǎn)化得到的重構(gòu)優(yōu)先級與Dev1~Dev6 具有高度一致性,Kappa系數(shù)最高可達(dá)0.900。
表9、表10 中,對于優(yōu)先級較高的排名,Bagging 異構(gòu)集成模型轉(zhuǎn)化得到的重構(gòu)優(yōu)先級與Dev1~Dev6 的判斷幾乎一致,然而有兩項(xiàng)異味實(shí)例的重構(gòu)優(yōu)先級存在較大分歧。對于Complex Class,Eclipse-3.5.2 的Problem-Reporter類,Dev1、Dev3、Dev4的判斷與Bagging異構(gòu)集成模型存在差距。對于Spaghetti Code,Xerces-1.4.1 的RegexParser類,Dev1仍然持不同意見。Dev1認(rèn)為ProblemReporter與RegexParser在業(yè)務(wù)實(shí)現(xiàn)中必須使用大量if-else與switch-case語句,導(dǎo)致代碼冗長,不可避免地產(chǎn)生代碼異味。即使需要添加新功能,其代碼增量也較少,同時(shí)也極少修改原代碼,重構(gòu)所需付出的成本和效率不成正比,因此重構(gòu)優(yōu)先級較低。上述案例很好地說明了代碼異味是代碼的一種癥狀,任何基于機(jī)器學(xué)習(xí)的代碼異味檢測與重構(gòu)算法都應(yīng)當(dāng)指出開發(fā)人員所關(guān)注的設(shè)計(jì)[14,31]與重構(gòu)問題,因此研究者應(yīng)將研究成果真正受用于開發(fā)者。
總結(jié)RQ3,本文給出的重構(gòu)優(yōu)先級與Dev1~Dev6給出的重構(gòu)優(yōu)先級整體具有高度一致性,Kappa系數(shù)最低也達(dá)到0.700,最高為0.900。該結(jié)果表明,將Bagging異構(gòu)集成模型的概率輸出轉(zhuǎn)化為可能性分布,在代碼異味重構(gòu)優(yōu)先級上具有較高有效性。
本文提出Bagging 異構(gòu)集成模型,在6 個(gè)項(xiàng)目的32個(gè)版本上進(jìn)行驗(yàn)證實(shí)驗(yàn)并對比了該模型與基分類器的性能,以探究Bagging 異構(gòu)集成模型的有效性。RQ1、RQ2 結(jié)果顯示,最佳分類器因不同代碼異味類型而異,同時(shí)與6 種基分類器相比,Bagging 異構(gòu)集成模型的F1提升了0.45~14.67個(gè)百分點(diǎn),AUC提升了0.76~21.98個(gè)百分點(diǎn),表明Bagging 異構(gòu)集成模型在檢測Complex Class、Long Method、Spaghetti Code上較基分類器有明顯提升。在RQ3 中,Bagging 異構(gòu)集成與Dev1~Dev6 的Kappa 系數(shù)最高達(dá)到0.900,表明將Bagging異構(gòu)集成模型的概率輸出轉(zhuǎn)化為可能性分布并作為重構(gòu)優(yōu)先級具有較高有效性。
未來的工作包括:(1)設(shè)置模型動態(tài)概率閾值以獲得更合理的結(jié)果。(2)擴(kuò)展檢測的代碼異味種類,以探究Bagging 異構(gòu)集成模型在其他代碼異味上的適用性。(3)增加過程度量,為重構(gòu)優(yōu)先級提供可靠依據(jù)。