位歡歡,吳海濤,高建華
(上海師范大學(xué) 信息與機(jī)電工程學(xué)院,上海 200234)
代碼異味[1]的出現(xiàn)給軟件質(zhì)量和可維護(hù)性帶來了很大的隱患。而解決它們的有效方式是進(jìn)行重構(gòu),但是由于重構(gòu)的成本相對(duì)較高,對(duì)所有的異味進(jìn)行重構(gòu)是不現(xiàn)實(shí)且不必要的,因?yàn)椴煌愇额惖漠愇冻潭炔⒉皇窍嗟鹊腫2]。因此,需要對(duì)異味類進(jìn)行排序,著重關(guān)注那些有較大概率出現(xiàn)異味的代碼。
Vidal等[3]提出了一種基于3個(gè)標(biāo)準(zhǔn)的半自動(dòng)化的異味類排序方法。Fontana等[4]采用度量值與閾值的比較結(jié)果(強(qiáng)度值)來對(duì)代碼異味進(jìn)行排序。Natthawute等[5]基于開發(fā)人員的角度來研究代碼異味的排序,研究表明開發(fā)人員是通過代碼的耦合程度以及組件的重要性來對(duì)代碼異味進(jìn)行篩選和排序的。Anshul Rani等[6]則是通過對(duì)不同異味類之間的耦合程度計(jì)算出每個(gè)類的影響因子,并根據(jù)影響因子的大小對(duì)代碼異味進(jìn)行排序。Mcintosh等[7]通過在 5ESS? 軟件項(xiàng)目上進(jìn)行研究,發(fā)現(xiàn)代碼變更的規(guī)模與軟件出現(xiàn)錯(cuò)誤的概率具有相關(guān)性。Charalampidou等[8]的研究表明代碼變更的規(guī)模與軟件易錯(cuò)性發(fā)生的概率存在正相關(guān)關(guān)系,即代碼變更規(guī)模越大的類,出現(xiàn)異常和錯(cuò)誤的概率越大。
本文基于代碼變更與軟件易錯(cuò)性存在正相關(guān)關(guān)系,通過研究在歷史代碼變更信息中各個(gè)類的代碼行數(shù)動(dòng)態(tài)變化情況,提出基于代碼行變更指數(shù)的異味類排序方法(CLCI)。并在開源項(xiàng)目HospitalAutomationWithJavaEE上進(jìn)行實(shí)證分析,實(shí)驗(yàn)結(jié)果表明,本文提出的異味類排序方法可以使后續(xù)異味類重構(gòu)更加容易,從而為項(xiàng)目開發(fā)和維護(hù)節(jié)約成本。
Vidal等[3]提出了一種半自動(dòng)化的方法,用于在決定對(duì)代碼異味進(jìn)行適當(dāng)重構(gòu)之前先對(duì)異味類進(jìn)行優(yōu)先級(jí)排序,該排序方法主要基于以下3個(gè)標(biāo)準(zhǔn):發(fā)生異味的代碼的穩(wěn)定性、開發(fā)人員是否使用常規(guī)標(biāo)準(zhǔn)來對(duì)每種異味進(jìn)行主觀評(píng)估,以及相關(guān)的可修改性場(chǎng)景。通過在兩個(gè)案例研究中進(jìn)行實(shí)驗(yàn)驗(yàn)證,結(jié)果表明建議的代碼異味順序?qū)﹂_發(fā)人員是有用的。其研究結(jié)果表明代碼異味排序?qū)τ趯?shí)際的程序開發(fā)是有效的。
Fontana等[4]提出基于強(qiáng)度因子來對(duì)代碼異味進(jìn)行排序,強(qiáng)度因子是表示代碼異味強(qiáng)度情況的指標(biāo),通過對(duì)靜態(tài)度量值與閾值的比較并計(jì)算得出的。實(shí)驗(yàn)研究是在Qua-litas Corpus上的74個(gè)開源項(xiàng)目上進(jìn)行,實(shí)驗(yàn)使用自己研發(fā)的工具JcodeOdor,通過對(duì)6種代碼異味進(jìn)行一些靜態(tài)度量值測(cè)量來建立實(shí)驗(yàn)?zāi)P汀5?,?qiáng)度因子的實(shí)驗(yàn)過程相對(duì)復(fù)雜,不利于開發(fā)人員的實(shí)際應(yīng)用。
Natthawute等[5]通過對(duì)10個(gè)專業(yè)開發(fā)人員在異味的選擇和排序需要考慮哪些因素進(jìn)行問卷調(diào)查,把開發(fā)人員對(duì)于異味的看法分為15個(gè)類別,以此來判斷開發(fā)人員在異味選擇時(shí)最關(guān)注的因素。實(shí)驗(yàn)結(jié)果表明,開發(fā)人員在選擇異味時(shí),工作相關(guān)性是首先被考慮的,其次是異味的嚴(yán)重性;在開發(fā)人員對(duì)代碼異味排序時(shí),模塊重要性是普遍被優(yōu)先關(guān)注的,其次是項(xiàng)目相關(guān)性。但是,其研究并沒有為開發(fā)人員在代碼異味排序提供具體的定量指標(biāo)。
Anshul Rani等[6]的研究是基于類間的耦合性來對(duì)異味進(jìn)行排序的。實(shí)驗(yàn)共分為兩個(gè)部分,第一部分為檢測(cè)代碼異味,得到異味類列表;第二部分是基于異味影響因子來對(duì)異味類進(jìn)行排序,影響因子越大表示異味越嚴(yán)重。實(shí)驗(yàn)結(jié)果表明,根據(jù)排序列表進(jìn)行重構(gòu)的結(jié)果,明顯好于隨機(jī)進(jìn)行重構(gòu)的結(jié)果,作者的研究為開發(fā)人員提供新的異味類排序方法。
Mcintosh等[7]通過在5ESS?軟件項(xiàng)目上進(jìn)行實(shí)證研究,得出代碼變更的規(guī)模與軟件出現(xiàn)錯(cuò)誤的概率具有相關(guān)性。通過建立預(yù)測(cè)模型,研究得出隨著代碼變更次數(shù)、代碼變更行數(shù)的增加和相關(guān)聯(lián)的子系統(tǒng)數(shù)目的增加,軟件出現(xiàn)錯(cuò)誤的可能性也會(huì)相對(duì)增加。此外,不同類型的代碼變更對(duì)于軟件系統(tǒng)出錯(cuò)率的影響是不同的,新增加的代碼出現(xiàn)錯(cuò)誤的概率要比修復(fù)缺陷的代碼變更容易出現(xiàn)錯(cuò)誤,因?yàn)樾迯?fù)代碼的變更相對(duì)規(guī)模較小。
Charalampidou等[8]通過使用代碼異味出現(xiàn)概率來對(duì)常見的TD代碼中的代碼異味進(jìn)行評(píng)估分析,分析異味出現(xiàn)概率與模塊的變化傾向的關(guān)系。案例研究的結(jié)果表明,比起不易變更模塊中代碼異味出現(xiàn)的概率,代碼異味顯然更易集中在具有變更傾向的模塊中。這些研究結(jié)果對(duì)研究人員和實(shí)踐者都是有用的,可以為后續(xù)研究重構(gòu)策略和重構(gòu)的優(yōu)先級(jí)提供方向。
陳芝菲[9]通過對(duì)大規(guī)模數(shù)據(jù)集的歷史維護(hù)信息進(jìn)行分析,發(fā)現(xiàn)出現(xiàn)代碼異味和沒有出現(xiàn)代碼異味的類發(fā)生變更或錯(cuò)誤的次數(shù)存在較大的差異。為了進(jìn)一步探索軟件變更與代碼異味出現(xiàn)的關(guān)系,建立負(fù)二項(xiàng)回歸模型來對(duì)其進(jìn)行研究,研究表明代碼變更是軟件發(fā)生易錯(cuò)性的最重要因素,尤其是代碼行等自變量。
Luca Gazzola等[10]通過在軟件系統(tǒng)交互時(shí)存在故障和程序不穩(wěn)定問題的研究中,發(fā)現(xiàn)代碼的大量變更容易導(dǎo)致項(xiàng)目出現(xiàn)錯(cuò)誤,并提供統(tǒng)計(jì)數(shù)據(jù)來支持其聲明,更進(jìn)一步提出應(yīng)避免對(duì)超過25%的現(xiàn)有代碼進(jìn)行更改,對(duì)于此類情況建議重新編碼而不是修改。上述研究均表明代碼變更規(guī)模越大,越容易導(dǎo)致項(xiàng)目出現(xiàn)錯(cuò)誤,給項(xiàng)目后期的維護(hù)帶來負(fù)擔(dān)。
本文基于代碼變更規(guī)模與代碼出現(xiàn)異味的概率存在正相關(guān)關(guān)系,通過關(guān)注代碼行數(shù)在整個(gè)開發(fā)過程中的動(dòng)態(tài)變化來定量描述代碼變更的規(guī)模,并把代碼變更的規(guī)模定義為代碼行變更指數(shù),根據(jù)其值的大小來對(duì)異味類進(jìn)行降序排序。
在軟件項(xiàng)目的開發(fā)過程中,隨著項(xiàng)目需求的變更、錯(cuò)誤代碼的修正、軟件項(xiàng)目的優(yōu)化、測(cè)試案例的選擇和后期項(xiàng)目的維護(hù),開發(fā)人員需要對(duì)代碼進(jìn)行增加、刪除、修改操作。但是,代碼變更不可以不計(jì)其規(guī)模而進(jìn)行,若軟件項(xiàng)目的變更大于項(xiàng)目代碼總數(shù)的25%時(shí),修改代碼所花費(fèi)的成本將大于重新編譯該項(xiàng)目[10]。設(shè)計(jì)良好的項(xiàng)目結(jié)構(gòu)其類的穩(wěn)定性相對(duì)較高,面臨上述情況時(shí),其代碼變更規(guī)模相對(duì)較小,相反,若是一個(gè)類的代碼行數(shù)頻繁變更,則其代碼的結(jié)構(gòu)設(shè)計(jì)越糟糕,出現(xiàn)異味的概率越大。此前,對(duì)于代碼行數(shù)的研究大多基于靜態(tài)的最終代碼行數(shù),而本文主要關(guān)注在一個(gè)項(xiàng)目開發(fā)周期中代碼行數(shù)的動(dòng)態(tài)變化,即每個(gè)開發(fā)人員每次提交的代碼變更信息中代碼行數(shù)的變化,并用代碼行變更指數(shù)(CLCI)來表示該變化,CLCI值越大表示該類的代碼變更規(guī)模越大,則該類出現(xiàn)異味的概率越大。本文的實(shí)驗(yàn)是基于類的代碼行變更指數(shù)(CLCI)來對(duì)異味類進(jìn)行排序,以此減少后期維護(hù)成本。實(shí)驗(yàn)的整體流程如圖1所示,共分為3步,描述如下:
圖1 整體流程
(1)檢測(cè)階段:在檢測(cè)過程中,本文使用開源檢測(cè)工具JDeodorant,它是eclipse的免費(fèi)開源插件,檢測(cè)的異味為feature envy,Duplicate code,Type checking,Long Method,God Class,根據(jù)檢測(cè)結(jié)果得到異味類列表;
(2)計(jì)算階段:收集項(xiàng)目開發(fā)過程中每個(gè)開發(fā)人員每次提交的代碼變更信息,統(tǒng)計(jì)同一異味類每次代碼變更前后的代碼行數(shù),計(jì)算其差值為該次代碼變更的行數(shù);之后,把代碼行變更指數(shù)與最終代碼行數(shù)的比值之和稱為代碼行變更倍數(shù)(Times),并對(duì)其進(jìn)行sigmoid函數(shù)歸一化,得到的值即為代碼行變更指數(shù)(CLCI),分別計(jì)算各個(gè)異味類的CLCI值,得到所有異味類的代碼行變更指數(shù)列表;
(3)排序階段:根據(jù)異味類的代碼變更指數(shù)(CLCI)值的大小對(duì)檢測(cè)到的異味類進(jìn)行排序,CLCI值越大的異味類則表示其代碼變更規(guī)模越大,出現(xiàn)代碼異味的概率相對(duì)較高,反之,則表示該異味類出現(xiàn)異味的概率相對(duì)較低。
許多學(xué)者已經(jīng)對(duì)代碼異味的檢測(cè)進(jìn)行研究[11-14],而本文主要研究代碼異味的排序方式,對(duì)于代碼異味的檢測(cè)傾向于選擇開源且易于操作的代碼異味檢測(cè)工具。本文通過對(duì)代碼異味檢測(cè)工具的分析和研究,最終選擇JDeodorant作為本文代碼異味檢測(cè)的工具,見表1。選擇JDeodorant工具的優(yōu)勢(shì):
(1)JDeodorant工具是eclipse軟件的一個(gè)開源插件,且操作簡(jiǎn)單;
(2)JDeodorant工具可以自動(dòng)識(shí)別java程序中本次實(shí)驗(yàn)需要檢測(cè)的所有異味類型;
(3)JDeodorant工具可以向開發(fā)人員提供多種重構(gòu)建議并自動(dòng)實(shí)施開發(fā)人員所選擇的重構(gòu)建議。
表1 異味檢測(cè)工具
大量研究表明,代碼變更規(guī)模與軟件易錯(cuò)率存在正相關(guān)關(guān)系[7-10],本文正是基于代碼變更規(guī)模的大小來判斷哪些類更容易出現(xiàn)異常和錯(cuò)誤,代碼變更規(guī)模較大的異味類出現(xiàn)異味的概率相對(duì)較大。而此前的研究主要關(guān)注每個(gè)類最終的靜態(tài)代碼行數(shù),而忽略在整個(gè)項(xiàng)目開發(fā)中每個(gè)類的代碼行數(shù)隨著每次開發(fā)人員提交代碼而發(fā)生動(dòng)態(tài)變化的情況。本文基于每次代碼變更前后代碼行數(shù)的變化情況來對(duì)異味類進(jìn)行排序,其中代碼變更次數(shù)相對(duì)較多,每次代碼行數(shù)變化相對(duì)較大的類,則其出現(xiàn)異味的概率也相對(duì)較大。因此,本文為了描述代碼行在整個(gè)項(xiàng)目開發(fā)周期中的動(dòng)態(tài)變化,定義了代碼行變更指數(shù)(CLCI)。代碼行變更指數(shù)是指在項(xiàng)目開發(fā)周期中,每次開發(fā)人員提交代碼時(shí),該異味類代碼行數(shù)發(fā)生變化的總和是最終代碼行數(shù)的倍數(shù)Times,并對(duì)其進(jìn)行sigmoid函數(shù)歸一化。代碼行變更指數(shù)(CLCI)的計(jì)算公式如下
(1)
(2)
其中,k表示代碼變更總次數(shù),CR(i)(Code Row) 為異味類第i次代碼變更后的代碼行數(shù),其中CR(0)=0,則CR(i)-CR(i-1) 為第i次代碼變更時(shí),發(fā)生變化的代碼行數(shù),在除以最終代碼行數(shù)(LCR)并求和,并對(duì)求和結(jié)果進(jìn)行sigmoid函數(shù)歸一化,使其值范圍屬于(0,1)之間。計(jì)算代碼行變更指數(shù)的偽代碼設(shè)計(jì)如下:
算法1: CLCI計(jì)算過程
輸入: 代碼提交行數(shù)CR,代碼變更次數(shù)k,最終代碼行數(shù)LCR
輸出: CLCI值
(1) CLCI←0,CR(0)←0
(2) Fori←1 tokDo
(3) If CR(i)≥CR(i-1) Then
(4) CCR(i)←CR(i)-CR(i-1)
(5) Else
(6) CCR(i)←CR(i-1)-CR(i)
(7) End if
(8) Times←Times+CCR(i)/LCR
(9) End for
通過上述方式對(duì)異味類進(jìn)行計(jì)算得出所有異味類的代碼行變更指數(shù),CLCI的值越大,則表示在項(xiàng)目開發(fā)過程中該類的代碼變更規(guī)模越大,即該類出現(xiàn)異味的概率越大。反之,CLCI的值越小,則該類出現(xiàn)異味的概率越小。最后,根據(jù)CLCI值的大小來對(duì)異味類進(jìn)行降序排序,從而得到排序后的異味類列表。
為驗(yàn)證依據(jù)代碼行變更指數(shù)對(duì)異味類排序的有效性,本文以HospitalAutomationWithJavaEE[6]系統(tǒng)作為測(cè)試背景,計(jì)算該項(xiàng)目所有異味類的代碼行變更指數(shù),并依據(jù)代碼行變更指數(shù)值的大小進(jìn)行排序,最終得到排序后的異味類列表。實(shí)驗(yàn)主要尋求以下幾個(gè)問題的解答:
Q1:使用CLCI排序方式進(jìn)行重構(gòu),前序異味類重構(gòu)之后能否使后續(xù)需要重構(gòu)的異味類數(shù)量減少?
Q2:使用CLCI排序方式進(jìn)行重構(gòu),重構(gòu)后總體異味類剩余數(shù)量是否減少?
Q3:使用CLCI排序方式進(jìn)行重構(gòu),比基于類間耦合性[6]進(jìn)行排序,異味剩余率是否減少更快?
本文實(shí)證研究是在java開源項(xiàng)目上進(jìn)行的,項(xiàng)目名稱為HospitalAutomationWithJavaEE[6],此項(xiàng)目共有49個(gè)類,58次代碼變更記錄信息,選擇此項(xiàng)目的原因?yàn)椋孩僭谄渌撐闹惺褂肹6],具有一定的可信度;②有很高的錯(cuò)誤比例(36%),給代碼異味的排序供了實(shí)例。檢測(cè)代碼異味的工具為自動(dòng)化檢測(cè)工具JDeodorant,主要檢測(cè)的代碼異味為feature envy,Duplicate code,Type checking,Long Method,God Class,該工具操作簡(jiǎn)單且具有重構(gòu)功能,能夠?yàn)楹笃谥貥?gòu)節(jié)約成本。
實(shí)驗(yàn)所需的初始數(shù)據(jù)為項(xiàng)目歷史記錄信息,項(xiàng)目歷史記錄信息可以在公共的開發(fā)倉(cāng)庫(kù)獲得,如CSV,GitHub,對(duì)于公司內(nèi)部項(xiàng)目,開發(fā)人員更改代碼的記錄可以從項(xiàng)目日志中獲得。本文實(shí)驗(yàn)數(shù)據(jù)是從github項(xiàng)目倉(cāng)庫(kù)中獲得,實(shí)驗(yàn)項(xiàng)目的歷史記錄信息為每次代碼變更提交的commit記錄。項(xiàng)目歷史記錄信息包含的內(nèi)容較多,但本次實(shí)驗(yàn)并不需要所有的數(shù)據(jù)信息,因此,根據(jù)本文實(shí)驗(yàn)要求從歷史記錄信息中提取實(shí)驗(yàn)所需代碼變更信息,舉例如圖2所示。
圖2 代碼變更信息舉例
代碼變更信息中包含類、配置文件以及網(wǎng)頁的變更信息,基于本文的實(shí)驗(yàn)要求,首先需要對(duì)代碼變更信息進(jìn)行數(shù)據(jù)選取,即保留類的變更信息,清除其它不必要的變更信息,進(jìn)行數(shù)據(jù)選取時(shí),可以依據(jù)提交主題中的關(guān)鍵詞進(jìn)行快速數(shù)據(jù)選??;其次,依據(jù)類名對(duì)代碼變更信息進(jìn)行分類匯總,得到每個(gè)類的代碼變更信息;最后,對(duì)分類信息進(jìn)行統(tǒng)計(jì)整理,記錄每個(gè)類的代碼變更hash值、代碼變更作者、代碼變更時(shí)間、代碼變更行數(shù)以及該類的最終代碼行數(shù),此處以SaveAppointmentsService.java類的變更信息為例,見表2。
表2 SaveAppointmentsService.java類代碼行變更信息
通過對(duì)HospitalAutomationWithJavaEE項(xiàng)目的49個(gè)類,58次代碼變更記錄信息進(jìn)行異味類檢測(cè)與代碼行變更指數(shù)計(jì)算,檢測(cè)與計(jì)算的結(jié)果見表3,該表采用代碼行變更指數(shù)遞減的順序排列。檢測(cè)階段的結(jié)果表明,在該項(xiàng)目中Duplicate Code異味較為常見,其次為Feature Envy與God Class異味。計(jì)算階段的結(jié)果表明,當(dāng)CLCI值大于0.9時(shí),出現(xiàn)代碼異味的概率較大。
表3 檢測(cè)與計(jì)算階段結(jié)果
根據(jù)檢測(cè)階段和計(jì)算階段的實(shí)驗(yàn)結(jié)果,逐一回答前文提到的Q1、Q2、Q3問題。
Q1:為驗(yàn)證使用CLCI的排序方式進(jìn)行重構(gòu),前序異味類重構(gòu)之后能否使后續(xù)需要重構(gòu)的異味類數(shù)量減少,本文采用JDeodorant工具對(duì)異味類按照代碼行變更指數(shù)降序排序的順序?qū)Ξ愇额愡M(jìn)行重構(gòu),并在一個(gè)異味類重構(gòu)之后觀測(cè)后續(xù)異味類的數(shù)量是否減少。通過實(shí)驗(yàn)觀測(cè)發(fā)現(xiàn),Service/AvailableAppointmentsService.java與Service/DoctorService.java均為Duplicate Code異味,它們的代碼行變更指數(shù)分別0.7311和0.7714,根據(jù)上述重構(gòu)規(guī)則需要優(yōu)先對(duì)Service/DoctorService.java異味類進(jìn)行重構(gòu),但是在重構(gòu)過程中發(fā)現(xiàn)這兩個(gè)異味類具有相同的代碼片段,兩個(gè)異味類的相同代碼片段如圖3所示。使用重構(gòu)工具JDeodorant提取重復(fù)代碼片段定義為新的類KlinikerEqualClinic.java,則在service/DoctorService.java異味類被檢測(cè)出來后,使用JDeodorant插件按照開發(fā)人員選擇的重構(gòu)建議進(jìn)行重構(gòu)之后,service/AvailableAppointmentsService.java類的異味隨之自動(dòng)解決;此外,對(duì)Controller/GetDoctors.java進(jìn)行God Class重構(gòu)后,Controller/GetHospital.java類的異味也自動(dòng)消失。研究結(jié)果表明異味類之間具有相關(guān)性,一個(gè)異味類重構(gòu)以后會(huì)使后續(xù)需要重構(gòu)的異味類數(shù)量減少,從而減少重構(gòu)成本。
圖3 異味類重復(fù)代碼片段
Q2:為驗(yàn)證使用CLCI的排序方式進(jìn)行重構(gòu),重構(gòu)后總體異味類剩余數(shù)量是否減少,本文采用對(duì)照實(shí)驗(yàn),把項(xiàng)目復(fù)制成內(nèi)容相同的兩份,實(shí)驗(yàn)組采用優(yōu)先對(duì)代碼行變更指數(shù)較大的異味類進(jìn)行重構(gòu);對(duì)照組采用隨機(jī)方式對(duì)異味類進(jìn)行重構(gòu)。為了判斷重構(gòu)后異味類的剩余情況,本文采用異味剩余率(CML,即“code smell left %”)作為評(píng)價(jià)指標(biāo),異味剩余率為重構(gòu)后的異味類剩余數(shù)量占總異味類數(shù)量的比例,其公式如下所示
(3)
異味剩余率(CML)值越小則表示使用該代碼異味排序方式重構(gòu)后的異味數(shù)量越少,即該代碼異味排序方式更優(yōu)。本文使用JDeodorant工具,并分別采用兩種不同的排序方式來對(duì)相同項(xiàng)目的代碼異味進(jìn)行重構(gòu),重構(gòu)剩余率對(duì)比如圖4所示,從圖4可以看出當(dāng)對(duì)前10個(gè)異味類采用本文的排序方式進(jìn)行重構(gòu)后的異味類剩余數(shù)量?jī)H占總異味類數(shù)量的25%,則使用隨機(jī)排序方式進(jìn)行重構(gòu)后的剩余異味類數(shù)量占總異味類數(shù)量的50%;使用本文的排序方式,代碼異味的剩余率減少速度比隨機(jī)排序方式快,說明采用本文的排序方式可以使重構(gòu)后的總體異味類剩余數(shù)量減少,從而減少重構(gòu)成本。
圖4 CLCI與隨機(jī)排序重構(gòu)后異味剩余率對(duì)比
Q3:為驗(yàn)證使用CLCI的排序方式進(jìn)行重構(gòu),比基于類間耦合性[11]進(jìn)行排序,異味剩余率是否減少更快。本文采用Q2的對(duì)照實(shí)驗(yàn),實(shí)驗(yàn)組為基于代碼行變更指數(shù)的異味類排序方式,對(duì)照組為基于類間耦合性的異味類排序方式,并采用異味剩余率來對(duì)其結(jié)果進(jìn)行比較。其中,基于類間耦合性的異味類排序方式的計(jì)算公式如下
(4)
具體計(jì)算公式,可以參考文獻(xiàn)[11]。在整個(gè)實(shí)驗(yàn)過程中,分別記錄對(duì)照組采用基于類間耦合性排序方式進(jìn)行重構(gòu),重構(gòu)后的前10個(gè)異味類的異味剩余率變化過程和實(shí)驗(yàn)組采用基于代碼行變更指數(shù)排序方式進(jìn)行重構(gòu),重構(gòu)后的前10個(gè)異味類的異味剩余率變化過程,見表4。
表4 類間耦合與CLCI排序重構(gòu)后剩余率
從表4可以看出,當(dāng)CLCI指數(shù)較大的7個(gè)異味類被重構(gòu)之后,異味剩余率下降開始減緩,此時(shí),該CLCI值開始小于0.9。而基于耦合性的排序方式在整個(gè)重構(gòu)過程中,異味剩余率下降較為平穩(wěn),但整體效果比起CLCI值下降更少,如圖5所示。
圖5 CLCI與耦合性排序重構(gòu)后的異味剩余率
本文依據(jù)代碼變更規(guī)模與軟件發(fā)生錯(cuò)誤的概率存在正相關(guān)關(guān)系,定義代碼行變更指數(shù)來描述軟件開發(fā)過程中,代碼發(fā)生變更時(shí)代碼行的動(dòng)態(tài)變化,并以此來對(duì)異味類進(jìn)行排序,實(shí)驗(yàn)結(jié)果表明,使用代碼行變更指數(shù)來對(duì)異味類進(jìn)行排序可以使后續(xù)的重構(gòu)更容易,從而提高重構(gòu)的效率。在未來的工作中,將會(huì)在以下幾個(gè)方面展開:
(1)持續(xù)研究代碼變更中其它因素,如代碼變更的原因以及發(fā)生變更的代碼重要程度對(duì)于異味排序的作用。
(2)通過研究異味類之間的相關(guān)關(guān)系,改進(jìn)基于代碼行變更指數(shù)的異味類排序方法。