国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

一種語句分裂變更模式的分類框架

2020-07-04 02:27:37段衛(wèi)華楊春花

段衛(wèi)華 楊春花

摘要:語句分裂變更模式是一種常見的將一條代碼語句分裂成多條語句的代碼變更模式,該模式有多種呈現(xiàn)形式,而不同的呈現(xiàn)形式又可能對應(yīng)不同的變更目的。提出一種分類框架,從分裂語句的類型、語句變更的行為和新增語句類型三個(gè)維度對該模式進(jìn)行分類,并設(shè)計(jì)了基于該框架的分類算法。最后,將該算法應(yīng)用于4個(gè)開源項(xiàng)目,對其中所包含的語句分裂變更模式進(jìn)行了分類和分析,實(shí)驗(yàn)結(jié)果呈現(xiàn)出較高的分類準(zhǔn)確率。

關(guān)鍵詞: 軟件演化; 語句分裂變更模式; 分類框架; 代碼變更塊

【Abstract】 Statement splitting change pattern is a common code change pattern that splits a code statement into multiple statements. This pattern has many forms of presentation, and different forms of presentation may correspond to different purposes of change. This paper proposes a classification framework, which classifies the pattern from three dimensions: the type of split statement, the behavior of statement change and the type of new statement, and designs a classification algorithm based on the framework. Finally, the algorithm is applied to four open source projects to classify and analyze the statement splitting change patterns. The experimental results show a high classification accuracy.

【Key words】 ?software evolution; statement split change pattern; classification framework; Hunk

0 引 言

現(xiàn)代大型軟件的開發(fā)和維護(hù)一般由多人協(xié)作完成,軟件工程師每天將變更的代碼提交到版本管理系統(tǒng),對代碼變更進(jìn)行理解是軟件工程師日常工作的基礎(chǔ)。然而,一次變更提交中往往聚集了多種修改模式,如缺陷修復(fù)、重構(gòu)、增加特征等。多種變更模式摻雜在一起使得對軟件變更的理解變得困難。因此,為了更好地理解變更的內(nèi)容,有必要對一些常見的變更模式進(jìn)行分類,如此一來即與其它代碼修改分離開來,從而使得變更理解變得容易。

代碼變更中較典型的模式包括重構(gòu)[1](Refactoring)和缺陷修復(fù)(bug-fixing)等。對于重構(gòu)模式的分類研究包括:文獻(xiàn)[2]對軟件重構(gòu)研究進(jìn)行的較為全面的總結(jié),文獻(xiàn)[3]對代碼壞味對軟件演化影響的研究和文獻(xiàn)[4]對常見的重構(gòu)操作的簡單介紹和分類等。缺陷修復(fù)的研究包括:文獻(xiàn)[5]對軟件缺陷分類應(yīng)用于缺陷預(yù)測方法的研究;文獻(xiàn)[6]對面向軟件自動(dòng)修復(fù)的缺陷分類方法的研究;以及文獻(xiàn)[7]對具體領(lǐng)域軟件代碼中缺陷分類的研究等。上述研究對常見的代碼變更模式制定了相應(yīng)的分類體系,這些體系為代碼變更的研究提供了參考,并且通過將其應(yīng)用于各種變更模式的自動(dòng)識別當(dāng)中,從而對軟件演化的理解產(chǎn)生更多積極作用。

語句分裂是一種常見的代碼變更模式,將一條語句分裂為兩條或多條語句。該模式有許多呈現(xiàn)形式,而不同的呈現(xiàn)形式對應(yīng)的變更目的不同:可以是一種重構(gòu),也可以是一種缺陷修復(fù)。然而,現(xiàn)有的變更模式分類工作沒有涵蓋對該模式的系統(tǒng)研究。

本文在對大量語句分裂變更模式進(jìn)行觀察分析的基礎(chǔ)上,總結(jié)了常見的語句分裂變更模式的呈現(xiàn)形式以及一些附加的變化,提出一個(gè)語句分裂變更模式的三維分類框架以及基于該框架的分類算法,并用該算法對開源項(xiàng)目中包含的語句分裂變更模式進(jìn)行了抽取、分類和分析。

下面首先介紹語句分裂變更模式,然后提出語句分裂變更模式的分類框架和識別算法,最后是實(shí)驗(yàn)驗(yàn)證和分析。

1 語句分裂變更模式

一個(gè)源代碼文件修改前后的2個(gè)版本相應(yīng)位置的差異即為變更,而當(dāng)前對代碼變更的提取一般是借助于差異化分析工具來進(jìn)行。目前存在的差異分析工具主要有2種:文本差異分析(Textual-Differencing)和樹差異分析(Tree-Differencing),前者將2個(gè)版本的源代碼視為2個(gè)字符串,通過計(jì)算2個(gè)字符串的差異得到代碼變更,著名的工具有GNU-Diff[8]等;后者比較2個(gè)版本的源代碼所對應(yīng)的抽象語法樹,計(jì)算二者的差異作為代碼變更,代表性的工具有Change-Distiller[9]等。由于文本型差異分析工具目前廣泛應(yīng)用到版本管理系統(tǒng)中輔助用戶查看diff,因此本文的研究基于文本差異分析工具的輸出結(jié)果,對其中的語句分裂變更模式進(jìn)行研究。

文本型差異分析工具的變更輸出單位為hunk(代碼變更塊),一個(gè)hunk由刪除行和添加行構(gòu)成。圖1是GNU-Diff的一個(gè)hunk輸出示例。由"-"開頭的行為被刪除的語句行,"+"開頭的行為新增的語句行,hunk中"-"左邊的行號88表示該行在舊版本中的位置,"+"右邊的行號88~89表示新增的行在新版本的位置。

經(jīng)過對人工識別出的開源項(xiàng)目中包含語句分裂變更模式的hunk集進(jìn)行分析,發(fā)現(xiàn)該模式包含2種基本形式,將其分別命名為拆分形式和替換形式。對此可做闡釋分述如下。

(1)拆分形式。就是將一條賦值語句拆分成多條賦值語句。圖2為拆分形式的示例,可以看到刪除行872行的賦值語句被拆分為2條賦值語句(增加行872~873行)。

(2)替換形式。使用一個(gè)新聲明的變量替換一條語句中部分內(nèi)容使之變?yōu)橐粭l新的語句。如圖3所示,老版本的第398行方法調(diào)用語句中的getPluginExtensionComponents(plugin)被新版本行號402的變量聲明語句所替換,因此原語句變?yōu)榈?04行的形式。

2 一個(gè)語句分裂變更模式的分類框架

為了從呈現(xiàn)形式和變更行為上全面理解語句分裂變更模式,提出一個(gè)三維分類框架,從分裂語句的類型、語句變更行為和新增語句類型三個(gè)維度對該模式進(jìn)行分類,分類框架如圖4所示。

下面將對框架中的每個(gè)分類維度進(jìn)行解釋,并給出對應(yīng)的實(shí)例進(jìn)行說明。

2.1 分裂語句的類型

分裂語句是指hunk刪除行中被分裂的語句(下文用“原句”表示)。通過觀察,分類模式常發(fā)生在以下5種語句類型中:

(1)方法調(diào)用語句(MI)。

(2)if語句(IF)。

(3)賦值語句(AS)。

(4)return語句(RE)。

(5)for語句(FO)。

值得注意的是,拆分形式的語句分裂一般出現(xiàn)在賦值語句中,而其他類型語句則常以替換形式進(jìn)行分裂變更。

2.2 語句變更行為的類型

對于語句分裂變更模式,可根據(jù)hunk的增加行中,聲明新變量的賦值內(nèi)容和參與原句更改的方式,總結(jié)出替換形式的4種變更行為類型,詳述如下。

(1)封裝(encapsulation)-EN:新變量的賦值內(nèi)容取自原句中,并且這部分內(nèi)容沒發(fā)生任何變化,如圖5所示。

(2)更換(change)-CH:新變量的賦值內(nèi)容與原句中任何部分都不完全相同或完全不同,如圖6所示。

(3)增加(add)-AD:只是在原句的基礎(chǔ)上增加了與新變量相關(guān)的部分,從而語句原有的內(nèi)容沒有發(fā)生變化,(此種類型中新變量的賦值內(nèi)容可能與原句中的內(nèi)容有關(guān),也可能無關(guān))。如圖7所示。

(4)分解(decompose)-DE:將原句直接拆分成兩條或多條語句,如圖2所示。這種行為一般只出現(xiàn)在拆分形式的語句分裂變更模式中。

2.3 新增語句的類型

這個(gè)維度只針對替換形式的語句分裂變更模式,因?yàn)榇司S度所研究的新增語句一般是與替換形式中新聲明賦值的變量相關(guān)的語句,而拆分形式中不存在新變量賦值聲明的語句,所以也就不會有與之相關(guān)的新的語句出現(xiàn),所以新增語句指的是hunk增加行部分,除新變量聲明語句和替換后的原句之外的其它新增加的語句,當(dāng)然新增的語句是不一定存在的。

新增語句一般分為以下2種類型:

(1)新增與新變量相關(guān)的if語句,如圖8所示。

(2)新增新變量相關(guān)的調(diào)用方法的語句,如圖9所示。

2.4 其他類型

這部分主要探討替換形式中存在的另外2種新增內(nèi)容的類型。研究給出內(nèi)容表述如下。

(1)第一種是對上述語句變更行為類型中的“更換”類型的補(bǔ)充,這種類型中的“不完全相同”一般是賦值內(nèi)容中除了取自原句中的部分之外還有新增加的內(nèi)容,下面就介紹常見的這部分新增內(nèi)容的類型:

① 新變量的賦值內(nèi)容中新增方法調(diào)用,如圖10所示。

② 新變量的賦值內(nèi)容中新增邏輯或算術(shù)運(yùn)算,如圖11所示。

(2)第二種是針對原句變更時(shí),除部分內(nèi)容被新變量替換外還增加了新的內(nèi)容。對此擬做重點(diǎn)論述如下。

3 語句分裂變更模式的分類算法

根據(jù)上述分類框架,設(shè)計(jì)了一個(gè)分類算法,該算法用四元組的結(jié)構(gòu)表示每個(gè)包含語句分裂變更模式的hunk的分類結(jié)果,并將這些結(jié)果存入集合Q中,其中變量p是語句分裂變更模式識別算法(已有文章對此識別算法進(jìn)行論述)輸出的語句分裂變更模式替換形式的hunk集PR和拆分形式的hunk集PS中的元素,變量t、b、a都是字符串類型的變量,t代表分裂語句的類型;b代表語句變更行為的類型;a代表新增語句的類型。

經(jīng)觀察拆分形式的語句分裂變更模式三維判別結(jié)果單一,即,所以分類算法只對替換形式的語句分裂變更模式的hunk集PR中的元素進(jìn)行3個(gè)維度的判別,算法的偽代碼如下。

輸入:同一文件的一次更改前后兩個(gè)版本的源文件Fileold和Filenew

輸出:對2個(gè)源文件的變更中包含的語句分裂變更模式的hunk進(jìn)行3個(gè)維度分類判別的結(jié)果集Q

1 ?PR←identifySplitpatten(Fileold,F(xiàn)ilenew)

2 ?for each ?p∈PR p=

3 ?t←get Type(o-)

4 ?if true←contains(c,o-)

5b=“AD”

6z←getVarValue()

7if true←contains(o-,z)

8 ? b=“EN”

9[WB]else b=“CH”

10 ? if true←hasIfstmt(m)

11 a=“IF”

12 ? else if true←hasMistmt(m)

13 a=“MI”

14 else a=“NULL”

15Q←

16 end if

17 ? end if

18[DW]end if

19 ?end if

20 end for

算法第1行利用identifySplitpatten()算法(即語句分裂變更模式的識別算法)獲取2個(gè)源文件的變更中包含的替換類型的語句分裂變更模式的hunk集PR,其中每個(gè)元素p可表示成一個(gè)四元組的形式,變量h代表一個(gè)hunk,這是一個(gè)四元組h=的結(jié)構(gòu)(其中變量L-和R-分別表示hunk刪除行的文本內(nèi)容和行號范圍,變量L+和R+則分別表示hunk增加行的文本內(nèi)容和行號范圍),變量o-代表發(fā)生替換分裂的原句的全部節(jié)點(diǎn)信息,變量m代表hunk增加行中新聲明變量的變量名,變量c代表變更后的原句的全部節(jié)點(diǎn)信息。

算法第2行利用for循環(huán)對集合R中的每個(gè)元素r進(jìn)行分類處理。

第3行利用getType()函數(shù)獲得分裂語句o-即原句的類型t,即對第一維度的判別。

第4~9行是對第二個(gè)維度的判別,其中4、5行利用contains()函數(shù)判斷原句分裂變更后是否還包含了原來的全部節(jié)點(diǎn)信息(contains()方法,當(dāng)且僅當(dāng)此字符串包含指定的char值序列時(shí),返回true),如果返回true則新的變量沒有替換掉原句中的任何內(nèi)容,并且識別算法已確定變更后的原句包含了新聲明的變量m,則可以確定其語句變更行為類型為增加“AD”;第6行利用getVarValue()函數(shù)獲取hunk對應(yīng)的抽象語法樹片段中,給變量m賦值的語句節(jié)點(diǎn)的賦值內(nèi)容z;第7、8行利用contains()函數(shù)判斷原句o-是否包含了字符序列z,如果返回true則確定其語句變更行為類型為封裝“EN”;第9行如果返回false,則確定其語句變更行為類型為更換“CH”。

第10~14行是對第三個(gè)維度的判別,其中10、11行利用hasIfstmt()函數(shù)通過遍歷hunk增加行對應(yīng)語法樹中的節(jié)點(diǎn)信息,找出是否存在新增的包含新聲明變量m子節(jié)點(diǎn)的if語句節(jié)點(diǎn),如果返回true則確定其新增語句類型為if語句“IF”;第12、13行利用hasMistmt()函數(shù)找出是否存在新增的包含新聲明變量m子節(jié)點(diǎn)的方法調(diào)用語句節(jié)點(diǎn),如果返回true則確定其新增語句類型為方法調(diào)用語句“MI”;第14行如果非上述情況則判斷不存在新增的語句“NULL”。

第15行將上述的三個(gè)維度的判別結(jié)果以四元組的形式存入集合Q中。

4 算法的實(shí)現(xiàn)及驗(yàn)證

該算法當(dāng)前采用Java語言來實(shí)現(xiàn)。在此實(shí)現(xiàn)的基礎(chǔ)上,將提出的分類框架應(yīng)用到4個(gè)開源項(xiàng)目,對其中的語句變更分裂模式進(jìn)行了識別和分類,并對識別和分類出的結(jié)果進(jìn)行了分析。

數(shù)據(jù)集包含了4個(gè)開源項(xiàng)目:J Edit(http://sourceforge.net/project/jedit/)、Apache maven(http://maven.apache.org/)、Google-guice(https://github.com/apress/google-guice)和Eclipse(http://www.eclipse.org/downloads/eclipse-packages/)。輸出結(jié)果見表1。

經(jīng)人工觀察驗(yàn)證分裂語句類型的分類結(jié)果后發(fā)現(xiàn)沒有出現(xiàn)錯(cuò)誤分類的情況,表明算法在此維度的分類具有較高的準(zhǔn)確性。

根據(jù)圖14所示的分裂結(jié)果,語句分裂變更模式發(fā)生在方法調(diào)用語句(MC)和賦值語句(AS)中的次數(shù)較多,分別占到了總數(shù)的39%和24%,return語句(RE)和if語句(IF)次之,分別占到了總數(shù)的17%和15%,for語句(FO)最少,只占到了總數(shù)的5%。

4.2 語句變更行為類型的分類結(jié)果

算法對語句變更行為類型的判別結(jié)果如圖15所示。

經(jīng)人工觀察驗(yàn)證語句變更行為類型的分類結(jié)果后發(fā)現(xiàn)沒有出現(xiàn)錯(cuò)誤分類的情況,表明算法在此維度的分類具有較高的準(zhǔn)確性。

根據(jù)圖15的結(jié)果,不難發(fā)現(xiàn)封裝(EN)行為出現(xiàn)的次數(shù)最多,占到了總數(shù)的56%;而更換(CH)行為和增加(AD)行為次之,分別占到了總數(shù)的28%和12%,這兩種行為一般會改變原語句的作用;而出現(xiàn)次數(shù)最少的分解(DE)行為只占到了總數(shù)的4%。

4.3 新增語句類型的分類結(jié)果

算法對新增語句類型的判別結(jié)果如圖16所示。

經(jīng)人工觀察驗(yàn)證新增語句類型的分類結(jié)果后發(fā)現(xiàn),有極個(gè)別包含與新聲明變量無關(guān)的新增語句的hunk沒有被識別出來,這是因?yàn)樵O(shè)計(jì)的算法只識別包含新聲明變量的新增語句,而這些極個(gè)別與新變量無關(guān)的新增語句對本課題的研究基本無意義,所以圖16是將這些hunk排除后所得到的結(jié)果。

根據(jù)圖16可知,沒有新增語句的hunk占到了70%,而出現(xiàn)新增語句的例子大約占到總數(shù)的30%,其中與新變量相關(guān)的方法調(diào)用語句(MI)占到了19%,if語句(IF)占到了11%。

4.4 結(jié)果分析及結(jié)論

根據(jù)表1可知,語句分裂變更模式的拆分模式出現(xiàn)次數(shù)極少,這種形式不會改變語句的行為并且不會伴隨額外的變化。

通過觀察圖14中3種占比較少的語句類型的hunk可知,替換形式的語句分裂模式大多數(shù)都發(fā)生在這些語句中的復(fù)雜的方法調(diào)用和賦值部分,并且結(jié)合方法調(diào)用語句和賦值語句占比較多的情況可以說明:語句中發(fā)生替換的基本都是復(fù)雜的方法調(diào)用和賦值部分。

根據(jù)圖15中封裝類型(DE)占比較多的情況可知,多于半數(shù)的替換形式本質(zhì)上是沒有發(fā)生算法更換的,只是通過替換簡化了語句中較為復(fù)雜的內(nèi)容,這種操作不會改變語句行為所以也可以看作是一種重構(gòu)行為,而更換類型(CH)才更加類似于替換算法重構(gòu)模式,這兩種語句變更行為類型一共占到了總數(shù)的84%,所以可以認(rèn)為:替換形式的語句分裂變更多數(shù)情況是一種重構(gòu)操作。

圖15中的增加行為(AD)基本呈現(xiàn)2種形式:一種形式是在if語句中增加了與新變量相關(guān)條件表達(dá)式,則此變更是由重構(gòu)模式與IF-CC[10](更改條件表達(dá)式)缺陷修復(fù)模式組合而成的變更;另外一種形式是在其它語句類型的方法調(diào)用部分增加了與新變量相關(guān)的新的參數(shù),則此變更是由重構(gòu)模式與MC-DNP[10](具有不同數(shù)量參數(shù)或不同類型參數(shù)的方法調(diào)用)缺陷修復(fù)模式組合而成的變更。

圖16中30%的包含新增語句的替換形式的語句分裂變更模式,其意圖是為了便于引入語句中復(fù)雜內(nèi)容的方法調(diào)用或條件判斷,從而使用簡單的變量將其替換,新增語句實(shí)際上是一種缺陷修復(fù)行為,例如新增if語句的語句分裂變更類似于IF-APC[10](增加前提條件檢查)缺陷修復(fù)模式,所以有新增語句的語句分裂變更也是由重構(gòu)模式與缺陷修復(fù)模式組合而成的變更。

上述的增加行為和新增語句的行為都是基于替換操作基礎(chǔ)上的額外的變更,所以可知:包含額外變更的替換形式的語句分裂變更多數(shù)情況是一種由重構(gòu)模式與缺陷修復(fù)模式組合的變更模式。

5 結(jié)束語

本文對語句分裂變更模式進(jìn)行了分類研究,根據(jù)人工篩選出的數(shù)據(jù)集提出了語句分裂變更模式的三維分類框架,并且根據(jù)該框架設(shè)計(jì)了語句分裂變更模式的分類算法,最后用該分類算法對語句分裂變更模式的hunk集進(jìn)行分類判別,在觀察分析判別結(jié)果后得出一些結(jié)論。后續(xù)工作還需要結(jié)合代碼變更塊的上下文內(nèi)容,對語句分裂變更模式的各種形式進(jìn)行變更發(fā)生情境、產(chǎn)生因素等方面做進(jìn)一步的經(jīng)驗(yàn)分析,使得對語句分裂變更模式的研究更為完善。

參考文獻(xiàn)

[1] ?[WB]FOWLER M. Refactoring: Improving the design of existing programs[M]. USA: Addison-Wesley,1999.

[2]MENS T,TOURW T. A survey of software refactoring[J]. IEEE Transactions on Software Engineering,2004,30(2):126.

[3]章曉芳,朱燦. 代碼壞味對軟件演化影響的實(shí)證研究[J]. 軟件學(xué)報(bào),2019,30(5):1422.

[4]阮航,陳恒,彭鑫,等. 面向設(shè)計(jì)的開源軟件項(xiàng)目重構(gòu)經(jīng)驗(yàn)研究[J]. 計(jì)算機(jī)科學(xué)與探索,2017,11(9):1418.

[5]李偉湋,郭鴻昌. 基于鄰域三支決策粗糙集模型的軟件缺陷預(yù)測方法[J]. 數(shù)據(jù)采集與處理,2017,32(1):166.

[6]易昕,毛曉光,紀(jì)濤. 面向程序自動(dòng)修復(fù)的缺陷分類方法研究[J]. 計(jì)算機(jī)應(yīng)用研究,2016,33(6):1748.

[7]賀仁亞,唐龍利. 故障注入的軟件代碼缺陷模式[J]. 指揮信息系統(tǒng)與技術(shù),2015,6(6):23.

[8]HUNT J W,SZYMANSKI T G. A fast algorithm for computing longest common subsequences[J]. Communications of the ACM,1977,20(5):350.

[9]FLURI B,GALL H C. Classifying change types for qualifying change couplings [C]//14th IEEE International Conference on Program Comprehension(ICPC'06).Athens,Greece:IEEE,2006,35.

[10]PAN Kai,KIM S, JR E J W.Toward an understanding of bug fix patterns[J]. Empirical Software Engineering, 2009,14(3):286.

定南县| 溆浦县| 大安市| 定结县| 延庆县| 桦南县| 喀喇沁旗| 阿勒泰市| 庄浪县| 介休市| 大悟县| 陇南市| 桦川县| 大丰市| 大渡口区| 雷山县| 特克斯县| 伊金霍洛旗| 平武县| 汉中市| 张掖市| 比如县| 正安县| 神农架林区| 武隆县| 凤凰县| 阜南县| 民勤县| 高青县| 治多县| 夏邑县| 敖汉旗| 远安县| 安岳县| 新干县| 高要市| 山阴县| 漯河市| 东乡| 鄯善县| 若羌县|