蘇珊,張楊,張冬雯
基于深度學(xué)習(xí)的耦合度相關(guān)代碼壞味檢測方法
蘇珊,張楊*,張冬雯
(河北科技大學(xué) 信息科學(xué)與工程學(xué)院,石家莊 050018)(*通信作者電子郵箱uzhangyang@foxmail.com)
基于啟發(fā)式和機(jī)器學(xué)習(xí)的代碼壞味檢測方法已被證明具有一定的局限性,且現(xiàn)有的檢測方法大多集中在較為常見的代碼壞味上。針對這些問題,提出了一種深度學(xué)習(xí)方法來檢測過緊的耦合、分散的耦合和散彈式修改這三種與耦合度相關(guān)檢測較為少見的代碼壞味。首先,提取三種代碼壞味需要的度量并對得到的數(shù)據(jù)進(jìn)行處理;之后,構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)(CNN)與注意力(Attention)機(jī)制相結(jié)合的深度學(xué)習(xí)模型,引入的注意力機(jī)制可以對輸入的度量特征進(jìn)行權(quán)重的分配。從21個開源項目中提取數(shù)據(jù)集,在10個開源項目中對檢測方法進(jìn)行了驗證,并與CNN模型進(jì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)新的需求,代碼在長期的增加和修改中通常會變得更加復(fù)雜,容易偏離最初的設(shè)計,從而導(dǎo)致軟件的質(zhì)量降低。軟件重構(gòu)是提高軟件質(zhì)量的有效手段,它重組軟件應(yīng)用程序的內(nèi)部結(jié)構(gòu),同時不改變它的外部行為[1]。重構(gòu)過程主要由三個步驟組成:1)確定軟件應(yīng)該重構(gòu)的地方;2)確定哪些重構(gòu)應(yīng)該應(yīng)用于已識別的位置;3)評估重構(gòu)對軟件質(zhì)量特征的影響[1]。Kent Beck在識別軟件應(yīng)該在哪里重構(gòu)時創(chuàng)造了“代碼味道”這個術(shù)語[2],他認(rèn)為,難聞的氣味是“代碼中暗示重構(gòu)可能性的結(jié)構(gòu)”,具有這種癥狀的軟件系統(tǒng)很容易隨著時間的推移而產(chǎn)生錯誤,因此會導(dǎo)致麻煩和昂貴的維護(hù)過程[3]。
在早期階段檢測代碼壞味可以使重構(gòu)在成本和時間方面更加經(jīng)濟(jì),因此,研究人員提出了許多種不同的技術(shù)來檢測代碼壞味。Yoshida等[4]提出了一種基于內(nèi)聚度量的方法來識別長方法;Palomba等[5]通過挖掘源代碼的歷史版本來識別特征嫉妒;Sales等[6]提出了一種基于依賴的方法(稱為JMove)來識別特征嫉妒。然而,不同的研究人員對代碼壞味的定義存在不同的認(rèn)識,這就導(dǎo)致了在解釋或?qū)z測結(jié)果進(jìn)行對比時會存在很大困難[7]。在這種情況下,使用機(jī)器學(xué)習(xí)技術(shù)被認(rèn)為是處理這種缺乏共識的一種合適方法。Maiga等[8]引入支持向量機(jī)機(jī)制檢測代碼壞味;Kreimer[9]提出了一種基于決策樹的檢測方法檢測長方法和上帝類;Fontana等[10]對數(shù)據(jù)類、上帝類、特征嫉妒和長方法四種代碼壞味進(jìn)行了16種機(jī)器學(xué)習(xí)算法的實驗。然而,有實證研究表明,這種基于機(jī)器學(xué)習(xí)的代碼壞味檢測方法具有一定的局限性[11],值得進(jìn)一步研究。
最近,深度學(xué)習(xí)已經(jīng)廣泛地應(yīng)用到包括文本處理在內(nèi)的許多研究領(lǐng)域。深度學(xué)習(xí)算法不同于建立在淺層結(jié)構(gòu)上的傳統(tǒng)機(jī)器學(xué)習(xí),它可以對數(shù)據(jù)進(jìn)行從低到高多層抽象[12]。深度神經(jīng)網(wǎng)絡(luò)已被證明能夠很好地選擇有用的特征,并自動建立從輸入到輸出的復(fù)雜映射。Guo等[13]提出了一種基于深度學(xué)習(xí)的方法,該方法結(jié)合了方法表征和卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network, CNN)模型來檢測特征嫉妒,可以自動地從文本代碼和代碼度量中提取語義和特征,并且還可以自動地在這些特征和預(yù)測值之間建立復(fù)雜的映射;卜依凡等[14]提出了一種深度學(xué)習(xí)檢測方法,該方法不僅利用了常見的軟件度量,還充分利用了代碼中的文本信息,意圖通過挖掘文本語義揭示每個類所承擔(dān)的主要角色。
雖然現(xiàn)有的檢測技術(shù)得到了很大的提升,但目前的工作仍存在一定問題:首先,現(xiàn)有的工作主要集中在那些流行的代碼壞味,如特性嫉妒、上帝類和長方法,很少有工作進(jìn)行耦合度相關(guān)的代碼壞味檢測;其次,據(jù)我們所知,還沒有公共數(shù)據(jù)集用來檢測與耦合度相關(guān)的代碼壞味。
過緊的耦合、分散的耦合和散彈式修改是代碼編寫中三種典型的耦合錯誤,我們在21個開源項目中提取了這三種代碼壞味的數(shù)據(jù)集,通過搭建由一維卷積層組成的CNN并引入注意力(Attention)機(jī)制來創(chuàng)建代碼壞味度量特征和預(yù)測值之間復(fù)雜的映射,形成的代碼壞味檢測分類器在10個開源程序上進(jìn)行了驗證。實驗結(jié)果表明,過緊的耦合和分散的耦合在本文所提模型中有更好的結(jié)果,散彈式修改在CNN模型中有更好的結(jié)果。
本文的主要工作如下:
1)現(xiàn)有的檢測過緊的耦合、分散的耦合和散彈式修改這三種代碼壞味的工作并不多,而且集中在利用啟發(fā)式方法進(jìn)行檢測,但啟發(fā)式方法存在一定的局限性,因此本文提出CNN和Attention機(jī)制相結(jié)合的深度學(xué)習(xí)方法,以自動提取數(shù)據(jù)特征并對輸入特征進(jìn)行權(quán)值分配。據(jù)我們所知,這是首次利用深度學(xué)習(xí)技術(shù)檢測過緊的耦合、分散的耦合和散彈式修改這三種代碼壞味。
2)現(xiàn)有的代碼壞味數(shù)據(jù)集大多集中在較為流行的代碼壞味,還未有公開數(shù)據(jù)集用于檢測本文提出的過緊的耦合、分散的耦合和散彈式修改這三種代碼壞味,為此本文構(gòu)建了檢測這三種代碼壞味的數(shù)據(jù)集。
3)現(xiàn)有檢測代碼壞味的方法在呈現(xiàn)結(jié)果時都呈現(xiàn)的是整體的準(zhǔn)確率,然而測試集數(shù)據(jù)不均衡容易出現(xiàn)含有代碼壞味方法的準(zhǔn)確率低、不含代碼壞味方法的準(zhǔn)確率高從而整體準(zhǔn)確率高的情況,本文在呈現(xiàn)結(jié)果時分別呈現(xiàn)的是含有代碼壞味方法和不含代碼壞味方法的檢測準(zhǔn)確率,以避免對模型高準(zhǔn)確率的誤判。本文所提出的代碼壞味檢測方法能取得較高的準(zhǔn)確率,過緊的耦合和分散的耦合在本文模型中有較好的結(jié)果。
現(xiàn)在已經(jīng)有一些在過緊的耦合、分散的耦合和散彈式修改這三種代碼壞味檢測方面的工作。Kessentini等[15]使用并行進(jìn)化算法檢測散彈式修改等代碼壞味,他們將代碼壞味的檢測視為一個分布式優(yōu)化問題,在優(yōu)化過程中并行組合不同的方法,以找到關(guān)于代碼壞味檢測的共識;Fu等[16]利用關(guān)聯(lián)規(guī)則從軟件系統(tǒng)的變化歷史中挖掘數(shù)據(jù),在此基礎(chǔ)上定義啟發(fā)式算法來檢測散彈式修改等三種代碼壞味,在五個開源項目上的實驗結(jié)果表明該方法具有較高的查準(zhǔn)率和查全率;Vidal等[17]根據(jù)Lanza和Marinescu提出的檢測策略開發(fā)了檢測工具JSpIRIT,該工具可以用來檢測過緊的耦合、分散的耦合、散彈式修改等代碼壞味;Palomba等[5]提出了一種檢測方法HIST,該方法通過從版本系統(tǒng)中挖掘變化的歷史信息,特別是通過分析源代碼之間發(fā)生的共同變化來檢測散彈式修改等代碼壞味。
現(xiàn)有的檢測過緊的耦合、分散的耦合和散彈式修改這三種代碼壞味的研究還不廣泛,對這三種代碼壞味的檢測方法大多是基于啟發(fā)式的代碼壞味檢測技術(shù)。有一些基于啟發(fā)式的方法如JSpIRIT[17]是依賴于度量的,然而不同工具使用檢測代碼壞味的度量可以不同;此外,即使度量是相同的,度量的閾值也會改變,通過改變這些值,檢測到的壞味數(shù)量可以相應(yīng)地增加或減少[10]。還有一些檢測工具依賴于與代碼結(jié)構(gòu)和命名相關(guān)的其他規(guī)則,例如HIST[5]檢測方法通過挖掘版本歷史信息進(jìn)行代碼壞味的檢測。這些基于啟發(fā)式的方法必須人工指定且有可能相當(dāng)復(fù)雜。
深度學(xué)習(xí)技術(shù)也已經(jīng)被用來檢測代碼壞味,這種技術(shù)可以在一定程度上避免代碼壞味的主觀認(rèn)識造成的影響。Hadj-Kacem等[18]提出了一種基于自動編碼器和人工神經(jīng)網(wǎng)絡(luò)的混合檢測方法檢測了特征嫉妒等代碼壞味。在第一階段,使用深度自動編碼器對輸入特征空間進(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)行實驗,檢測了上帝類等六個常見的代碼壞味,均取得了較好的檢測結(jié)果。Das等[20]構(gòu)建了CNN來檢測大腦類和大腦方法,并通過調(diào)整測試的項目數(shù)量來展示實驗結(jié)果,實驗結(jié)果表明該方法能較好地檢測出代碼壞味。這些采用深度學(xué)習(xí)檢測代碼壞味的方法都取得了較好的檢測結(jié)果,說明利用深度學(xué)習(xí)算法檢測代碼壞味是可行且有優(yōu)勢的。
本文提出了基于深度學(xué)習(xí)的代碼壞味檢測方法,該方法是依賴于度量的,通過深度學(xué)習(xí)技術(shù)可以自動建立起度量和標(biāo)簽的復(fù)雜映射。
根據(jù)代碼壞味的范圍,代碼壞味可以分為三類:應(yīng)用程序級、類級和方法級。耦合是指程序中模塊及模塊之間信息或參數(shù)依賴的程度,是影響軟件復(fù)雜程度和設(shè)計質(zhì)量的一個重要因素。本文將重點(diǎn)檢測方法層面上三種與耦合度相關(guān)的代碼壞味,分別為過緊的耦合、分散的耦合和散彈式修改,這是三種典型的耦合錯誤。
1)過緊的耦合。過緊的耦合是指某個方法和少數(shù)幾個類中的很多方法相關(guān)聯(lián)時出現(xiàn)的一種代碼結(jié)構(gòu)缺陷[21]。在這種情況下,該方法與這幾個類之間的關(guān)系將變得不夠明確。
2)分散的耦合。分散的耦合是和過緊的耦合具有相反特征的一種代碼壞味。在這種情況下,某個方法與其他很多類中的方法有著不是很密集的聯(lián)系[21]。分散的耦合會導(dǎo)致漣漪效應(yīng),分散在各個類中方法的變化潛在地影響了與其相耦合的方法。
3)散彈式修改。與過緊的耦合和分散的耦合相比,散彈式修改重點(diǎn)關(guān)注函數(shù)調(diào)用引起的傳入依賴。散彈式修改指的是某個方法被很多其他類中的方法調(diào)用[21],這種設(shè)計的不協(xié)調(diào)意味著如果在這樣的方法中發(fā)生了更改,可能還需要更改與其相關(guān)聯(lián)的其他大量方法,從而導(dǎo)致維護(hù)問題。
圖1顯示了檢測代碼壞味的總體工作流程。首先從Github中收集了21個開源項目,再將這些項目輸入度量分析工具以生成所需度量,根據(jù)各個代碼壞味的度量檢測規(guī)則對項目中的方法進(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)練好的模型最后由代碼壞味的測試數(shù)據(jù)集進(jìn)行評估。
圖1 代碼壞味檢測框架
使用代碼分析工具iPlasma分析下載的Java項目。iPlasma是一個面向?qū)ο筌浖|(zhì)量分析的工具,該工具包含80多個最先進(jìn)和新穎的設(shè)計指標(biāo)庫,可以應(yīng)用于不同的抽象層次。使用該工具提取了項目中檢測三種代碼壞味所需要的5種度量,分別為CINT、CDISP、MAXNESTING、CC和CM,三種代碼壞味需要提取的度量及定義如表1所示。
表1 代碼壞味度量
根據(jù)Lanza等[21]工作中檢測各個代碼壞味的規(guī)則,對提取的度量數(shù)據(jù)進(jìn)行標(biāo)記,含有代碼壞味的標(biāo)記為1,不含有代碼壞味的標(biāo)記為0。
判斷過緊的耦合、分散的耦合和散彈式修改的公式如式(1)~(3)[21]所示,本文將用它們對這三種代碼壞味進(jìn)行標(biāo)記:
利用深度學(xué)習(xí)檢測代碼壞味面臨的挑戰(zhàn)之一是是否能夠收集到大量標(biāo)記的樣本來訓(xùn)練分類器。由于在程序中含有代碼壞味的方法是少數(shù),這就導(dǎo)致數(shù)據(jù)集中含有代碼壞味的方法數(shù)量遠(yuǎn)遠(yuǎn)小于不含代碼壞味方法的數(shù)量,為了避免數(shù)據(jù)不均衡對深度模型準(zhǔn)確率造成的影響,分別采用了欠采樣和過采樣方法。
在21個項目中一共提取了165 830條數(shù)據(jù),首先采用欠采樣方法從中去掉了大量標(biāo)記為0的數(shù)據(jù),但此時數(shù)據(jù)集中仍存在數(shù)據(jù)不均衡的情況。為了改善這種情況,使用SMOTE算法[22]對數(shù)據(jù)進(jìn)行了增強(qiáng),SMOTE算法的基本思想就是對少數(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)來檢測代碼壞味,如圖2所示。
圖2 Attention-CNN模型
CNN主要包括輸入層、隱藏層和輸出層。數(shù)據(jù)通過輸入層進(jìn)入隱藏層;隱藏層中含有單個或多個卷積層,它根據(jù)指定數(shù)目的濾波器和激活函數(shù)執(zhí)行卷積運(yùn)算;最后的輸出層負(fù)責(zé)提供預(yù)測結(jié)果。
注意力機(jī)制是一種資源分配機(jī)制,可以通過對輸入特征賦予不同的權(quán)重來突出更加重要信息的影響[23]。本文在模型中加入了注意力機(jī)制對輸入的度量特征進(jìn)行權(quán)重分配。
模型中各層的描述如下:
1)輸入層。輸入層將代碼壞味的度量特征數(shù)據(jù)作為輸入,如式(4):
數(shù)據(jù)集所使用的項目是從GitHub項目中挑選出來的,共包括21個項目,如表2所示,其中:NOC為類的數(shù)量,NOM為方法的數(shù)量,LOC為代碼行數(shù)。在構(gòu)造數(shù)據(jù)集時選擇了不同領(lǐng)域的項目,這樣可以消除相同領(lǐng)域項目可能帶來的特定代碼風(fēng)格的影響,以保證訓(xùn)練樣本的綜合性;除此之外,這些樣本都是知名的開源項目,代碼質(zhì)量較高,在獲取樣本時可以獲得更為準(zhǔn)確的標(biāo)簽樣本[14]。
利用3.1節(jié)方法先從表2的項目中提取5種度量特征;再根據(jù)3.2節(jié)方法對提取的特征進(jìn)行標(biāo)記;針對提取數(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個新的程序用于生成測試數(shù)據(jù)集,測試集使用的程序如表4所示,測試集共89 455條。
首先以4.1節(jié)方法構(gòu)建出訓(xùn)練數(shù)據(jù)集。將數(shù)據(jù)集輸入Attention-CNN模型中,本文所構(gòu)建的模型代碼是基于Keras實現(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)練,可以得到一個以軟件度量值為輸入的分類器。
表2 訓(xùn)練集所涉項目
表3 過緊的耦合訓(xùn)練數(shù)據(jù)集
表4 測試集所涉項目
以4.2節(jié)所述方式生成測試數(shù)據(jù)集。將測試數(shù)據(jù)集輸入到已訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)分類器后,得到的輸出集合即為神經(jīng)網(wǎng)絡(luò)分類器在此測試集上的預(yù)測結(jié)果。
現(xiàn)有的利用深度學(xué)習(xí)檢測代碼壞味的方法如Kim[19]提出的構(gòu)建深度學(xué)習(xí)模型來建立代碼壞味與面向?qū)ο蠖攘恐g的關(guān)系是基于CNN模型的,2019年Das等[20]提出利用CNN模型構(gòu)建代碼度量特征和預(yù)測值之間復(fù)雜的映射,在依賴度量特征信息來構(gòu)建深度學(xué)習(xí)模型的工作中,很多工作用到了CNN模型,所以本文將CNN模型作為對比模型。
三種代碼壞味的檢測結(jié)果如表5~7所示。因為一個開源項目中存在代碼壞味的方法是少數(shù),即在測試集中標(biāo)簽為0的數(shù)量遠(yuǎn)遠(yuǎn)大于標(biāo)簽為1的數(shù)量。為了避免出現(xiàn)對標(biāo)簽1的預(yù)測結(jié)果不夠高,但對標(biāo)簽0的預(yù)測結(jié)果很高,從而導(dǎo)致整體預(yù)測結(jié)果較高的情況,選擇分別顯示對標(biāo)簽1和標(biāo)簽0的預(yù)測結(jié)果來展示本文所構(gòu)建模型的性能。
表5 過緊的耦合檢測結(jié)果 單位: %
表6 分散的耦合檢測結(jié)果 單位: %
表7 散彈式修改檢測結(jié)果 單位: %
由表8可知Attention-CNN的模型相較于CNN模型由于增加了模型復(fù)雜度,所以時間開銷有所增大,但是增幅并不大,過緊的耦合和分散的耦合在Attention-CNN模型上有更好的結(jié)果,在檢測這兩個代碼壞味時犧牲小部分時間開銷來增加準(zhǔn)確率是值得的。
表8 三種代碼壞味的時間開銷 單位: s
對實驗過程中威脅有效性的幾個因素討論如下:
1)項目中具有代碼壞味的方法是少數(shù),這會導(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ù)據(jù)集中僅包含10個開源項目,本文所得出的結(jié)論有可能不適用于其他項目。為了減少這一威脅,實驗選擇的訓(xùn)練及測試項目均出自不同的研究領(lǐng)域及開發(fā)人員,以期減少某些項目間的特定特征對驗證結(jié)果造成的影響。
3)測試集中標(biāo)簽0的數(shù)量遠(yuǎn)遠(yuǎn)多于標(biāo)簽1的數(shù)量,在這種情況下,模型對標(biāo)簽0的預(yù)測結(jié)果通常很高,這就導(dǎo)致模型所體現(xiàn)的高預(yù)測率可能僅僅體現(xiàn)在對標(biāo)簽0的預(yù)測上。為減少這一威脅,選擇分別討論對標(biāo)簽1和標(biāo)簽0的預(yù)測結(jié)果來展示本文所構(gòu)建模型的性能。
本文提出了一種基于深度學(xué)習(xí)的代碼壞味檢測方法來檢測與耦合度相關(guān)的三種代碼壞味。從21個開源項目中提取訓(xùn)練樣本,對這些樣本進(jìn)行度量信息提取和標(biāo)記后將其輸入神經(jīng)網(wǎng)絡(luò)模型進(jìn)行訓(xùn)練,最后在開源項目上對所生成的網(wǎng)絡(luò)模型進(jìn)行了測試。實驗結(jié)果表明,本文提出的深度學(xué)習(xí)方法具有較高的預(yù)測精度。未來我們將把代碼更多層次的特征融合在檢測方法里,不僅關(guān)注代碼的度量特征,還將關(guān)注代碼的語義和歷史信息等特征,在更準(zhǔn)確的檢測代碼壞味方面作出更大的努力。
[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í)的上帝類檢測方法[J]. 軟件學(xué)報, 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。
國家自然科學(xué)基金資助項目(61440012);河北省基礎(chǔ)研究計劃重點(diǎn)基礎(chǔ)專項(18960106D)。
蘇珊(1995—),女,河北石家莊人,碩士研究生,主要研究方向:軟件重構(gòu);張楊(1980—),男,河北秦皇島人,副教授,博士,CCF高級會員,主要研究方向:智能軟件、軟件重構(gòu);張冬雯(1964—),女,河北石家莊人,教授,博士,CCF 會員,主要研究方向:智能軟件、軟件重構(gòu)。