蘇珊,張楊,張冬雯
基于深度學(xué)習(xí)的耦合度相關(guān)代碼壞味檢測(cè)方法
蘇珊,張楊*,張冬雯
(河北科技大學(xué) 信息科學(xué)與工程學(xué)院,石家莊 050018)(*通信作者電子郵箱uzhangyang@foxmail.com)
基于啟發(fā)式和機(jī)器學(xué)習(xí)的代碼壞味檢測(cè)方法已被證明具有一定的局限性,且現(xiàn)有的檢測(cè)方法大多集中在較為常見的代碼壞味上。針對(duì)這些問題,提出了一種深度學(xué)習(xí)方法來檢測(cè)過緊的耦合、分散的耦合和散彈式修改這三種與耦合度相關(guān)檢測(cè)較為少見的代碼壞味。首先,提取三種代碼壞味需要的度量并對(duì)得到的數(shù)據(jù)進(jìn)行處理;之后,構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)(CNN)與注意力(Attention)機(jī)制相結(jié)合的深度學(xué)習(xí)模型,引入的注意力機(jī)制可以對(duì)輸入的度量特征進(jìn)行權(quán)重的分配。從21個(gè)開源項(xiàng)目中提取數(shù)據(jù)集,在10個(gè)開源項(xiàng)目中對(duì)檢測(cè)方法進(jìn)行了驗(yàn)證,并與CNN模型進(jìn)行對(duì)比。實(shí)驗(yàn)結(jié)果表明:過緊的耦合和分散的耦合在所提模型中取得了更好的結(jié)果,相應(yīng)代碼壞味的查準(zhǔn)率分別達(dá)到了93.61%和99.76%;而散彈式修改在CNN模型中有更好的結(jié)果,相應(yīng)代碼壞味查準(zhǔn)率達(dá)到了98.59%。
代碼壞味;耦合;深度學(xué)習(xí);卷積神經(jīng)網(wǎng)絡(luò);注意力機(jī)制
隨著產(chǎn)品功能的不斷變更,開發(fā)人員需要不斷更新軟件源代碼以適應(yīng)新的需求,代碼在長(zhǎng)期的增加和修改中通常會(huì)變得更加復(fù)雜,容易偏離最初的設(shè)計(jì),從而導(dǎo)致軟件的質(zhì)量降低。軟件重構(gòu)是提高軟件質(zhì)量的有效手段,它重組軟件應(yīng)用程序的內(nèi)部結(jié)構(gòu),同時(shí)不改變它的外部行為[1]。重構(gòu)過程主要由三個(gè)步驟組成:1)確定軟件應(yīng)該重構(gòu)的地方;2)確定哪些重構(gòu)應(yīng)該應(yīng)用于已識(shí)別的位置;3)評(píng)估重構(gòu)對(duì)軟件質(zhì)量特征的影響[1]。Kent Beck在識(shí)別軟件應(yīng)該在哪里重構(gòu)時(shí)創(chuàng)造了“代碼味道”這個(gè)術(shù)語[2],他認(rèn)為,難聞的氣味是“代碼中暗示重構(gòu)可能性的結(jié)構(gòu)”,具有這種癥狀的軟件系統(tǒng)很容易隨著時(shí)間的推移而產(chǎn)生錯(cuò)誤,因此會(huì)導(dǎo)致麻煩和昂貴的維護(hù)過程[3]。
在早期階段檢測(cè)代碼壞味可以使重構(gòu)在成本和時(shí)間方面更加經(jīng)濟(jì),因此,研究人員提出了許多種不同的技術(shù)來檢測(cè)代碼壞味。Yoshida等[4]提出了一種基于內(nèi)聚度量的方法來識(shí)別長(zhǎng)方法;Palomba等[5]通過挖掘源代碼的歷史版本來識(shí)別特征嫉妒;Sales等[6]提出了一種基于依賴的方法(稱為JMove)來識(shí)別特征嫉妒。然而,不同的研究人員對(duì)代碼壞味的定義存在不同的認(rèn)識(shí),這就導(dǎo)致了在解釋或?qū)z測(cè)結(jié)果進(jìn)行對(duì)比時(shí)會(huì)存在很大困難[7]。在這種情況下,使用機(jī)器學(xué)習(xí)技術(shù)被認(rèn)為是處理這種缺乏共識(shí)的一種合適方法。Maiga等[8]引入支持向量機(jī)機(jī)制檢測(cè)代碼壞味;Kreimer[9]提出了一種基于決策樹的檢測(cè)方法檢測(cè)長(zhǎng)方法和上帝類;Fontana等[10]對(duì)數(shù)據(jù)類、上帝類、特征嫉妒和長(zhǎng)方法四種代碼壞味進(jìn)行了16種機(jī)器學(xué)習(xí)算法的實(shí)驗(yàn)。然而,有實(shí)證研究表明,這種基于機(jī)器學(xué)習(xí)的代碼壞味檢測(cè)方法具有一定的局限性[11],值得進(jìn)一步研究。
最近,深度學(xué)習(xí)已經(jīng)廣泛地應(yīng)用到包括文本處理在內(nèi)的許多研究領(lǐng)域。深度學(xué)習(xí)算法不同于建立在淺層結(jié)構(gòu)上的傳統(tǒng)機(jī)器學(xué)習(xí),它可以對(duì)數(shù)據(jù)進(jìn)行從低到高多層抽象[12]。深度神經(jīng)網(wǎng)絡(luò)已被證明能夠很好地選擇有用的特征,并自動(dòng)建立從輸入到輸出的復(fù)雜映射。Guo等[13]提出了一種基于深度學(xué)習(xí)的方法,該方法結(jié)合了方法表征和卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network, CNN)模型來檢測(cè)特征嫉妒,可以自動(dòng)地從文本代碼和代碼度量中提取語義和特征,并且還可以自動(dòng)地在這些特征和預(yù)測(cè)值之間建立復(fù)雜的映射;卜依凡等[14]提出了一種深度學(xué)習(xí)檢測(cè)方法,該方法不僅利用了常見的軟件度量,還充分利用了代碼中的文本信息,意圖通過挖掘文本語義揭示每個(gè)類所承擔(dān)的主要角色。
雖然現(xiàn)有的檢測(cè)技術(shù)得到了很大的提升,但目前的工作仍存在一定問題:首先,現(xiàn)有的工作主要集中在那些流行的代碼壞味,如特性嫉妒、上帝類和長(zhǎng)方法,很少有工作進(jìn)行耦合度相關(guān)的代碼壞味檢測(cè);其次,據(jù)我們所知,還沒有公共數(shù)據(jù)集用來檢測(cè)與耦合度相關(guān)的代碼壞味。
過緊的耦合、分散的耦合和散彈式修改是代碼編寫中三種典型的耦合錯(cuò)誤,我們?cè)?1個(gè)開源項(xiàng)目中提取了這三種代碼壞味的數(shù)據(jù)集,通過搭建由一維卷積層組成的CNN并引入注意力(Attention)機(jī)制來創(chuàng)建代碼壞味度量特征和預(yù)測(cè)值之間復(fù)雜的映射,形成的代碼壞味檢測(cè)分類器在10個(gè)開源程序上進(jìn)行了驗(yàn)證。實(shí)驗(yàn)結(jié)果表明,過緊的耦合和分散的耦合在本文所提模型中有更好的結(jié)果,散彈式修改在CNN模型中有更好的結(jié)果。
本文的主要工作如下:
1)現(xiàn)有的檢測(cè)過緊的耦合、分散的耦合和散彈式修改這三種代碼壞味的工作并不多,而且集中在利用啟發(fā)式方法進(jìn)行檢測(cè),但啟發(fā)式方法存在一定的局限性,因此本文提出CNN和Attention機(jī)制相結(jié)合的深度學(xué)習(xí)方法,以自動(dòng)提取數(shù)據(jù)特征并對(duì)輸入特征進(jìn)行權(quán)值分配。據(jù)我們所知,這是首次利用深度學(xué)習(xí)技術(shù)檢測(cè)過緊的耦合、分散的耦合和散彈式修改這三種代碼壞味。
2)現(xiàn)有的代碼壞味數(shù)據(jù)集大多集中在較為流行的代碼壞味,還未有公開數(shù)據(jù)集用于檢測(cè)本文提出的過緊的耦合、分散的耦合和散彈式修改這三種代碼壞味,為此本文構(gòu)建了檢測(cè)這三種代碼壞味的數(shù)據(jù)集。
3)現(xiàn)有檢測(cè)代碼壞味的方法在呈現(xiàn)結(jié)果時(shí)都呈現(xiàn)的是整體的準(zhǔn)確率,然而測(cè)試集數(shù)據(jù)不均衡容易出現(xiàn)含有代碼壞味方法的準(zhǔn)確率低、不含代碼壞味方法的準(zhǔn)確率高從而整體準(zhǔn)確率高的情況,本文在呈現(xiàn)結(jié)果時(shí)分別呈現(xiàn)的是含有代碼壞味方法和不含代碼壞味方法的檢測(cè)準(zhǔn)確率,以避免對(duì)模型高準(zhǔn)確率的誤判。本文所提出的代碼壞味檢測(cè)方法能取得較高的準(zhǔn)確率,過緊的耦合和分散的耦合在本文模型中有較好的結(jié)果。
現(xiàn)在已經(jīng)有一些在過緊的耦合、分散的耦合和散彈式修改這三種代碼壞味檢測(cè)方面的工作。Kessentini等[15]使用并行進(jìn)化算法檢測(cè)散彈式修改等代碼壞味,他們將代碼壞味的檢測(cè)視為一個(gè)分布式優(yōu)化問題,在優(yōu)化過程中并行組合不同的方法,以找到關(guān)于代碼壞味檢測(cè)的共識(shí);Fu等[16]利用關(guān)聯(lián)規(guī)則從軟件系統(tǒng)的變化歷史中挖掘數(shù)據(jù),在此基礎(chǔ)上定義啟發(fā)式算法來檢測(cè)散彈式修改等三種代碼壞味,在五個(gè)開源項(xiàng)目上的實(shí)驗(yàn)結(jié)果表明該方法具有較高的查準(zhǔn)率和查全率;Vidal等[17]根據(jù)Lanza和Marinescu提出的檢測(cè)策略開發(fā)了檢測(cè)工具JSpIRIT,該工具可以用來檢測(cè)過緊的耦合、分散的耦合、散彈式修改等代碼壞味;Palomba等[5]提出了一種檢測(cè)方法HIST,該方法通過從版本系統(tǒng)中挖掘變化的歷史信息,特別是通過分析源代碼之間發(fā)生的共同變化來檢測(cè)散彈式修改等代碼壞味。
現(xiàn)有的檢測(cè)過緊的耦合、分散的耦合和散彈式修改這三種代碼壞味的研究還不廣泛,對(duì)這三種代碼壞味的檢測(cè)方法大多是基于啟發(fā)式的代碼壞味檢測(cè)技術(shù)。有一些基于啟發(fā)式的方法如JSpIRIT[17]是依賴于度量的,然而不同工具使用檢測(cè)代碼壞味的度量可以不同;此外,即使度量是相同的,度量的閾值也會(huì)改變,通過改變這些值,檢測(cè)到的壞味數(shù)量可以相應(yīng)地增加或減少[10]。還有一些檢測(cè)工具依賴于與代碼結(jié)構(gòu)和命名相關(guān)的其他規(guī)則,例如HIST[5]檢測(cè)方法通過挖掘版本歷史信息進(jìn)行代碼壞味的檢測(cè)。這些基于啟發(fā)式的方法必須人工指定且有可能相當(dāng)復(fù)雜。
深度學(xué)習(xí)技術(shù)也已經(jīng)被用來檢測(cè)代碼壞味,這種技術(shù)可以在一定程度上避免代碼壞味的主觀認(rèn)識(shí)造成的影響。Hadj-Kacem等[18]提出了一種基于自動(dòng)編碼器和人工神經(jīng)網(wǎng)絡(luò)的混合檢測(cè)方法檢測(cè)了特征嫉妒等代碼壞味。在第一階段,使用深度自動(dòng)編碼器對(duì)輸入特征空間進(jìn)行降維,提取最相關(guān)的特征;第二階段選擇構(gòu)建人工神經(jīng)網(wǎng)絡(luò)來構(gòu)建代碼壞味分類器。Kim[19]利用CNN構(gòu)建代碼壞味與面向?qū)ο蠖攘恐g的關(guān)系,并通過改變迭代次數(shù)和隱層數(shù)量進(jìn)行實(shí)驗(yàn),檢測(cè)了上帝類等六個(gè)常見的代碼壞味,均取得了較好的檢測(cè)結(jié)果。Das等[20]構(gòu)建了CNN來檢測(cè)大腦類和大腦方法,并通過調(diào)整測(cè)試的項(xiàng)目數(shù)量來展示實(shí)驗(yàn)結(jié)果,實(shí)驗(yàn)結(jié)果表明該方法能較好地檢測(cè)出代碼壞味。這些采用深度學(xué)習(xí)檢測(cè)代碼壞味的方法都取得了較好的檢測(cè)結(jié)果,說明利用深度學(xué)習(xí)算法檢測(cè)代碼壞味是可行且有優(yōu)勢(shì)的。
本文提出了基于深度學(xué)習(xí)的代碼壞味檢測(cè)方法,該方法是依賴于度量的,通過深度學(xué)習(xí)技術(shù)可以自動(dòng)建立起度量和標(biāo)簽的復(fù)雜映射。
根據(jù)代碼壞味的范圍,代碼壞味可以分為三類:應(yīng)用程序級(jí)、類級(jí)和方法級(jí)。耦合是指程序中模塊及模塊之間信息或參數(shù)依賴的程度,是影響軟件復(fù)雜程度和設(shè)計(jì)質(zhì)量的一個(gè)重要因素。本文將重點(diǎn)檢測(cè)方法層面上三種與耦合度相關(guān)的代碼壞味,分別為過緊的耦合、分散的耦合和散彈式修改,這是三種典型的耦合錯(cuò)誤。
1)過緊的耦合。過緊的耦合是指某個(gè)方法和少數(shù)幾個(gè)類中的很多方法相關(guān)聯(lián)時(shí)出現(xiàn)的一種代碼結(jié)構(gòu)缺陷[21]。在這種情況下,該方法與這幾個(gè)類之間的關(guān)系將變得不夠明確。
2)分散的耦合。分散的耦合是和過緊的耦合具有相反特征的一種代碼壞味。在這種情況下,某個(gè)方法與其他很多類中的方法有著不是很密集的聯(lián)系[21]。分散的耦合會(huì)導(dǎo)致漣漪效應(yīng),分散在各個(gè)類中方法的變化潛在地影響了與其相耦合的方法。
3)散彈式修改。與過緊的耦合和分散的耦合相比,散彈式修改重點(diǎn)關(guān)注函數(shù)調(diào)用引起的傳入依賴。散彈式修改指的是某個(gè)方法被很多其他類中的方法調(diào)用[21],這種設(shè)計(jì)的不協(xié)調(diào)意味著如果在這樣的方法中發(fā)生了更改,可能還需要更改與其相關(guān)聯(lián)的其他大量方法,從而導(dǎo)致維護(hù)問題。
圖1顯示了檢測(cè)代碼壞味的總體工作流程。首先從Github中收集了21個(gè)開源項(xiàng)目,再將這些項(xiàng)目輸入度量分析工具以生成所需度量,根據(jù)各個(gè)代碼壞味的度量檢測(cè)規(guī)則對(duì)項(xiàng)目中的方法進(jìn)行標(biāo)記;之后將標(biāo)記好的數(shù)據(jù)即訓(xùn)練數(shù)據(jù)集輸入神經(jīng)網(wǎng)絡(luò)模型進(jìn)行訓(xùn)練和優(yōu)化,訓(xùn)練好的模型最后由代碼壞味的測(cè)試數(shù)據(jù)集進(jìn)行評(píng)估。
圖1 代碼壞味檢測(cè)框架
使用代碼分析工具iPlasma分析下載的Java項(xiàng)目。iPlasma是一個(gè)面向?qū)ο筌浖|(zhì)量分析的工具,該工具包含80多個(gè)最先進(jìn)和新穎的設(shè)計(jì)指標(biāo)庫,可以應(yīng)用于不同的抽象層次。使用該工具提取了項(xiàng)目中檢測(cè)三種代碼壞味所需要的5種度量,分別為CINT、CDISP、MAXNESTING、CC和CM,三種代碼壞味需要提取的度量及定義如表1所示。
表1 代碼壞味度量
根據(jù)Lanza等[21]工作中檢測(cè)各個(gè)代碼壞味的規(guī)則,對(duì)提取的度量數(shù)據(jù)進(jìn)行標(biāo)記,含有代碼壞味的標(biāo)記為1,不含有代碼壞味的標(biāo)記為0。
判斷過緊的耦合、分散的耦合和散彈式修改的公式如式(1)~(3)[21]所示,本文將用它們對(duì)這三種代碼壞味進(jìn)行標(biāo)記:
利用深度學(xué)習(xí)檢測(cè)代碼壞味面臨的挑戰(zhàn)之一是是否能夠收集到大量標(biāo)記的樣本來訓(xùn)練分類器。由于在程序中含有代碼壞味的方法是少數(shù),這就導(dǎo)致數(shù)據(jù)集中含有代碼壞味的方法數(shù)量遠(yuǎn)遠(yuǎn)小于不含代碼壞味方法的數(shù)量,為了避免數(shù)據(jù)不均衡對(duì)深度模型準(zhǔn)確率造成的影響,分別采用了欠采樣和過采樣方法。
在21個(gè)項(xiàng)目中一共提取了165 830條數(shù)據(jù),首先采用欠采樣方法從中去掉了大量標(biāo)記為0的數(shù)據(jù),但此時(shí)數(shù)據(jù)集中仍存在數(shù)據(jù)不均衡的情況。為了改善這種情況,使用SMOTE算法[22]對(duì)數(shù)據(jù)進(jìn)行了增強(qiáng),SMOTE算法的基本思想就是對(duì)少數(shù)類別樣本進(jìn)行分析和模擬,并將人工模擬的新樣本添加到數(shù)據(jù)集中,進(jìn)而使原始數(shù)據(jù)中的類別不再嚴(yán)重失衡。經(jīng)過SMOTE算法增強(qiáng)的數(shù)據(jù)集,標(biāo)記為1和0的比例達(dá)到了1∶1。
本文采用CNN和注意力機(jī)制相結(jié)合的模型(Attention-CNN)來檢測(cè)代碼壞味,如圖2所示。
圖2 Attention-CNN模型
CNN主要包括輸入層、隱藏層和輸出層。數(shù)據(jù)通過輸入層進(jìn)入隱藏層;隱藏層中含有單個(gè)或多個(gè)卷積層,它根據(jù)指定數(shù)目的濾波器和激活函數(shù)執(zhí)行卷積運(yùn)算;最后的輸出層負(fù)責(zé)提供預(yù)測(cè)結(jié)果。
注意力機(jī)制是一種資源分配機(jī)制,可以通過對(duì)輸入特征賦予不同的權(quán)重來突出更加重要信息的影響[23]。本文在模型中加入了注意力機(jī)制對(duì)輸入的度量特征進(jìn)行權(quán)重分配。
模型中各層的描述如下:
1)輸入層。輸入層將代碼壞味的度量特征數(shù)據(jù)作為輸入,如式(4):
數(shù)據(jù)集所使用的項(xiàng)目是從GitHub項(xiàng)目中挑選出來的,共包括21個(gè)項(xiàng)目,如表2所示,其中:NOC為類的數(shù)量,NOM為方法的數(shù)量,LOC為代碼行數(shù)。在構(gòu)造數(shù)據(jù)集時(shí)選擇了不同領(lǐng)域的項(xiàng)目,這樣可以消除相同領(lǐng)域項(xiàng)目可能帶來的特定代碼風(fēng)格的影響,以保證訓(xùn)練樣本的綜合性;除此之外,這些樣本都是知名的開源項(xiàng)目,代碼質(zhì)量較高,在獲取樣本時(shí)可以獲得更為準(zhǔn)確的標(biāo)簽樣本[14]。
利用3.1節(jié)方法先從表2的項(xiàng)目中提取5種度量特征;再根據(jù)3.2節(jié)方法對(duì)提取的特征進(jìn)行標(biāo)記;針對(duì)提取數(shù)據(jù)不均衡的情況,以3.3節(jié)介紹的方法進(jìn)行過采樣和欠采樣處理。最終形成的代碼壞味的訓(xùn)練數(shù)據(jù)集形式如表3所示,訓(xùn)練數(shù)據(jù)集共8 001條。表3中最后一列標(biāo)簽1表示為該方法存在此代碼壞味,標(biāo)簽0表示該方法不存在此代碼壞味。
選取10個(gè)新的程序用于生成測(cè)試數(shù)據(jù)集,測(cè)試集使用的程序如表4所示,測(cè)試集共89 455條。
首先以4.1節(jié)方法構(gòu)建出訓(xùn)練數(shù)據(jù)集。將數(shù)據(jù)集輸入Attention-CNN模型中,本文所構(gòu)建的模型代碼是基于Keras實(shí)現(xiàn)的,在模型優(yōu)化階段,以交叉熵作為損失函數(shù),并選擇自適應(yīng)學(xué)習(xí)率的Adam作為優(yōu)化算法。隨后,模型在訓(xùn)練集上進(jìn)行多輪訓(xùn)練,將迭代次數(shù)設(shè)置為100,批尺寸設(shè)置為64,經(jīng)過訓(xùn)練,可以得到一個(gè)以軟件度量值為輸入的分類器。
表2 訓(xùn)練集所涉項(xiàng)目
表3 過緊的耦合訓(xùn)練數(shù)據(jù)集
表4 測(cè)試集所涉項(xiàng)目
以4.2節(jié)所述方式生成測(cè)試數(shù)據(jù)集。將測(cè)試數(shù)據(jù)集輸入到已訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)分類器后,得到的輸出集合即為神經(jīng)網(wǎng)絡(luò)分類器在此測(cè)試集上的預(yù)測(cè)結(jié)果。
現(xiàn)有的利用深度學(xué)習(xí)檢測(cè)代碼壞味的方法如Kim[19]提出的構(gòu)建深度學(xué)習(xí)模型來建立代碼壞味與面向?qū)ο蠖攘恐g的關(guān)系是基于CNN模型的,2019年Das等[20]提出利用CNN模型構(gòu)建代碼度量特征和預(yù)測(cè)值之間復(fù)雜的映射,在依賴度量特征信息來構(gòu)建深度學(xué)習(xí)模型的工作中,很多工作用到了CNN模型,所以本文將CNN模型作為對(duì)比模型。
三種代碼壞味的檢測(cè)結(jié)果如表5~7所示。因?yàn)橐粋€(gè)開源項(xiàng)目中存在代碼壞味的方法是少數(shù),即在測(cè)試集中標(biāo)簽為0的數(shù)量遠(yuǎn)遠(yuǎn)大于標(biāo)簽為1的數(shù)量。為了避免出現(xiàn)對(duì)標(biāo)簽1的預(yù)測(cè)結(jié)果不夠高,但對(duì)標(biāo)簽0的預(yù)測(cè)結(jié)果很高,從而導(dǎo)致整體預(yù)測(cè)結(jié)果較高的情況,選擇分別顯示對(duì)標(biāo)簽1和標(biāo)簽0的預(yù)測(cè)結(jié)果來展示本文所構(gòu)建模型的性能。
表5 過緊的耦合檢測(cè)結(jié)果 單位: %
表6 分散的耦合檢測(cè)結(jié)果 單位: %
表7 散彈式修改檢測(cè)結(jié)果 單位: %
由表8可知Attention-CNN的模型相較于CNN模型由于增加了模型復(fù)雜度,所以時(shí)間開銷有所增大,但是增幅并不大,過緊的耦合和分散的耦合在Attention-CNN模型上有更好的結(jié)果,在檢測(cè)這兩個(gè)代碼壞味時(shí)犧牲小部分時(shí)間開銷來增加準(zhǔn)確率是值得的。
表8 三種代碼壞味的時(shí)間開銷 單位: s
對(duì)實(shí)驗(yàn)過程中威脅有效性的幾個(gè)因素討論如下:
1)項(xiàng)目中具有代碼壞味的方法是少數(shù),這會(huì)導(dǎo)致提取的訓(xùn)練集中容易出現(xiàn)數(shù)據(jù)不均衡的情況。為了減少這一威脅,采用了欠采樣和過采樣技術(shù),去掉了大量標(biāo)簽為0的數(shù)據(jù),并使用SMOTE(Synthetic Minority Oversampling Technique)生成了一部分標(biāo)簽為1的數(shù)據(jù)。
2)實(shí)驗(yàn)數(shù)據(jù)集中僅包含10個(gè)開源項(xiàng)目,本文所得出的結(jié)論有可能不適用于其他項(xiàng)目。為了減少這一威脅,實(shí)驗(yàn)選擇的訓(xùn)練及測(cè)試項(xiàng)目均出自不同的研究領(lǐng)域及開發(fā)人員,以期減少某些項(xiàng)目間的特定特征對(duì)驗(yàn)證結(jié)果造成的影響。
3)測(cè)試集中標(biāo)簽0的數(shù)量遠(yuǎn)遠(yuǎn)多于標(biāo)簽1的數(shù)量,在這種情況下,模型對(duì)標(biāo)簽0的預(yù)測(cè)結(jié)果通常很高,這就導(dǎo)致模型所體現(xiàn)的高預(yù)測(cè)率可能僅僅體現(xiàn)在對(duì)標(biāo)簽0的預(yù)測(cè)上。為減少這一威脅,選擇分別討論對(duì)標(biāo)簽1和標(biāo)簽0的預(yù)測(cè)結(jié)果來展示本文所構(gòu)建模型的性能。
本文提出了一種基于深度學(xué)習(xí)的代碼壞味檢測(cè)方法來檢測(cè)與耦合度相關(guān)的三種代碼壞味。從21個(gè)開源項(xiàng)目中提取訓(xùn)練樣本,對(duì)這些樣本進(jìn)行度量信息提取和標(biāo)記后將其輸入神經(jīng)網(wǎng)絡(luò)模型進(jìn)行訓(xùn)練,最后在開源項(xiàng)目上對(duì)所生成的網(wǎng)絡(luò)模型進(jìn)行了測(cè)試。實(shí)驗(yàn)結(jié)果表明,本文提出的深度學(xué)習(xí)方法具有較高的預(yù)測(cè)精度。未來我們將把代碼更多層次的特征融合在檢測(cè)方法里,不僅關(guān)注代碼的度量特征,還將關(guān)注代碼的語義和歷史信息等特征,在更準(zhǔn)確的檢測(cè)代碼壞味方面作出更大的努力。
[1] MENS T, TOURWE T. A survey of software refactoring[J]. IEEE Transactions on Software Engineering, 2004, 30(2): 126-139.
[2] FOWLER M, BECK K, BRANT J, et al. Refactoring: Improving the Design of Existing Code[M]. Boston: Addison-Wesley Professional, 1999: 71-76.
[3] APRIL A, ABRAN A. Software Maintenance Management: Evaluation and Continuous Improvement [M]. Hoboken: John Wiley & Sons, 2012: 1-5.
[4] YOSHIDA N, KINOSHITA M, IIDA H. A cohesion metric approach to dividing source code into functional segments to improve maintainability[C]// Proceedings of the 16th European Conference on Software Maintenance and Reengineering. Piscataway: IEEE, 2012: 365-370.
[5] PALOMBA F, BAVOTA G, DI PENTA M, et al. Mining version histories for detecting code smells[J]. IEEE Transactions on Software Engineering, 2015, 41(5): 462-489.
[6] SALES V, TERRA R, MIRANDA L F, et al. Recommending move method refactorings using dependency sets[C]// Proceedings of the 20th Working Conference on Reverse Engineering. Piscataway: IEEE, 2013: 232-241.
[7] M?NTYL? M V, LASSENIUS C. Subjective evaluation of software evolvability using code smells: an empirical study[J]. Empirical Software Engineering, 2006, 11(3): 395-431.
[8] MAIGA A, ALI N, BHATTACHARYA N, et al. Support vector machines for anti-pattern detection[C]// Proceedings of the 27th IEEE/ACM International Conference on Automated Software Engineering. Piscataway: IEEE, 2012: 278-281.
[9] KREIMER J. Adaptive detection of design flaws[J]. Electronic Notes in Theoretical Computer Science, 2005, 141(4): 117-136.
[10] FONTANA F A, M?NTYL? 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] DI NUCCI D, PALOMBA F, TAMBURRI D A, et al. Detecting code smells using machine learning techniques: are we there yet?[C]// Proceedings of the 2018 IEEE 25th International Conference on Software Analysis, Evolution and Reengineering. Piscataway: IEEE, 2018: 612-621.
[12] BENGIO Y, COURVILLE A, VINCENT P. Representation learning: a review and new perspectives[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2013, 35(8): 1798-1828.
[13] GUO X L, SHI C Y, JIANG H. Deep semantic-based feature envy identification[C]// Proceedings of the 11th Asia-Pacific Symposium on Internetware. New York: ACM, 2019: No.19.
[14] 卜依凡,劉輝,李光杰. 一種基于深度學(xué)習(xí)的上帝類檢測(cè)方法[J]. 軟件學(xué)報(bào), 2019, 30(5): 1360-1374.(BU Y F, LIU H, LI G J. God class detection approach based on deep learning[J]. Journal of Software, 2019, 30(5): 1360-1374.)
[15] KESSENTINI W, KESSENTINI M, SAHRAOUI H, et al. A cooperative parallel search-based software engineering approach for code-smells detection[J]. IEEE Transactions on Software Engineering, 2014, 40(9): 841-861.
[16] FU S Z, SHEN B J. Code bad smell detection through evolutionary data mining[C]// Proceedings of the 2015 ACM/IEEE International Symposium on Empirical Software Engineering and Measurement. Piscataway: IEEE, 2015: 1-9.
[17] VIDAL S, VAZQUEZ H, DIAZ-PACE J A, et al. JSpIRIT: a flexible tool for the analysis of code smells[C]// Proceedings of the 34th International Conference of the Chilean Computer Science Society. Piscataway: IEEE, 2015: 1-6.
[18] HADJ-KACEM M, BOUASSIDA N. A hybrid approach to detect code smells using deep learning[C]// Proceedings of the 13th International Conference on Evaluation of Novel Approaches to Software Engineering. Setúbal: SciTePress, 2018:137-146.
[19] KIM D K. Finding bad code smells with neural network models[J]. International Journal of Electrical and Computer Engineering, 2017, 7(6): 3613-3621.
[20] DAS A K, YADAV S, DHAL S. Detecting code smells using deep learning[C]// Proceedings of the 2019 IEEE Region 10 Conference. Piscataway: IEEE, 2019: 2081-2086.
[21] LANZA M, MARINESCU R. Object-Oriented Metrics in Practice: Using Software Metrics to Characterize, Evaluate, and Improve the Design of Object-Oriented Systems[M]. Berlin: Springer, 2006: 115-167.
[22] CHAWLA N V, BOWYER K W, HALL L O, et al. SMOTE: synthetic minority over-sampling technique[J]. Journal of Artificial Intelligence Research, 2002, 16: 321-357.
[23] BAHDANAU D, CHO K, BENGIO Y. Neural machine translation by jointly learning to align and translate [EB/OL]. [2020-12-08]. http://de.arxiv.org/pdf/1409.0473.
Coupling related code smell detection method based on deep learning
SU Shan, ZHANG Yang*, ZHANG Dongwen
(,,050018,)
Heuristic and machine learning based code smell detection methods have been proved to have limitations, and most of these methods focus on the common code smells. In order to solve these problems, a deep learning based method was proposed to detect three relatively rare code smells which are related to coupling, those are Intensive Coupling, Dispersed Coupling and Shotgun Surgery. First, the metrics of three code smells were extracted, and the obtained data were processed. Second, a deep learning model combining Convolutional Neural Network (CNN) and attention mechanism was constructed, and the introduced attention mechanism was able to assign weights to the metric features. The datasets were extracted from 21 open source projects, and the detection methods were validated in 10 open source projects and compared with CNN model. Experimental results show that the proposed model achieves the better performance with the code smell precisions of 93.61% and 99.76% for Intensive Coupling and Dispersed Coupling respectively, and the CNN model achieves the better results with the code smell precision of 98.59% for Shotgun Surgery.
code smell; coupling; deep learning; Convolutional Neural Network (CNN); attention mechanism
This work is partially supported by National Natural Science Foundation of China (61440012), Key Basic Research Project of Hebei Fundamental Research Plan (18960106D).
SU Shan, born in 1995, M. S. candidate. Her research interests include software refactoring.
ZHANG Yang, born in 1980, Ph. D., associate professor. His research interests include intelligent software, software refactoring.
ZHANG Dongwen, born in 1964, Ph. D., professor. Her research interests include intelligent software, software refactoring.
TP311
A
1001-9081(2022)06-1702-06
10.11772/j.issn.1001-9081.2021061403
2021?08?05;
2021?09?08;
2021?10?20。
國(guó)家自然科學(xué)基金資助項(xiàng)目(61440012);河北省基礎(chǔ)研究計(jì)劃重點(diǎn)基礎(chǔ)專項(xiàng)(18960106D)。
蘇珊(1995—),女,河北石家莊人,碩士研究生,主要研究方向:軟件重構(gòu);張楊(1980—),男,河北秦皇島人,副教授,博士,CCF高級(jí)會(huì)員,主要研究方向:智能軟件、軟件重構(gòu);張冬雯(1964—),女,河北石家莊人,教授,博士,CCF 會(huì)員,主要研究方向:智能軟件、軟件重構(gòu)。