999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

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

2020-07-04 02:27:37段衛華楊春花
智能計算機與應用 2020年3期

段衛華 楊春花

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

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

【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 引 言

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

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

語句分裂是一種常見的代碼變更模式,將一條語句分裂為兩條或多條語句。該模式有許多呈現形式,而不同的呈現形式對應的變更目的不同:可以是一種重構,也可以是一種缺陷修復。然而,現有的變更模式分類工作沒有涵蓋對該模式的系統研究。

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

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

1 語句分裂變更模式

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

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

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

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

(2)替換形式。使用一個新聲明的變量替換一條語句中部分內容使之變為一條新的語句。如圖3所示,老版本的第398行方法調用語句中的getPluginExtensionComponents(plugin)被新版本行號402的變量聲明語句所替換,因此原語句變為第404行的形式。

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

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

下面將對框架中的每個分類維度進行解釋,并給出對應的實例進行說明。

2.1 分裂語句的類型

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

(1)方法調用語句(MI)。

(2)if語句(IF)。

(3)賦值語句(AS)。

(4)return語句(RE)。

(5)for語句(FO)。

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

2.2 語句變更行為的類型

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

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

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

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

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

2.3 新增語句的類型

這個維度只針對替換形式的語句分裂變更模式,因為此維度所研究的新增語句一般是與替換形式中新聲明賦值的變量相關的語句,而拆分形式中不存在新變量賦值聲明的語句,所以也就不會有與之相關的新的語句出現,所以新增語句指的是hunk增加行部分,除新變量聲明語句和替換后的原句之外的其它新增加的語句,當然新增的語句是不一定存在的。

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

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

(2)新增新變量相關的調用方法的語句,如圖9所示。

2.4 其他類型

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

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

① 新變量的賦值內容中新增方法調用,如圖10所示。

② 新變量的賦值內容中新增邏輯或算術運算,如圖11所示。

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

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

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

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

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

輸出:對2個源文件的變更中包含的語句分裂變更模式的hunk進行3個維度分類判別的結果集Q

1 ?PR←identifySplitpatten(Fileold,Filenew)

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個源文件的變更中包含的替換類型的語句分裂變更模式的hunk集PR,其中每個元素p可表示成一個四元組的形式,變量h代表一個hunk,這是一個四元組h=的結構(其中變量L-和R-分別表示hunk刪除行的文本內容和行號范圍,變量L+和R+則分別表示hunk增加行的文本內容和行號范圍),變量o-代表發生替換分裂的原句的全部節點信息,變量m代表hunk增加行中新聲明變量的變量名,變量c代表變更后的原句的全部節點信息。

算法第2行利用for循環對集合R中的每個元素r進行分類處理。

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

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

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

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

4 算法的實現及驗證

該算法當前采用Java語言來實現。在此實現的基礎上,將提出的分類框架應用到4個開源項目,對其中的語句變更分裂模式進行了識別和分類,并對識別和分類出的結果進行了分析。

數據集包含了4個開源項目: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/)。輸出結果見表1。

經人工觀察驗證分裂語句類型的分類結果后發現沒有出現錯誤分類的情況,表明算法在此維度的分類具有較高的準確性。

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

4.2 語句變更行為類型的分類結果

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

經人工觀察驗證語句變更行為類型的分類結果后發現沒有出現錯誤分類的情況,表明算法在此維度的分類具有較高的準確性。

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

4.3 新增語句類型的分類結果

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

經人工觀察驗證新增語句類型的分類結果后發現,有極個別包含與新聲明變量無關的新增語句的hunk沒有被識別出來,這是因為設計的算法只識別包含新聲明變量的新增語句,而這些極個別與新變量無關的新增語句對本課題的研究基本無意義,所以圖16是將這些hunk排除后所得到的結果。

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

4.4 結果分析及結論

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

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

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

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

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

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

5 結束語

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

參考文獻

[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]章曉芳,朱燦. 代碼壞味對軟件演化影響的實證研究[J]. 軟件學報,2019,30(5):1422.

[4]阮航,陳恒,彭鑫,等. 面向設計的開源軟件項目重構經驗研究[J]. 計算機科學與探索,2017,11(9):1418.

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

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

[7]賀仁亞,唐龍利. 故障注入的軟件代碼缺陷模式[J]. 指揮信息系統與技術,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.

主站蜘蛛池模板: 91福利一区二区三区| 日本一区二区三区精品视频| 一区二区影院| 久久女人网| 亚洲清纯自偷自拍另类专区| 欧美一级色视频| 99这里精品| 91精品小视频| 欧美精品二区| 色亚洲成人| 亚洲欧美综合在线观看| 四虎国产在线观看| www.狠狠| 国产一区二区视频在线| 91精品国产综合久久香蕉922| 在线观看91精品国产剧情免费| 亚洲精品片911| 欧美自慰一级看片免费| 国产精品99r8在线观看| 天天色天天操综合网| 亚洲最新地址| 国产男女XX00免费观看| 毛片在线播放a| 亚洲国产清纯| 国产精品网曝门免费视频| 国产91丝袜在线播放动漫 | 国产成人AV综合久久| 在线无码av一区二区三区| 欧美成人午夜影院| 亚洲婷婷在线视频| 亚洲成人网在线观看| 国产一级无码不卡视频| 免费人成网站在线观看欧美| 91九色国产porny| 婷婷亚洲综合五月天在线| 无码专区第一页| 亚洲成年网站在线观看| 亚洲欧洲AV一区二区三区| 美女内射视频WWW网站午夜| 成人国产一区二区三区| 欧美一级高清片久久99| 三级视频中文字幕| 久久人妻系列无码一区| 伊人久久青草青青综合| 91福利片| 亚洲va在线观看| 国产一区二区丝袜高跟鞋| 超碰色了色| 97视频免费在线观看| 三级国产在线观看| 日韩高清欧美| 精品综合久久久久久97超人该| 成年A级毛片| 日韩天堂视频| 一级毛片a女人刺激视频免费| 亚洲综合色区在线播放2019| 在线观看网站国产| www亚洲天堂| 制服丝袜在线视频香蕉| 婷婷六月激情综合一区| 久久久久久高潮白浆| 99热6这里只有精品| 精品无码国产自产野外拍在线| 久视频免费精品6| 国产第八页| 伊人狠狠丁香婷婷综合色| 国产99精品视频| 动漫精品啪啪一区二区三区| 午夜福利视频一区| 国产精品亚洲一区二区三区在线观看 | 在线无码私拍| 狼友视频国产精品首页| 在线无码av一区二区三区| 免费国产一级 片内射老| 黄色a一级视频| 午夜国产在线观看| 亚洲精品欧美重口| 国产精品高清国产三级囯产AV| 国产第一页亚洲| 国产精品白浆无码流出在线看| 亚洲精品视频网| 欧美视频免费一区二区三区 |