王書涵,陳軍華,高建華
(上海師范大學(xué) 計算機科學(xué)與技術(shù)系,上海 200234)
隨著軟件設(shè)計各類需求變化日漸多樣,軟件的規(guī)模和復(fù)雜性顯著增長.面對持續(xù)的變更請求、嚴(yán)格的截止日期等挑戰(zhàn),開發(fā)人員有時不自覺向源代碼中引入了不理想的設(shè)計,使得最終呈現(xiàn)的代碼結(jié)構(gòu)違背了軟件工程的某些原則.這類設(shè)計缺陷會使得軟件更容易出錯,且后續(xù)會更加難以維護[1,2].軟件重構(gòu)是解決這一問題的有效方案[3].軟件重構(gòu)是指在不改變代碼外部行為的同時實現(xiàn)對軟件內(nèi)部結(jié)構(gòu)的修改[3],其目的是提高代碼的可讀性或通過改變代碼的結(jié)構(gòu)和設(shè)計,使其在將來容易維護.
軟件重構(gòu)的關(guān)鍵之一在于找到重構(gòu)應(yīng)用的位置.為了對這一位置進行描述和識別,Fowler等人[3]提出了代碼異味這一概念,即代碼中存在重構(gòu)可能性的某些結(jié)構(gòu),異味的存在會對軟件設(shè)計質(zhì)量產(chǎn)生不良影響.因此,通過對軟件中的代碼異味進行檢測,開發(fā)人員可以獲得重構(gòu)的位置并采用對應(yīng)的重構(gòu)方式以進行及時調(diào)整進而提升設(shè)計質(zhì)量.
但大量的代碼異味檢測結(jié)果易造成信息過載,不同異味實例可能在粒度、嚴(yán)重性方面各不相同,即代碼異味的強度不同,其對軟件質(zhì)量的影響程度也存在差別.事實上,異味強度高的代碼異味可能十分復(fù)雜和龐大,會為系統(tǒng)軟件的可維護性帶來相對更嚴(yán)重的問題.因此,對代碼異味的強度進行排序應(yīng)成為報告代碼異味檢測結(jié)果時需考慮的重要因素,其允許開發(fā)人員在進行重構(gòu)工作時進行優(yōu)先級排序,例如,時間緊迫時優(yōu)先選擇異味強度最嚴(yán)重的異味進行修復(fù).即以不同的方式管理不同強度的代碼異味,進而可高效降低開發(fā)和維護階段后續(xù)活動的成本.
目前部分代碼異味強度排序方法依賴手工設(shè)計的特征或代碼度量信息,基于啟發(fā)式方法建立上述信息與異味強度之間的映射關(guān)系[4,5],從而實現(xiàn)強度排序.且多數(shù)方法僅從代碼角度出發(fā),未能考慮開發(fā)人員對于代碼異味強度的主觀感知.因此,該類強度排序結(jié)果無法為開發(fā)者提供與其對異味嚴(yán)重性程度感知相一致的重構(gòu)順序建議.不同的排序方法也可能會對相同的異味設(shè)計不同的啟發(fā)式算法,使得排序方法之間的一致性較低.另外,利用代碼度量進行異味檢測結(jié)果排序時,由于代碼度量只關(guān)注代碼自身的結(jié)構(gòu)屬性,僅從結(jié)構(gòu)方面捕獲源代碼的特性,從而忽視了代碼之間的聯(lián)系與邏輯關(guān)系,即代碼之間的包含、繼承等關(guān)系.Hadj-Kacem等人[6]通過抽象語法樹獲取代碼間的語義信息,其將抽象語法樹節(jié)點轉(zhuǎn)換為數(shù)值向量表示,將向量輸入到變分自動編碼器以生成語義信息.但僅用語義信息不足以描述代碼之間的復(fù)雜關(guān)系,因此,本文在抽象語法樹的基礎(chǔ)上構(gòu)建語義結(jié)構(gòu)圖,利用圖的特性同時考慮代碼的語義信息與結(jié)構(gòu)信息,實現(xiàn)對項目中代碼間復(fù)雜關(guān)系的進一步刻畫.
為了實現(xiàn)對語義結(jié)構(gòu)圖中信息的提取,本文采用無監(jiān)督的圖表示學(xué)習(xí)方法進行圖的向量表示.近年來,圖表示學(xué)習(xí)在機器學(xué)習(xí)領(lǐng)域得到了廣泛關(guān)注,其保留圖拓?fù)湫畔⑴c節(jié)點內(nèi)容,將復(fù)雜的圖中節(jié)點表示為低維向量,同時該向量反映出節(jié)點在原圖中復(fù)雜的交互信息,并使得后續(xù)的下游分析任務(wù)(如節(jié)點分類、鏈接預(yù)測等)都可以通過機器學(xué)習(xí)方法實現(xiàn).因此,本文提出了一種基于圖表示學(xué)習(xí)的代碼異味強度排序模型CSSRM(Code Smell Severity Ranking Model,CSSRM),該模型同時考慮代碼語義信息與結(jié)構(gòu)信息構(gòu)建語義結(jié)構(gòu)圖,利用圖表示學(xué)習(xí)與機器學(xué)習(xí)方法,利用開發(fā)人員感知到的代碼異味的不同嚴(yán)重性級別實現(xiàn)代碼異味強度排序.
本文的主要貢獻為:
1)提出了一個基于圖表示學(xué)習(xí)的代碼異味強度排序模型CSSRM,該模型同時考慮代碼語義信息與結(jié)構(gòu)信息實現(xiàn)對于開發(fā)人員感知到的代碼異味強度進行排序.
2)模型采用無監(jiān)督的圖表示學(xué)習(xí)方法將代碼節(jié)點表示到低維空間中,以便后續(xù)任務(wù)處理,具有良好的通用性與可擴展性.
3)將所提出的模型應(yīng)用于開源項目進行實驗,相較于基線方法,F1值最高提升了10.35%,驗證了模型的有效性.
本文的章節(jié)安排如下:第2節(jié)介紹代碼異味強度排序以及圖表示學(xué)習(xí)的相關(guān)工作;第3節(jié)研究和設(shè)計代碼異味強度排序模型;第4節(jié)展開實驗并對實驗結(jié)果進行分析;第5節(jié)總結(jié)本文內(nèi)容并討論未來工作方向.
代碼度量是軟件評測的重要部分,可用于測量和改進源代碼本身的質(zhì)量,其通常用于與源代碼相關(guān)的各類實驗,以評估軟件的整體質(zhì)量.Fontana等人[7]提出了一種代碼異味強度度量指數(shù),用以近似衡量異味的實際嚴(yán)重性.該指標(biāo)中強度的計算依賴于度量分布,通過為各度量指標(biāo)設(shè)定正確的閾值實現(xiàn)強度劃分.Guggulothu等人[8]利用特征選擇過程篩選出的代碼度量指標(biāo),通過分析4種代碼異味的內(nèi)部關(guān)系,嘗試不同重構(gòu)順序?qū)崿F(xiàn)排序.但上述方法并非完全自動化的解決方案,實驗過程存在手動試驗等部分,不利于開發(fā)人員的實際操作.
基于啟發(fā)式的代碼異味強度排序方法之間一致性較低,它們中的大多數(shù)需要指定閾值或明確的分類規(guī)則,不同的閾值設(shè)定可能會導(dǎo)致排序結(jié)果產(chǎn)生明顯差異.機器學(xué)習(xí)技術(shù)可有效克服上述限制,其依賴分類器來區(qū)分異味強度類別,而不是通過計算指標(biāo)的預(yù)定義閾值來實現(xiàn)分類,開發(fā)人員不需要將異味嚴(yán)重性定義形式化.Pecorelli等人[9]提出了一種基于機器學(xué)習(xí)的方法,根據(jù)開發(fā)人員感知的異味嚴(yán)重性程度對代碼異味進行優(yōu)先級排序.Fontana等人[10]使用機器學(xué)習(xí)技術(shù)預(yù)測代碼異味的嚴(yán)重性程度,并比較了多種機器學(xué)習(xí)模型在異味嚴(yán)重性分類任務(wù)中的性能.兩種研究方法雖克服了手動實驗的局限,采用機器學(xué)習(xí)方法實現(xiàn)自動化,但僅使用代碼度量作為自變量實現(xiàn)異味排序,并未考慮代碼的其他結(jié)構(gòu)特性,對代碼間復(fù)雜關(guān)系的刻畫并不全面.
語義信息在其他領(lǐng)域被證明是有價值的,且相關(guān)分析也已經(jīng)用于多種軟件工程任務(wù),但在代碼異味領(lǐng)域卻少被研究.Sae-lim等人[11]通過考慮開發(fā)人員的當(dāng)前上下文,對代碼異味強度進行排序.Palomba等人[12]提出了TACO(代碼氣味檢測的文本分析),利用源代碼標(biāo)識符和注釋提取代碼中的文本內(nèi)容,對其進行標(biāo)準(zhǔn)化后應(yīng)用不同的啟發(fā)式方法實現(xiàn)氣味的檢測.Hadj-Kacem等人[13]將源代碼生成抽象語法樹,并利用變分自編碼器生成抽象語法樹的嵌入表示,隨后將嵌入得到的代碼語義特征作為邏輯回歸的輸入以進行異味檢測.
圖表示學(xué)習(xí)旨在通過保留圖的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)和節(jié)點內(nèi)容信息,將圖中頂點表示為低維向量,以便下游任務(wù)后續(xù)處理.Perozzi等人[14]首次提出DeepWalk算法,該方法通過隨機游走學(xué)習(xí)出一個網(wǎng)絡(luò)或一張圖的向量表示.Tang等人[15]提出的LINE算法,對節(jié)點的一階二階相似度進行建模.基于矩陣分解的方法是將節(jié)點間的關(guān)系以矩陣的形式表示,并對該矩陣進行分解以得到嵌入向量.Cao等人[16]設(shè)計的GraRep算法通過SVD分解分別學(xué)習(xí)節(jié)點的k階表示,并將其結(jié)合生成最終表示.Bandyopadhyay等人[17]提出的FSCNMF算法交替訓(xùn)練網(wǎng)絡(luò)結(jié)構(gòu)與節(jié)點內(nèi)容,并將二者分別作為正則化項,以此得到融合網(wǎng)絡(luò)的結(jié)構(gòu)與內(nèi)容的節(jié)點嵌入表示.Yang等人[18]設(shè)計的NodeSketch算法是一種通過遞歸保持高階節(jié)點鄰近性的高效圖嵌入技術(shù).利用自循環(huán)增強(Self-Loop-Augmented,SLA)鄰接矩陣獲得低階嵌入表示,然后遞歸生成k階節(jié)點嵌入,利用獨立于數(shù)據(jù)的散列技術(shù)解決圖嵌入問題.
針對代碼異味檢測結(jié)果過多造成異味信息過載,使得開發(fā)人員無法從檢測結(jié)果中選擇影響較為嚴(yán)重的異味優(yōu)先進行重構(gòu)的現(xiàn)象,本文基于圖表示學(xué)習(xí)方法融合代碼語義信息與結(jié)構(gòu)信息,提出了一種代碼異味強度排序模型,如圖1所示.
圖1 基于圖表示學(xué)習(xí)的代碼異味強度排序模型概圖Fig.1 Overview of code smell severity ranking model based on graph representation learning
1)實驗數(shù)據(jù)集構(gòu)建:本文利用文獻[9]的數(shù)據(jù)集與源項目,獲取對應(yīng)于各項目的抽象語法樹,并將開發(fā)人員感知的代碼異味嚴(yán)重程度作為機器學(xué)習(xí)使用的標(biāo)簽值.即原數(shù)據(jù)集中關(guān)于異味強度的標(biāo)記NON-SEVERE、MEDIUM與SEVERE.因此,將問題映射為多分類問題.
2)生成語義結(jié)構(gòu)圖:將存在代碼異味的類作為節(jié)點,利用抽象語法樹獲得的代碼間邏輯關(guān)系構(gòu)造邊,生成可表示代碼間復(fù)雜關(guān)系的語義結(jié)構(gòu)圖.
3)獲得節(jié)點嵌入表示:分別利用兩種圖表示學(xué)習(xí)方法,將表示代碼語義信息的語義結(jié)構(gòu)圖與包含結(jié)構(gòu)信息的代碼度量值結(jié)合,獲得對應(yīng)的節(jié)點嵌入表示.
4)實驗評估:利用5種評價指標(biāo)對本文提出的方法進行有效性評估.
Blob,Complex Class,Spaghetti Code,Shotgun Surgery這4種異味常見于代碼異味檢測等相關(guān)研究[19],在軟件系統(tǒng)項目中,上述異味被證明在軟件系統(tǒng)中高度擴散,進而會影響代碼組件的可維護性[20].因此本文選擇此4種基于類的代碼異味重點關(guān)注:
1)Blob(BL):類的代碼數(shù)量大,并使用來自其他類的數(shù)據(jù),表現(xiàn)出較低的內(nèi)聚力,實現(xiàn)多個不同的功能.
2)Complex Class(CC):若類的復(fù)雜度較高,則認(rèn)為該類會出現(xiàn)此異味.
3)Spaghetti Code(SC):該異味是指包含很多復(fù)雜控制語句的非結(jié)構(gòu)化代碼,此類代碼通常難以理解和維護.
4)Shotgun Surgery(SS):該異味是指,單個修改會同時引發(fā)其他代碼段一同更改的情況.即當(dāng)大量外部方法創(chuàng)建與類的依賴關(guān)系時,會出現(xiàn)該異味.
文獻[9]從開發(fā)人員視角出發(fā),利用開發(fā)者感知到的代碼異味的嚴(yán)重性程度對異味進行評級標(biāo)記.首先,利用Decor[21]與Hist[22]兩種已在其他相關(guān)研究中顯示良好效果的代碼異味檢測器識別出上述4種異味,并對工具檢測出的存在異味的類進行手動二次檢查,獲得存在異味的類的列表.接著,監(jiān)控開發(fā)人員在相應(yīng)存儲庫上執(zhí)行的活動,一旦監(jiān)測到開發(fā)人員對列表中存在異味的類進行修改,則利用電子郵件詢問其是否感知或識別到異味的存在.如果答案是肯定的,便請其大致描述該異味的特征再請開發(fā)者對該異味的嚴(yán)重性程度進行1~5級的評級.其中1級與2級被標(biāo)記為NON-SEVERE,即嚴(yán)重性程度低,代碼異味強度低;若開發(fā)者評級為3級,則標(biāo)記為MEDIUM,即嚴(yán)重性程度中等,代碼異味強度中等;否則,將其標(biāo)記為SEVERE,該異味強度較強.因此,對于存在異味的類,由開發(fā)人員感知并標(biāo)記的代碼異味嚴(yán)重性程度獲得對應(yīng)的異味強度標(biāo)簽,從而構(gòu)建異味數(shù)據(jù)集.
本文使用一個輕量級、高度可擴展的多語言解析工具srcML1,其可將源代碼轉(zhuǎn)換為抽象語法樹(Abstract Syntax Tree,AST),并保存為XML文件格式.抽象語法樹是源代碼的抽象語法結(jié)構(gòu)的樹狀表示,樹上的每個節(jié)點都表示源代碼中的一種結(jié)構(gòu).但僅使用抽象語法樹不足以完全表示出代碼間復(fù)雜的邏輯與結(jié)構(gòu)關(guān)系.因此,本文以代碼中存在異味的類作為節(jié)點,利用抽象語法樹中體現(xiàn)出的代碼間的邏輯關(guān)系作為邊,并同時將各類對應(yīng)的代碼度量值作為節(jié)點屬性,以此構(gòu)建語義結(jié)構(gòu)圖,從多角度捕獲源代碼的特征并實現(xiàn)對于代碼間關(guān)系的進一步刻畫.
對于圖中的各節(jié)點,考慮以下兩種關(guān)系以構(gòu)造邊:
1)兩個類同屬一個Java文件;
2)兩個類之間存在依賴或繼承關(guān)系.
本文首先選取文獻[23]中統(tǒng)計得出的7種被廣泛使用的代碼度量指標(biāo)(LOC,LCOM5,C3,CBO,MPC,RFC與WMC),接著結(jié)合所關(guān)注的4種代碼異味的特點,對于圖中每個節(jié)點的屬性,共考慮以下14種常用的基于類的代碼度量值.其中后7種指標(biāo)捕獲了代碼的修改次數(shù)等流程和開發(fā)人員相關(guān)度量,它們能夠從不同角度捕獲類的特征.表1給出了各度量值[9]及其對應(yīng)描述.
為實現(xiàn)結(jié)構(gòu)語義圖與代碼度量信息的結(jié)合,本文選用兩種不同的嵌入表示方法生成可輸入機器學(xué)習(xí)模型的最終嵌入表示.
3.4.1 拼接語義結(jié)構(gòu)與代碼度量的表示方法
將代碼中的節(jié)點表示為低維向量,使其能夠反映出節(jié)點在原圖中復(fù)雜的交互信息,嵌入表示避免了手動的特征工程且適用于下游的機器學(xué)習(xí)任務(wù),例如對某節(jié)點存在的異味嚴(yán)重性進行分類.
為此,本文采用一種通過遞歸草圖保留高階節(jié)點鄰近度的高效圖嵌入技術(shù)NodeSketch[18]以獲得語義結(jié)構(gòu)圖的節(jié)點嵌入,后將嵌入表示獲得的矩陣與代碼度量進行拼接,得到完整的節(jié)點嵌入表示,將此方法記為CSSRM-SM(Code Smell Severity Ranking Model-Structure and Metrics,CSSRM-SM).
目前大多數(shù)圖嵌入技術(shù)使用余弦距離來刻畫節(jié)點相似度,然而有研究工作[24]表明,使用漢明距離進行有關(guān)相似度計算可有效加速下游機器學(xué)習(xí)任務(wù).因此,NodeSketch利用數(shù)據(jù)獨立散列,即sketching技術(shù),使用隨機散列函數(shù)為原始數(shù)據(jù)生成固定大小的草圖,并在漢明空間中快速進行相似度近似生成節(jié)點嵌入.利用NodeSketch生成節(jié)點嵌入過程如圖2所示.
圖2 利用NodeSketch生成節(jié)點嵌入過程Fig.2 Using NodeSketch to generate node embedding process
對于低階節(jié)點嵌入,如若直接使用圖鄰接矩陣的各行進行編碼,將忽略一階節(jié)點鄰近度而僅保留二階節(jié)點鄰近度.因此,本文選用圖的自循環(huán)增強(Self-Loop-Augmented,SLA)鄰接矩陣生成低階節(jié)點嵌入表示.SLA鄰接矩陣是通過在原始鄰接矩陣基礎(chǔ)上加上一個單位陣得到的,如公式(1)所示:
(1)
對于每行SLA鄰接向量,利用公式(2)生成對應(yīng)的低階節(jié)點嵌入:
(2)
接著,以遞歸方式學(xué)習(xí)高階節(jié)點嵌入.為生成節(jié)點的k階嵌入,NodeSketch利用公式(3),將每個節(jié)點的SLA鄰接向量與其所有鄰居節(jié)點的(k-1)階嵌入向量以加權(quán)的方式合并,得到k階SLA鄰接向量Vr(k).
(3)
對于Vr(k)再次使用公式(2)得到k階節(jié)點嵌入矩陣S(k).
將S(k)與代碼度量矩陣M利用公式(4)進行拼接,得到最終嵌入表示:
U=[S,M]
(4)
3.4.2 融合結(jié)構(gòu)語義與代碼度量的表示方法
本文采用的另一種節(jié)點嵌入表示方法為融合語義結(jié)構(gòu)與代碼度量的表示方法.代碼度量中的某些指標(biāo)體現(xiàn)在了語義結(jié)構(gòu)圖中,例如統(tǒng)計類的代碼行數(shù)的指標(biāo)LOC,度量對象類之間的耦合的指標(biāo)CBO等,同時節(jié)點結(jié)構(gòu)也會影響對應(yīng)的代碼度量指標(biāo).代碼度量作為軟件評估的重要部分,應(yīng)將其作為語義結(jié)構(gòu)圖中節(jié)點的屬性,豐富節(jié)點的嵌入表示.因此,本文采用一種基于NMF(Non-negative matrix factorization,NMF)的優(yōu)化模型FSCNMF[17],該方法在鄰接矩陣和特征矩陣上使用聯(lián)合矩陣分解技術(shù),將語義結(jié)構(gòu)與代碼度量分別作為正則化項進行交替訓(xùn)練,得到融合語義結(jié)構(gòu)與代碼度量的節(jié)點嵌入表示,將此方法記為CSSRM-A.生成節(jié)點嵌入的過程如圖3所示.
圖3 利用FSCNMF生成節(jié)點嵌入過程Fig.3 Using FSCNMF to generate node embedding process
首先從結(jié)構(gòu)中學(xué)習(xí),對于鄰接矩陣A,對其進行NMF分解,并最小化近似誤差的F-范數(shù),得到兩個低秩矩陣U,V,如公式(5)所示.其中α2,α3是為避免過擬合而使用的權(quán)重參數(shù).
(5)
對于節(jié)點的內(nèi)容矩陣以相同方式進行分解,給定代碼度量指標(biāo)矩陣M,通過最小化F-范數(shù),并設(shè)定權(quán)重參數(shù)為β2,β3,利用公式(6)得到低秩矩陣P,Q:
(6)
接著,將基于語義結(jié)構(gòu)或代碼度量的嵌入矩陣分別作為正則化項交替訓(xùn)練,利用公式(7)生成更新后的嵌入矩陣U,V:
(7)
同理,通過公式(8)可得P,Q:
(8)
可通過調(diào)節(jié)α1與β1的值來體現(xiàn)嵌入表示中語義結(jié)構(gòu)與代碼度量各自的重要性程度,如若模型更重視代碼的語義結(jié)構(gòu)信息,則將β1調(diào)整為較高值;反之若模型更重視代碼度量內(nèi)容,則將α1調(diào)整為較高值.
以迭代方式多次執(zhí)行公式(6)、公式(7)并利用公式(9)對U,P進行拼接,得到語義結(jié)構(gòu)圖的最終嵌入:
E=[U,P]
(9)
為了衡量所提出的模型的性能,本文選用5個評價指標(biāo):Precision,Recall,F1,AUC-ROC與MCC對實驗進行評估.其中Precision,Recall,F1與MCC指標(biāo)計算方法如公式(10)~公式(13)所示:
(10)
(11)
(12)
(13)
其中TP(True Positive)指正確實現(xiàn)代碼異味強度分類的異味樣本數(shù),TN(True Negative)指正確將非某強度類的樣本識別為非本類的異味樣本數(shù),FP(False Positive)指錯誤將非本異味強度類的樣本分入本類的異味樣本數(shù),FN(False Negative)指錯誤將本異味強度類的樣本分入了其他強度類的異味樣本數(shù).
AUC(Area Under Curve)是ROC(Receiver Operating Characteristic curve)曲線下方的面積,該曲線橫坐標(biāo)為偽陽性率(FPR),縱坐標(biāo)為真陽性率(TPR),該指標(biāo)量化模型區(qū)分不同分類的能力.
為驗證基于圖表示學(xué)習(xí)的異味強度排序模型的有效性,本文尋求3個問題的解答.
Q1:引入了語義結(jié)構(gòu)圖的CSSRM-SM與CSSRM-A兩種方法中,哪種嵌入表示方法對應(yīng)的模型性能更加優(yōu)越?
Q2:與其他根據(jù)開發(fā)人員感知嚴(yán)重性對代碼異味強度進行分類的方法相比,本文提出的基于圖表示學(xué)習(xí)的分類模型是否更具有效性?
Q3:選用其他分類器替代隨機森林,能否進一步提升模型分類效果?
本文實驗基于Pycharm軟件環(huán)境,操作系統(tǒng)為Intel Core i5 -1038NG7@2.00GHz,16GB內(nèi)存,Mac OS X.基于圖表示學(xué)習(xí)的節(jié)點嵌入方法中嵌入維度均為32,CSSRM-A模型中,取正則化參數(shù)為1、α1和α2均為1000的模型默認(rèn)值.實驗的基準(zhǔn)分類算法為隨機森林,采用5折交叉驗證的方式進行訓(xùn)練與評估.
本文使用文獻[9]的數(shù)據(jù)集,針對每種代碼異味選擇3個開源項目與14種基于類的代碼度量指標(biāo)進行實驗評估.表2給出了所選項目[9]的基本信息與統(tǒng)計數(shù)據(jù).
表2 實驗所涉項目Table 2 Projects for experiment
根據(jù)實驗結(jié)果,可以依次回答4.1節(jié)中的3個問題.
對于Q1,表3~表6給出了兩種對應(yīng)分類模型在4種異味與各項目上的實驗性能.由實驗結(jié)果可知,在12項實驗中,CSSRM-SM方法對應(yīng)的分類模型在11項實驗中的評價指標(biāo)值均優(yōu)于CSSRM-A方法對應(yīng)的模型.雖然采用兩種方法均使得分類模型有較好的效果,但在多數(shù)情況下,將語義結(jié)構(gòu)圖與代碼度量進行拼接的嵌入表示方法CSSRM-SM對應(yīng)的異味強度分類器效果相對更優(yōu).這說明相較于利用結(jié)構(gòu)語義信息與代碼度量間一致性來生成嵌入表示的CSSRM-A方法,CSSRM-SM方法考慮了結(jié)構(gòu)語義圖的高階鄰近度,從結(jié)構(gòu)角度獲得更好的節(jié)點語義的嵌入表示,對于模型的性能提升具有更大意義.
表3 Blob異味強度排序結(jié)果比較Table 3 Accuracy results of Blob
表4 Complex Class異味強度排序結(jié)果比較Table 4 Accuracy results of Complex Class
表5 Spaghetti Code異味強度排序結(jié)果比較Table 5 Accuracy results of Spaghetti Code
表6 Shotgun Surgery異味強度排序結(jié)果比較Table 6 Accuracy results of Shotgun Surgery
對于Q2,由于使用CSSRM-SM嵌入表示方法對應(yīng)的模型效果更優(yōu),因此,將該模型針對于各異味實現(xiàn)的分類性能求均值,并與文獻[9]中對應(yīng)的實驗結(jié)果進行比較,結(jié)果如表7所示.
表7 代碼異味強度分類結(jié)果比較Table 7 Comparison of code smell severity ranking results
其中,本文提出的模型性能相較于基線模型,在對Complex Class異味強度排序上效果有較大提升,F1值提高了10.35%.實現(xiàn)提升的原因可能在于存在Complex Class異味的類皆是具有較高的圈復(fù)雜度的類,因此該異味的存在與類的結(jié)構(gòu)特性有關(guān).而CSSRM-SM方法中獲取節(jié)點嵌入表示時添加了類與類間的邏輯關(guān)系信息,且NodeSketch方法保留了節(jié)點的高階相似度,因此在基線方法的基礎(chǔ)之上從另一角度更進一步地補充了類間的結(jié)構(gòu)關(guān)系,有利于模型更加準(zhǔn)確地實現(xiàn)對于Complex Class異味的強度排序.
基線模型在對Spaghetti Code異味強度排序有最高的性能,而本文模型在該異味上的提升效果相對其他異味較不明顯.Spaghetti Code異味包含很多復(fù)雜控制語句,且含有該異味的代碼通常是非結(jié)構(gòu)化的.文獻[9]也曾提出該異味強度與結(jié)構(gòu)因素的相關(guān)性較弱,可讀性(Readability)度量是開發(fā)人員對該異味進行排序時考慮的關(guān)鍵因素,而可讀性是否良好、代碼語義是否連貫等主要需要開發(fā)人員的主觀判斷.因此,這說明本文方法增加考慮代碼間的語義結(jié)構(gòu)關(guān)系對于提升模型性能的效果較不明顯的原因在于Spaghetti Code異味本身的特性.
本文提出的模型利用圖結(jié)構(gòu)從多個角度對代碼中類的特征與關(guān)系實現(xiàn)進一步刻畫,為模型提供更多代碼特性信息用以更加準(zhǔn)確的判斷異味強度.表7的實驗結(jié)果證實,相較于文獻[9]的方法,本文所提出的模型在引入了結(jié)構(gòu)語義信息與圖表示學(xué)習(xí)方法后,對于4種異味強度的分類效果均有不同程度的提升,體現(xiàn)了模型的有效性.
對于Q3,在本文提出的圖表示學(xué)習(xí)方法架構(gòu)下,選擇支持向量機(Support Vector Machine,SVM)、決策樹(Decision Tree,DT)與邏輯回歸(Logistic Regression,LR)3種分類器與實驗基準(zhǔn)分類器隨機森林(Random Forest,RF)進行對比,比較其在相同實驗數(shù)據(jù)集上的代碼異味強度分類效果差異.由表8看出,在BL、CC、SC、SS 4種異味下采用兩種嵌入表示方法利用隨機森林(RF)實現(xiàn)的最終強度分類效果均優(yōu)于使用SVM、DT與LR算法.在對SC異味使用CSSRM-SM嵌入表示方法時,利用RF實現(xiàn)分類的模型的F1值最高高出利用SVM的模型28.58%,因此采用RF實現(xiàn)基于圖表示學(xué)習(xí)的代碼異味強度分類方法效果更好.其余3種分類器中,選用CSSRM-SM嵌入表示方法時,DT和LR相比SVM略微存在優(yōu)勢,選用CSSRM-A時,SVM對應(yīng)的最終模型效果略優(yōu)于DT與LR.
表8 不同分類器的代碼異味強度分類效果Table 8 Code smell severity ranking results with different classifiers
本文提出了一種基于圖表示學(xué)習(xí)的代碼異味強度排序模型CSSRM,該模型利用抽象語法樹與代碼間復(fù)雜的邏輯關(guān)系構(gòu)建語義結(jié)構(gòu)圖,并利用圖表示學(xué)習(xí)方法結(jié)合代碼度量信息生成節(jié)點嵌入,隨后利用隨機森林作為分類器實現(xiàn)對于代碼異味的強度分類,進而可以利用本文提出的模型來對代碼異味實例進行優(yōu)先級排序,為開發(fā)者的重構(gòu)優(yōu)先級決策提供參考.通過實驗表明,本文提出的模型顯著提高了代碼異味強度排序的準(zhǔn)確率,且CSSRM可結(jié)合更多先進的表示學(xué)習(xí)方法與機器學(xué)習(xí)方法進行強度分類,具有良好的通用性與可擴展性.
在未來研究中可關(guān)注3個方向:
1)擴大數(shù)據(jù)集,在更多不同規(guī)模的項目上探索本模型的可用性,進一步分析基于圖表示學(xué)習(xí)的代碼異味強度排序效果.
2)擴大所研究的異味粒度,由于所選用的數(shù)據(jù)集關(guān)注于類級別的代碼異味,因此本文所提出的模型研究粒度也限制于類級別,在未來研究中可探索方法級別的異味嚴(yán)重性排序模型性能以豐富研究內(nèi)容進而克服此局限.
3)捕獲其他性質(zhì)或粒度級別的代碼特征,在目前模型的基礎(chǔ)上進一步豐富節(jié)點嵌入所包含的內(nèi)容,探索對于模型性能實現(xiàn)進一步提高的可能性.