王曙燕,張一權(quán),孫家澤
(西安郵電大學(xué) 計算機(jī)學(xué)院,西安 710000)
FOWLER等人[1]在1999年提出了“代碼壞味”的概念,其指軟件開發(fā)過程中可能會出現(xiàn)的代碼問題。代碼壞味檢測是通過重構(gòu)步驟解決源代碼(或設(shè)計)問題的既定方法,其目的是提高軟件質(zhì)量和維護(hù)效果。FOWLER等人一共提出了22種代碼壞味,包括克隆代碼、特征依戀和長方法等。代碼壞味及其檢測方法極大地推動了自動化軟件重構(gòu)的應(yīng)用和發(fā)展,成為軟件重構(gòu)領(lǐng)域的研究熱點之一。
目前,研究人員設(shè)計出很多代碼壞味檢測工具,具有代表性的包括DECOR、IPlasma、InFusion、JDeodorant、PMD以及Checkstyle,這些工具基于一組度量和規(guī)則來檢測特定代碼壞味,如眾所周知的面向?qū)ο蟮亩攘炕蛘邽闄z測特定壞味而臨時定義的度量。根據(jù)檢測規(guī)則,用于通過不同工具檢測代碼壞味的度量可以是不同的,不同的工具對同一種代碼壞味的檢測結(jié)果也不同。此外,即使度量標(biāo)準(zhǔn)相同,度量標(biāo)準(zhǔn)的閾值也可能發(fā)生變化,從而使得檢測到的壞味數(shù)量相應(yīng)地改變。檢測工具的另外一個問題是檢測準(zhǔn)確性普遍較低,會檢測到許多假陽性壞味。上述問題推動了研究人員對代碼壞味檢測方法進(jìn)行分析并提出了一系列的自動或半自動改進(jìn)方法,以從代碼中檢測壞味[2]。其中,JDeodorant[3]是由TSANTALIS等人設(shè)計的代碼壞味檢測工具,該工具利用杰卡德距離衡量2個代碼實體之間的相似性。文獻(xiàn)[4-6]研究表明,在不同的代碼壞味檢測算法中,特征度量和閾值存在差異,不同的方法選取的度量值和閾值也有所不同,這就導(dǎo)致在代碼壞味檢測中沒有一個具體的標(biāo)準(zhǔn)[2]。學(xué)者們?yōu)榱私鉀Q該問題,提出基于各類機(jī)器學(xué)習(xí)算法的代碼壞味檢測方法,但是這些方法也存在一定的局限性。NUCCI等人[7]通過大量實驗,指出在機(jī)器學(xué)習(xí)算法的檢測過程中,代碼壞味數(shù)據(jù)集普遍僅存在一種類型的壞味,這并不符合實際情況,因為在軟件開發(fā)中代碼壞味不可能只存在單一類型,通過實驗可知在數(shù)據(jù)集中存在不同類型的代碼壞味,機(jī)器學(xué)習(xí)算法在對其檢測時準(zhǔn)確率較低,說明了不同類型的代碼壞味分布在數(shù)據(jù)集中時減弱了機(jī)器學(xué)習(xí)算法對代碼壞味的檢測能力。
本文將BP神經(jīng)網(wǎng)絡(luò)(BPNN)與常見的軟件度量項相結(jié)合,以對代碼壞味進(jìn)行檢測。合并不同類型的代碼壞味,使數(shù)據(jù)集中存在不同的壞味類型,將常見的軟件度量特征與代碼壞味實例進(jìn)行相對應(yīng)的編碼,根據(jù)數(shù)據(jù)集中的標(biāo)簽信息實現(xiàn)有監(jiān)督深度學(xué)習(xí)。利用神經(jīng)網(wǎng)絡(luò)在自動選擇原始數(shù)據(jù)特征方面的優(yōu)勢,提取出這些度量項之間的相互關(guān)系,使度量特征項與代碼壞味實例完成映射建模,同時模型學(xué)習(xí)輸入的代碼壞味特征中的復(fù)雜關(guān)系規(guī)則,從而對代碼壞味實例進(jìn)行分類。由于有監(jiān)督的深度學(xué)習(xí)通常需要大量的標(biāo)記數(shù)據(jù)作為訓(xùn)練樣本,因此本文借助2種代碼壞味檢測工具針對4種類型的代碼壞味實例進(jìn)行提取,檢測程序主要包括Apache中的7個Java開源項目。
目前的代碼壞味檢測方法主要分為兩大類,一類為基于規(guī)則的方法,這些方法主要依賴于度量,在某些情況下還有與代碼結(jié)構(gòu)和命名相關(guān)的其他規(guī)則;另一類方法使用機(jī)器學(xué)習(xí)技術(shù),這些技術(shù)主要基于度量進(jìn)行代碼壞味檢測。
基于規(guī)則的方法較復(fù)雜,因為它們使用的信息來源多于基于度量的機(jī)器學(xué)習(xí)方法,如命名規(guī)則[8]、結(jié)構(gòu)規(guī)則[8]以及軟件版本歷史[9]。章曉芳等人[10]考慮到代碼壞味與軟件演化中的源文件操作關(guān)系,探究包含壞味的文件在軟件版本歷史中的不同特征,研究結(jié)果表明,有幾種特定的壞味對文件的修改產(chǎn)生了顯著影響。另一方面,基于規(guī)則的方法依賴于人為手動創(chuàng)建的規(guī)則。例如,DECOR要求規(guī)則為特定的語言形式,并且此規(guī)范過程必須由領(lǐng)域?qū)<?、工程師完成[11]。然而,基于度量的機(jī)器學(xué)習(xí)方法是否比基于規(guī)則的方法需要更少的人為干預(yù)不得而知,它取決于2個因素:1)基于規(guī)則的方法需要什么復(fù)雜程度的規(guī)則;2)基于度量的機(jī)器學(xué)習(xí)方法需要多少訓(xùn)練樣本[12]。基于度量的機(jī)器學(xué)習(xí)方法的明顯優(yōu)勢是減少了開發(fā)人員的工作壓力,基于規(guī)則的方法要求工程師創(chuàng)建定義每種氣味的特定規(guī)則。對于基于度量的機(jī)器學(xué)習(xí)方法,由機(jī)器學(xué)習(xí)算法創(chuàng)建規(guī)則,要求工程師僅提供一段代碼是否有氣味的信息。
研究人員提出了基于各類機(jī)器學(xué)習(xí)算法的代碼壞味檢測方法。KREIMER[13]提出了一種自適應(yīng)檢測方法,該方法將基于度量與學(xué)習(xí)決策樹的基礎(chǔ)方法相結(jié)合,對過大類和長方法的2種代碼壞味類型進(jìn)行檢測,并且在IYC系統(tǒng)和WEKA工具上完成分析。該方法適用于特定的場景,但在識別不同的代碼壞味時會因為度量規(guī)則而存在性能差異。KHOMH等人[14]提出了BDTEX方法,其為一種目標(biāo)問題度量方法,根據(jù)反模式的定義構(gòu)建貝葉斯信任網(wǎng)絡(luò),并在2個開源程序上使用Blob反模式、功能分解和Spaghetti Code反模式驗證BDTEX方法。MAIGA等人[15]利用一種基于支持向量機(jī)的檢測方法在3個開源程序中進(jìn)行反模式檢測,該方法的F1值達(dá)到80%左右,但是準(zhǔn)確度較低。YANG等人[16]通過在克隆代碼上應(yīng)用機(jī)器學(xué)習(xí)算法研究開發(fā)人員對代碼壞味的判斷。PALOMBA等人[17]提出一種基于信息檢索技術(shù),利用程序中的文本信息進(jìn)行壞味檢測。FONTANA等人[12]將幾種常見的機(jī)器學(xué)習(xí)算法應(yīng)用在各類代碼壞味檢測中,并總結(jié)了J48、隨機(jī)森林以及貝葉斯網(wǎng)絡(luò)等幾種表現(xiàn)較好的機(jī)器學(xué)習(xí)算法。但是,在利用機(jī)器學(xué)習(xí)算法對代碼壞味進(jìn)行檢測的過程中,數(shù)據(jù)集包含的有壞味與無壞味實例之間的度量分布不同,實例的選擇可能會導(dǎo)致機(jī)器學(xué)習(xí)算法對壞味的檢測性能下降。劉麗倩等人[18]針對數(shù)據(jù)不平衡對機(jī)器學(xué)習(xí)算法的影響問題,將決策樹算法與代價敏感學(xué)習(xí)理論相結(jié)合以對長方法進(jìn)行檢測,研究結(jié)果表明,其能提高長方法的檢測查準(zhǔn)率和查全率。卜依凡等人[19]將代碼中的文本信息和軟件度量相結(jié)合,通過一種基于深度學(xué)習(xí)技術(shù)的方法對上帝類代碼壞味進(jìn)行檢測,實驗結(jié)果表明,該方法對上帝類代碼壞味的檢測性能優(yōu)于代碼壞味檢測工具JDeodorant,尤其是在查全率上優(yōu)勢明顯。
上述基于機(jī)器學(xué)習(xí)的方法在進(jìn)行代碼壞味檢測時取得了較好的檢測效果。但是,此類方法僅考慮數(shù)據(jù)集中包含受單一類型壞味影響的實例的情景,并不符合軟件開發(fā)過程中出現(xiàn)各種類型代碼壞味的實際情況。本文基于BP神經(jīng)網(wǎng)絡(luò),對同一種數(shù)據(jù)集中存在不同類型代碼壞味和無壞味的情況進(jìn)行代碼壞味檢測。
BP神經(jīng)網(wǎng)絡(luò)具有高效非線性數(shù)據(jù)函數(shù)映射逼近功能,其為一種功能強(qiáng)大的數(shù)據(jù)建模工具,能夠捕獲和表示復(fù)雜的輸入與輸出關(guān)系[20]。
(1)
其中,f(·)為激活函數(shù),在輸出層輸出過程中使用Softmax激活函數(shù),將其設(shè)置為3個單元表示輸出代碼壞味特征類型。Softmax激活函數(shù)可以將多個神經(jīng)元的輸出映射到(0,1)區(qū)間,選取概率最大的分類作為代碼壞味預(yù)測結(jié)果。
在BP神經(jīng)網(wǎng)絡(luò)模型中,層與層之間存在計算線性關(guān)系,在網(wǎng)絡(luò)初始化完成之后,需要為每層選擇合適的激活函數(shù),目的是為了盡可能多地得到神經(jīng)網(wǎng)絡(luò)中每層之間學(xué)習(xí)輸入數(shù)據(jù)的線性變換集合空間,從而充分利用多層表示的優(yōu)勢。在網(wǎng)絡(luò)中,隱藏層學(xué)習(xí)輸入層數(shù)據(jù)的線性變換(網(wǎng)絡(luò)中間一層使用ReLU激活函數(shù)),ReLU激活函數(shù)用于隱藏層神經(jīng)元輸出,當(dāng)輸入x<0時,輸出為0,當(dāng)x>0時,輸出為x,該激活函數(shù)使神經(jīng)網(wǎng)絡(luò)更快收斂,計算公式如式(2)所示:
φ(x)=max(0,x)
(2)
(3)
為了使BP神經(jīng)網(wǎng)絡(luò)對代碼壞味進(jìn)行可靠的預(yù)測,必須對BP神經(jīng)網(wǎng)絡(luò)進(jìn)行適當(dāng)訓(xùn)練。在訓(xùn)練過程中,BP神經(jīng)網(wǎng)絡(luò)算法利用梯度下降法尋找最優(yōu)解,在輸出層和隱藏層之間,通過誤差值按權(quán)重比例進(jìn)行分割,計算出每條鏈接相關(guān)的特定誤差值,通過重組這些誤差值得到隱藏層神經(jīng)元節(jié)點相關(guān)聯(lián)的誤差值,再次將這些誤差值按照輸入層和隱藏層之間的權(quán)重進(jìn)行分割,完成誤差的反向傳播。其中,最主要的步驟是更新層與層之間的權(quán)重值和閾值,更新規(guī)則表達(dá)式如式(4)~式(7)所示:
(4)
θ2=θ2+β·(Ypred-Yreal)·Ypred·(1-Ypred)
(5)
(6)
(7)
其中,α和β為學(xué)習(xí)率,在訓(xùn)練過程中,需要獲取BP神經(jīng)網(wǎng)絡(luò)的目標(biāo)輸出,Yreal為代碼壞味真實值,將其作為最終的目標(biāo)輸出。如果目標(biāo)輸出Yreal與預(yù)測目標(biāo)Ypred之間的誤差小于當(dāng)前設(shè)定的閾值,或者訓(xùn)練迭代輪數(shù)達(dá)到預(yù)設(shè)的閾值,則完成模型訓(xùn)練。
機(jī)器學(xué)習(xí)算法在對代碼壞味進(jìn)行檢測的過程中,數(shù)據(jù)集中只包含一種類型的代碼壞味,并不能反映軟件設(shè)計過程中存在的實際問題。本文提出基于BP神經(jīng)網(wǎng)絡(luò)的代碼壞味檢測方法,針對數(shù)據(jù)類(Data class)、上帝類(God class)、長方法(Long method)和特征依戀(Feature envy)4種壞味類型進(jìn)行分類,并將4種類型合并為方法級別和類級別2種類型的數(shù)據(jù)集,使數(shù)據(jù)集中包含不同的壞味類型。表1所示為4種類型的代碼壞味描述。
表1 代碼壞味描述Table 1 Description of bad smell in code
利用神經(jīng)網(wǎng)絡(luò)對代碼壞味進(jìn)行檢測,是將度量特征信息與標(biāo)簽信息組成的向量形式作為神經(jīng)網(wǎng)絡(luò)輸入層的輸入,通過網(wǎng)絡(luò)得到特征并輸入到目標(biāo)函數(shù)的神經(jīng)網(wǎng)絡(luò)分類器中進(jìn)行訓(xùn)練,分類器的預(yù)期輸出為樣本的標(biāo)簽,在經(jīng)過多次迭代訓(xùn)練后,可以得到最終被訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)分類器。圖1所示為本文代碼壞味檢測方法的流程。
圖1 基于BP神經(jīng)網(wǎng)絡(luò)的代碼壞味檢測方法流程Fig.1 Procedure of detection method of bad smell in code based on BP neural network
在對數(shù)據(jù)集進(jìn)行預(yù)處理時需要提取代碼壞味實例、度量特征以及標(biāo)簽,由于不同的研究人員對度量特征提取的結(jié)果不同,本文主要按以下度量項來提取代碼壞味度量特征:
1)數(shù)據(jù)類:耦合強(qiáng)度(CINT)和類耦合類數(shù)(CBO)。
2)上帝類:訪問外部數(shù)據(jù)數(shù)(ATFD)、類的圈復(fù)雜度(WMC)、類中通過訪問相同屬性而發(fā)生連接的方法對個數(shù)(TCC)。
3)特征依戀:訪問外部數(shù)據(jù)數(shù)(ATFD)、屬性訪問的位置(LAA)、提供外部數(shù)據(jù)數(shù)(FDP)。
4)長方法:代碼總行數(shù)(LOC)、方法數(shù)(NOM)、屬性數(shù)(NOA)。
提取度量特征、代碼壞味實例與標(biāo)簽的具體步驟如下:
步驟1針對4種代碼壞味類型,使用代碼壞味自動檢測工具iPlasma和Checkstyle對開源軟件系統(tǒng)進(jìn)行檢測,提取代碼壞味實例和無壞味實例并對其進(jìn)行標(biāo)記,生成標(biāo)簽。
步驟2計算有代碼壞味實例和無代碼壞味實例的度量特征。使用浮點數(shù)序列對有代碼壞味和無代碼壞味實例度量特征進(jìn)行編碼表示,其中,0代表某度量特征不是代碼壞味影響因素,純小數(shù)值代表某度量特征是影響代碼壞味的因素。
步驟3將步驟1和步驟2中的度量特征和標(biāo)簽進(jìn)行合并,生成方法級別和類級別的2種數(shù)據(jù)集,以此構(gòu)成訓(xùn)練集。
利用度量特征和標(biāo)簽構(gòu)成訓(xùn)練集的具體實現(xiàn)過程如下:
將得到的度量特征與標(biāo)簽信息進(jìn)行合并,并將度量特征與標(biāo)簽信息轉(zhuǎn)換為向量表示〈m11,m12,…,p1n〉,m表示度量特征,p表示標(biāo)簽。合并之后的2種代碼壞味訓(xùn)練集結(jié)構(gòu)為:每一行代表代碼壞味實例,每一列代表度量特征,最后一列為標(biāo)簽信息,以此形成一種矩陣數(shù)據(jù)M。
AHSAN等人[21]在肌電圖(EMG)信號的基礎(chǔ)上,利用人工神經(jīng)網(wǎng)絡(luò)檢測不同的預(yù)定義手部運(yùn)動(上、下、左、右),所設(shè)計的網(wǎng)絡(luò)能夠成功識別手部運(yùn)動。王毅等人[22]將卷積神經(jīng)網(wǎng)絡(luò)和長短期記憶神經(jīng)網(wǎng)絡(luò)相結(jié)合,對用戶偽裝入侵模式的缺陷進(jìn)行檢測,其檢測效果優(yōu)于基準(zhǔn)系統(tǒng),從而驗證了該方法的有效性。神經(jīng)網(wǎng)絡(luò)在分類方面具有優(yōu)勢,利用BP神經(jīng)網(wǎng)絡(luò)模型可以較好地預(yù)測代碼壞味。BP神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu)如圖2所示。
圖2 BP神經(jīng)網(wǎng)絡(luò)分類模型結(jié)構(gòu)Fig.2 Structure of BP neural network classification model
在對數(shù)據(jù)集進(jìn)行預(yù)處理后,將數(shù)據(jù)集輸入到神經(jīng)網(wǎng)絡(luò)模型中,代碼壞味檢測的具體步驟如下:
輸入帶有標(biāo)簽的代碼壞味矩陣數(shù)據(jù)樣本M
輸出代碼壞味類別
步驟1建立神經(jīng)網(wǎng)絡(luò)分類器模型,構(gòu)建的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)采用全連接形式,第1層為一個輸入層,第2層是隱藏層,網(wǎng)絡(luò)的最后一層是輸出層,輸出層采用Softmax函數(shù)并輸出代碼壞味的類別。
步驟2將數(shù)據(jù)集預(yù)處理之后的代碼壞味度量特征的矩陣數(shù)據(jù)M作為輸入層的輸入,將標(biāo)簽信息作為網(wǎng)絡(luò)輸出基準(zhǔn),表示為Yreal,輸出層的輸出值表示為Ypred,如果Yreal與Ypred之間的誤差小于當(dāng)前設(shè)定的閾值或者訓(xùn)練迭代輪數(shù)達(dá)到閾值,則完成神經(jīng)網(wǎng)絡(luò)對代碼壞味預(yù)測輸出的訓(xùn)練,否則返回神經(jīng)網(wǎng)絡(luò)輸入層進(jìn)行模型訓(xùn)練。
步驟3將FONTANA等人提出的代碼壞味公開數(shù)據(jù)集作為基準(zhǔn)代碼壞味測試集,并且按照數(shù)據(jù)集預(yù)處理過程中所述方式對測試數(shù)據(jù)進(jìn)行合并與向量形式轉(zhuǎn)換。將得到的測試集輸入訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)模型中,模型自動輸出預(yù)測的代碼壞味類別。
在訓(xùn)練與測試階段需要監(jiān)控樣本上的損失和精度,并以準(zhǔn)確度(Accuracy)、F1值以及AUC值評價指標(biāo)評估神經(jīng)網(wǎng)絡(luò)模型的分類性能。準(zhǔn)確度、F1值具體計算公式如式(8)~式(11)所示:
(8)
(9)
(10)
(11)
其中,TP代表樣本正類,TN代表樣本負(fù)類,FP為將錯誤的樣本分類成正確樣本的數(shù)量,FN則是將正確樣本分類成錯誤樣本的數(shù)量。
F1值可以看作模型精確率和召回率的一種加權(quán)平均值,取值范圍為0~1。在分類任務(wù)中,期望精確率和召回率都達(dá)到很高,但實際上不可能實現(xiàn)。因此,需要獲取兩者之間的平衡點,而F1值可以看作此平衡點,F1值越高說明精確率和召回率同時達(dá)到較高且取得了平衡。
AUC值被定義為ROC曲線下的面積,其不受閾值的影響。作為數(shù)值類型,AUC值越大的分類器效果越好。
NUCCI等人對FONTANA提出的代碼壞味公開數(shù)據(jù)集進(jìn)行合并,使其中擁有不同的壞味類型。本文基于該數(shù)據(jù)集,在相同的條件下利用Weka工具提供的機(jī)器學(xué)習(xí)算法和本文方法分別進(jìn)行代碼壞味檢測,以驗證本文代碼壞味檢測方法的性能。
本文實驗在Ubuntu14.04 LTS環(huán)境下進(jìn)行,模型代碼基于Keras深度學(xué)習(xí)框架實現(xiàn),使用Tensorflow作為計算后端引擎。神經(jīng)網(wǎng)絡(luò)模型采用全連接形式,以batch size=10的形式組成小批量對網(wǎng)絡(luò)進(jìn)行梯度更新,網(wǎng)絡(luò)的訓(xùn)練迭代輪數(shù)epoch設(shè)置為500。
本次實驗通過代碼壞味檢測工具對7個Java開源項目進(jìn)行檢測,以獲取代碼壞味實例,并將數(shù)據(jù)類、上帝類、特征依戀以及長方法的4種數(shù)據(jù)集進(jìn)行合并,生成類級別和方法級別的2種類型數(shù)據(jù)集,使代碼壞味數(shù)據(jù)集中包含不同壞味類型以及度量特征值。利用FONTANA等人[12]提出的公開代碼壞味數(shù)據(jù)集作為基準(zhǔn)測試集,對訓(xùn)練好的模型進(jìn)行測試。具體過程如下:
1)對數(shù)據(jù)集中的度量特征、代碼壞味實例以及標(biāo)簽進(jìn)行預(yù)處理。本文利用代碼壞味自動檢測工具獲取到代碼壞味實例并進(jìn)行標(biāo)記生成標(biāo)簽,結(jié)合度量特征與標(biāo)簽信息得到代碼壞味訓(xùn)練集。考慮到基準(zhǔn)數(shù)據(jù)集為Arff格式,不利于輸入BP神經(jīng)網(wǎng)絡(luò),本文利用Python實現(xiàn)CSV數(shù)據(jù)集格式與Arff數(shù)據(jù)集格式的相互轉(zhuǎn)換。為了驗證代碼壞味預(yù)測模型的實際能力,將上帝類和數(shù)據(jù)類的數(shù)據(jù)集合并為類級別的數(shù)據(jù)集,將特征依戀和長方法的數(shù)據(jù)集合并為方法級別的數(shù)據(jù)集。合并之后的2種數(shù)據(jù)集分別包含840種代碼壞味實例。
2)神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練。將預(yù)處理后的代碼壞味數(shù)據(jù)集作為網(wǎng)絡(luò)輸入層的輸入,標(biāo)簽值作為網(wǎng)絡(luò)的預(yù)期輸出,實現(xiàn)網(wǎng)絡(luò)對代碼壞味分類輸出的訓(xùn)練,從而得到BP神經(jīng)網(wǎng)絡(luò)分類模型。
3)模型優(yōu)化。在模型優(yōu)化階段,利用十折交叉驗證法驗證模型對代碼壞味的預(yù)測精度,以避免在訓(xùn)練過程中出現(xiàn)過擬合現(xiàn)象。模型以分類交叉熵作為損失函數(shù),降低BP神經(jīng)網(wǎng)絡(luò)對代碼壞味的預(yù)測錯誤率,選擇自適應(yīng)學(xué)習(xí)率的Adam進(jìn)行模型參數(shù)學(xué)習(xí)。
實驗從以下3個方面分析本文基于BP神經(jīng)網(wǎng)絡(luò)的代碼壞味檢測方法與NUCCI等人使用的機(jī)器學(xué)習(xí)算法在相同數(shù)據(jù)集上的代碼壞味檢測結(jié)果:
1)數(shù)據(jù)集中包含不同類型的代碼壞味對于神經(jīng)網(wǎng)絡(luò)分類器的效果影響。為了探究數(shù)據(jù)集中存在不同類型的代碼壞味對神經(jīng)網(wǎng)絡(luò)分類器檢測效果的影響,將方法級別和類級別的代碼壞味數(shù)據(jù)集分別作為神經(jīng)網(wǎng)絡(luò)的分類輸入。各檢測方法在不同數(shù)據(jù)集中的準(zhǔn)確度、F1值和AUC值結(jié)果分別如表2~表5所示。
表2 數(shù)據(jù)類數(shù)據(jù)集的測試結(jié)果Table 2 Test results of Data class dataset
表3 上帝類數(shù)據(jù)集的測試結(jié)果Table 3 Test results of God class dataset
表4 特征依戀數(shù)據(jù)集的測試結(jié)果Table 4 Test results of Feature envy dataset
表5 長方法數(shù)據(jù)集的測試結(jié)果Table 5 Test results of Long method dataset
實驗結(jié)果表明,本文方法在數(shù)據(jù)集存在不同壞味類型的情況下,平均準(zhǔn)確度達(dá)到91.63%,平均F1值達(dá)到87.63%,在AUC值上與其他檢測方法相比沒有明顯差別,但在分類整體效果上優(yōu)于其他檢測方法。以J48方法為例,本文方法在平均準(zhǔn)確度上提高了9.26%,平均F1值提高了41.75%。對比基于度量和規(guī)則的代碼壞味檢測工具JDeodorant,本文方法在平均準(zhǔn)確度上提高了16.03%,平均F1值提高了74.33%。綜合基于機(jī)器學(xué)習(xí)的代碼壞味檢測方法和基于度量的代碼壞味檢測工具JDeodorant,本文方法在總體平均準(zhǔn)確度上提升了15.19%,平均F1值提升了58.39%。
2)神經(jīng)網(wǎng)絡(luò)模型構(gòu)建過程中的參數(shù)設(shè)置。在利用BP神經(jīng)網(wǎng)絡(luò)模型檢測代碼壞味的過程中,網(wǎng)絡(luò)隱藏層神經(jīng)元的數(shù)量選擇尤為重要。根據(jù)2種數(shù)據(jù)集含有不同的代碼壞味特征,本文對類級別數(shù)據(jù)集和方法級別數(shù)據(jù)集的模型神經(jīng)元個數(shù)設(shè)置如表6所示。
表6 神經(jīng)元數(shù)量設(shè)置Table 6 Number setting of neurons
在網(wǎng)絡(luò)中,隱藏層采用ReLU激活函數(shù),輸出層采用Softmax激活函數(shù)。
3)代碼壞味分類的準(zhǔn)確度。為了能夠形象描述本文模型在訓(xùn)練階段與測試階段的代碼壞味分類準(zhǔn)確度,記錄樣本在分類過程中的準(zhǔn)確度,結(jié)果如圖3~圖6所示。從中可以看出,神經(jīng)網(wǎng)絡(luò)分類器在迭代輪數(shù)為400~500時能達(dá)到最佳整體分類性能。
圖3 數(shù)據(jù)類數(shù)據(jù)集的準(zhǔn)確度Fig.3 Accuracy of Data class dataset
圖4 上帝類數(shù)據(jù)集的準(zhǔn)確度Fig.4 Accuracy of God class dataset
圖5 特征依戀數(shù)據(jù)集的準(zhǔn)確度Fig.5 Accuracy of Feature envy dataset
圖6 長方法數(shù)據(jù)集的準(zhǔn)確度Fig.6 Accuracy of Long method dataset
代碼壞味檢測對程序質(zhì)量具有重要影響,本文提出一種基于BP神經(jīng)網(wǎng)絡(luò)的代碼壞味檢測方法,將常見的軟件度量特征項與代碼壞味實例信息相結(jié)合,并將收集到的代碼壞味類別合并成類級別和方法級別的2種類型數(shù)據(jù)集,以此作為神經(jīng)網(wǎng)絡(luò)模型的輸入,模型輸出代碼壞味的分類類別。實驗結(jié)果表明,與J48、Random Forest等代碼壞味檢測方法相比,該方法在測試集上的整體效果更優(yōu)。
在實際的代碼壞味檢測中,收集到的相關(guān)數(shù)據(jù)集中正樣本數(shù)量與負(fù)樣本數(shù)量存在很大的不平衡性,影響了預(yù)測結(jié)果的準(zhǔn)確度,為解決該問題,研究人員通常手動選取數(shù)據(jù)集的正負(fù)樣本數(shù)量,以達(dá)到數(shù)據(jù)集的正負(fù)樣本平衡,該方式會耗費大量的人力且難以保證檢測結(jié)果的正確性。因此,下一步將基于生成式對抗神經(jīng)網(wǎng)絡(luò)對代碼壞味進(jìn)行檢測,以解決數(shù)據(jù)集正負(fù)樣本不平衡的問題。