新四季網

一種基於代碼圈複雜度度量的軟體演化評估方法與流程

2023-04-29 06:29:44 1


本發明涉及一種基於代碼圈複雜度度量的軟體演化評估方法,屬於軟體演化與維護領域問題。
背景技術:
:代碼複雜度是對代碼複雜程度的一種度量,是理解和維護代碼所需工作量的一種指徵。代碼複雜度會直接影響到諸如可讀性、可維護性、可理解性等軟體質量屬性。通過評估代碼複雜度,可以幫助開發人員及時了解、控制和調整代碼的複雜程度。圈複雜度是代碼複雜度的一種,是用來衡量程序中判定結構的複雜程度的一種質量指標。通常,人們通過圈複雜度的度量與評估衡量軟體模塊判定結構的複雜程度,了解預防錯誤所需測試的最少路徑條數,為測試人員設計測試案例提供指導。經驗表明,程序的可能錯誤數和圈複雜度值的高低有很大關係:圈複雜度偏大的程序代碼往往質量低,且難於測試和維護。隨著軟體的演化,其原始碼會產生一定的變更,會對軟體的圈複雜度、軟體質量及其後繼演化產生影響。有些演化操作能降低代碼的圈複雜度,提高代碼的質量;而有些演化操作則會提高軟體的圈複雜度。很多軟體項目或者由於最初設計結構的不合理,或者由於版本演化過程中累積問題的增多,最終在軟體複雜性得不到有效控制的情況下崩潰,導致軟體生命的結束。因此,在現有軟體開發環境下,自動化地對軟體的代碼圈複雜度進行演化分析對於軟體的迭代開發與重構、提高軟體質量、延長軟體的生命周期具有重要意義,並能為軟體的演化提供評價依據。技術實現要素:技術問題:本發明的目的是提供一種自動化地對軟體代碼圈複雜度的演化進行評估和分析的方法,以解決軟體演化過程中複雜度得不到有效控制的問題。較之其他軟體演化度量和評估方法,該方法注重演化過程中軟體圈複雜度的變化,實現對軟體複雜度的控制。技術方案:本發明方法,強調軟體演化中的質量控制,引入代碼圈複雜度度量方法、圈複雜度閾值等,從不同層次對演化前後的軟體圈複雜度進行度量和評估,進而對代碼圈複雜度變化的原因進行分析,為軟體維護方案提供參考。本發明的基於代碼圈複雜度度量的軟體演化評估方法,步驟如下:步驟1)分別為待評估軟體的當前待測目標版本v_current和歷史版本v_last的程序源碼構造抽象語法樹;步驟2)根據所述步驟1)獲取的抽象語法樹,分別從系統層、類層和方法層三個層次對待測軟體版本的代碼進行圈複雜度度量,所述待測軟體版本包括當前待測目標版本v_current和歷史版本v_last;步驟3)從類層和方法層分別評估待測軟體版本的圈複雜度度量結果,找出軟體中圈複雜度度量結果超出閾值範圍的類和方法;步驟4)對待測軟體的當前待測目標版本v_current和歷史版本v_last的圈複雜度度量結果按層次進行分析比較,以確定變更發生的位置,具體為:先進行兩個版本系統層圈複雜度的比較,確定兩個版本間類的增刪改;然後再進行類層次的分析,對前後版本中圈複雜度發生變化的類,確定其方法的增刪改;最後進行方法層次的分析,考察同名方法的圈複雜度變化;步驟5)對當前待測目標版本v_current和歷史版本v_last的項目源碼本身進行分析比較,找出兩者在所述步驟4)確定的變更發生的位置的代碼差異,輸出到格式文件中;步驟6)針對當前待測目標版本v_current和歷史版本v_last,通過所述步驟4)得到的兩個版本中圈複雜度發生增刪改的類和方法,以及所述步驟5)得到的兩個版本的代碼差異,進行差異定位,即根據代碼差異確定導致度量結果發生變化的原因,形成軟體演化評估。進一步的,本發明的方法中,步驟2)中通過統計代碼解析所得的抽象語法樹中判定節點的數量來進行代碼圈複雜度度量,規則為:判定節點是程序設計語言中表示條件判定的語句,通過條件判定來確定程序的控制流走向。進一步的,本發明的方法中,對於java語言,所述步驟2)中代碼圈複雜度度量規則的判定節點存在於以下關鍵字所引導的語句中:if,for,while,do,case,catch,&&,||,:?,這些判定節點在抽象語法樹ast中對應的節點如下表:表1.圈複雜度中判定節點和astnode對應表進一步的,本發明的方法中,步驟2)中分三個層次進行代碼圈複雜度度量的具體方法是:方法層:通過掃描方法的抽象語法樹,統計方法中的判定節點個數,將該判定節點數加1即為方法層的圈複雜度;類層次:通過掃描類的抽象語法樹,統計類中的判定節點個數,將該判定節點數加1即為類層次的圈複雜度;同時類層次的圈複雜度應與該類中所有方法的圈複雜度之和相等,並據此對類層次圈複雜度結果進行校驗;系統層:通過掃描整個系統的抽象語法樹,統計系統中的判定節點個數,將該判定節點數加1即為系統層次的圈複雜度;同時系統層次的圈複雜度應與該系統中所有類和方法的圈複雜度之和相等,並據此對系統層圈複雜度進行校驗。進一步的,本發明的方法中,步驟3)中對當前待測版本v_current代碼圈複雜度的評估是通過將類層次和方法層次的度量結果與相關閾值進行比較分析完成的;方法層的圈複雜度的閾值劃分如下:圈複雜度在1-10之間,程序簡單,風險低;複雜度在11-20之間,程序有點複雜,有點風險;複雜度在21-50之間,程序很複雜,高風險;複雜度>50,程序無法看懂;類層的複雜度的閾值設定為50,一個項目中複雜度超過50的類所佔比例應不大於5%。進一步的,本發明的方法中,步驟5)的具體流程為:分別獲取軟體當前版本v_current和前一版本v_last的.java文件的路徑;將兩個版本的源碼進行對比,確定發生變更的所有文件路徑,並存入變更文件路徑集合fileset;遍歷所述變更文件路徑集合fileset中的路徑,並分別在v_current版本和v_last版本中去匹配相應的路徑;將兩個版本中匹配成功的路徑文件分別輸入到源碼差異分析器changedistiller中進行代碼差異分析;提取分析結果,提取與圈複雜變化相關的代碼變更類型,將結果輸入到.csv格式文件中。進一步的,本發明的方法中步驟1)和步驟2)先將所導入的java文件轉化為抽象語法樹ast,再對該語法樹進行遍歷,統計其中「判定節點」的數量,以度量該java文件的圈複雜度。其計算公式為:java文件的圈複雜度=判定節點數+1............................公式1其中,判定節點確定為java語言中以下關鍵字所引導的語句:if,for,while,do,case,catch,&&,||,:?(三目運算符)。這些判定節點在抽象語法樹ast中對應的節點(astnode)如上述表1。在此基礎之上,我們從系統層、類層次以及方法層三個層次對v_current的軟體代碼圈複雜度進行度量。系統層圈複雜度度量將對項目目錄中每一個.java文件中的判定結點進行統計。統計計數器初值為0,每訪問到一個判定結點,統計計數器加1;由於方法的圈複雜度的值最小為1,所以每訪問到一個方法聲明的時候,也會對統計計數器加1。即,系統層的圈複雜度值為所有類中的所有方法的圈複雜度之和。類層圈複雜度度量統計並記錄項目目錄中各個類的全名及其圈複雜度;類的圈複雜度計算為類中每個方法的圈複雜度之和。方法層圈複雜度度量統計並記錄項目中各個方法的全名及其圈複雜度,如公式1所示,圈複雜度值為判定節點數加1。獲取了v_current的圈複雜度數據之後,可以按層次對其進行複雜度評估,考察其類層次和方法層次的複雜度是否超出閾值範圍。系統層圈複雜度與系統的規模密切相關,因此沒有閾值定義。根據業界常用的標準,本發明對方法層圈複雜度的閾值劃分如下:圈複雜度在1-10之間,程序簡單,風險低;複雜度在11-20之間,程序有點複雜,有點風險;複雜度在21-50之間,程序很複雜,高風險;複雜度>50,程序無法看懂。由於沒有找到一個大家普遍認可的類層圈複雜度閾值規範,本發明進行了類層圈複雜度閾值分析實驗以獲取經驗數據:通過對github開原始碼庫(https://github.com)中排名在前157的基於java語言的開源項目的圈複雜度的分析獲取類層圈複雜度的閾值。由於這157個開源項目都是被公認為開發和維護比較好的開源項目,藉此可以確定類層圈複雜度閾值的合理性。閾值是在對上述157個項目進行類層次複雜度度量的基礎上得到的,具體方法如下:(1)對這157個項目分別進行類層圈複雜度的度量。通過度量,我們共得到了132540個類的圈複雜度信息。(2)分析這些數據得到其平均值u和標準差s。通過處理這132540個類的圈複雜度數據,我們得到其平均值u為13.4,標準差為36.7。(3)將閾值設置為u+s。通過對u和s的計算,得到的類層圈複雜度閾值取整後為50。在這157個項目的132540個類中,類層圈複雜度超過50的類個數為6432,佔比僅為5%,剩下95%的類的圈複雜度都是在50以下。據此,本發明對類層圈複雜度的閾值劃分在50以內;一個項目中應將絕大多數(95%)類的複雜度控制在50以內。如果一個類的圈複雜度超過50,則視為複雜類,在後續演化中可以考慮拆分。如果一個項目中超過5%的類都出現了圈複雜度超過50的情況,則該項目的類層圈複雜度過高,後續演化中應考慮架構上的優化。進一步的,本發明的方法中步驟4)通過分析相鄰版本的源碼找出兩版本之間的代碼差異,將結果輸出到格式文件(.csv文件)中。具體算法描述如下:(1)分別獲取軟體當前版本v_current和前一版本v_last的.java文件的路徑;(2)根據步驟4)的結果,確定發生變更的所有文件路徑,並存入變更文件路徑集合fileset;(3)遍歷fileset中的路徑,並分別在v_current版本和v_last版本中去匹配相應的路徑;(4)將兩個版本中匹配成功的路徑文件分別輸入到源碼差異分析器(changedistiller)中進行分析;(5)提取分析結果,提取與圈複雜變化相關的代碼變更類型,將結果輸入到.csv格式文件中。本發明方法可以在對軟體的代碼圈複雜度進行度量評估的基礎上,對演化過程中軟體各版本的代碼複雜度進行對比,對版本間代碼複雜度的變化進行定位和分析。本發明利用代碼圈複雜度度量與評估,分析軟體演化過程中代碼複雜度變化的問題。在軟體演化過程中,利用上述方法對軟體各個演化版本進行代碼圈複雜度的度量和評估,其評估結果可以展現演化過程中軟體代碼的質量變化。對於演化過程中複雜度發生了較大變化的版本,可進行相鄰版本之間的代碼差異分析,確定變更發生的位置,形成分析報告。相關人員可以根據分析報告了解當前版本軟體與前一版本相比發生了哪些演化,分析演化過程中軟體代碼複雜度變化的原因,演化操作對代碼複雜度的影響。有益效果:本發明與現有技術相比,具有以下優點:本發明方法通過對eclipsejdt生成的抽象語法樹進行判定節點的分析和統計,從方法層、類層和系統層度量軟體代碼的圈複雜度,主要用於發現軟體演化中代碼複雜度的變化並對其進行原因分析,與現有技術相比,具有以下優點:(1)本方法利用eclipsejdt將待測java軟體轉化為抽象語法樹,通過對抽象語法樹的遍歷統計規定範圍內代碼的判定節點個數來計算圈複雜度,能夠從不同層面分別計算代碼的圈複雜度。傳統的圈複雜度度量通常用於面向過程程序中的單個函數,或者用於面向對象程序中的方法層面;本方法從系統層、類層次以及方法層次三個層面對軟體的圈複雜度演化進行全面的度量和評估。(2)本方法通過對軟體演化過程中各版本各層面的圈複雜度度量和評估,能夠展現演化過程中軟體代碼各個層面上的複雜度變化;及時對複雜度超標的方法和類提出預警;及時發現演化過程中程序變複雜的趨勢,並對軟體開發人員提出預警。目前,有一些方法通過對軟體複雜度的度量和評估做到了對其中複雜度偏高的方法進行預警,但目前尚未發現有方法針對演化過程中的複雜度變化趨勢做出預警。(3)本方法支持對軟體演化過程中圈複雜度發生明顯變化的版本進行原因分析。現有的代碼複雜度度量方法和工具僅提供對代碼複雜度的度量,而代碼變更分析方法則只提供了對代碼整體變更的分析,並不針對複雜度變化,因而得出的變更信息種類繁雜,難以評判。本方法在獲取各個軟體版本類層次的圈複雜度數據的基礎上,通過對比分析獲取相鄰版本中各類的複雜度變化情況,再通過相鄰版本軟體源碼比對檢測代碼圈複雜度發生了變化的類和方法,對其變更類型、變更細節進行詳盡分析,從而可以定位出圈複雜度演化的原因。附圖說明圖1是基於代碼圈複雜度度量的軟體演化評估方法流程圖,表示典型的通過圈複雜度度量、評估和原因分析促進軟體演化的整個流程。具體實施方式下面結合實施例和說明書附圖對本發明作進一步的說明。圖1給出了基於代碼圈複雜度度量的軟體演化評估方法的流程。實施例中所使用項目為java開源軟體項目jeditor。jeditor是一個基於java的開源文本編輯器,截止目前發布了7個版本,代碼行數在13098-13635之間,下載地址是http://sourceforge.net/projects/jeditor/files/。進行圈複雜度度量評估的的實施例為jeditor0.2版本;在對jeditor各個版本分別進行了度量的基礎上,我們選擇了複雜度變化最大的jeditor0.4和jeditor0.4.1進行圈複雜度演化原因分析的實施例。具體實施方式為:步驟1)使用jdt對jeditor0.2的程序原始碼進行代碼解析,生成抽象語法樹。抽象語法樹(abstractsyntaxtree,ast)作為程序的一種中間表示形式,在代碼解析、程序分析等諸多領域有廣泛的應用。它將java原始碼映射為樹的形式,每個java語法結構被表示成ast節點。java源碼中的判定節點(如if,for等)均被解析為相應的ast節點(astnode),如ifstatement、forstatement等。具體映射規則請見表1。步驟2)根據解析後的ast樹對jeditor0.2進行方法層次、類層次和系統層次的圈複雜度度量和評估。系統層度量掃描整個版本的所有.java文件的ast樹,對每個.java文件中的判定節點個數進行統計,每訪問到一個判定節點,圈複雜度就加1;同時由於方法的圈複雜度的最小值為1,所以每訪問到一個方法聲明時,系統層的圈複雜度也會加1。以此方式度量出整個系統的圈複雜度。類層次度量做相似的操作,對版本中各個類的判定節點個數進行統計,並存入類層圈複雜度信息資料庫表(classmccabeinfo)中。該信息表中存放了項目的名稱、版本號、類名、所屬包名、文件名以及類的圈複雜度信息。方法層度量針對每一個方法進行判定節點的統計,並將度量結果存入方法層圈複雜度信息資料庫表(methodmccabeinfo)中。該信息表中存放了項目的名稱、版本號、方法所屬包名、方法所屬類名、文件名、方法名以及方法的圈複雜度信息。度量完成後,可根據閾值對jeditor0.2版本中的類和方法進行評估分析。根據系統層圈複雜度度量,可得:jeditor0.2的系統圈複雜度值為1983。因為系統層圈複雜度度量結果與系統規模息息相關,無法以普通評估標準對其進行評估,將在演化評估中對其進行分析。根據類層圈複雜度度量,可得:jedtor0.2類總數為96個,其中圈複雜度小於50的有85個,佔總類數目的88.54%;複雜度大於等於50的類有11個,佔比11.46%。根據我們對類層圈複雜度的閾值定義,目前超過閾值的類佔比11.46%,超過5%,建議予以調整。類層度量還可得到所有複雜度大於閾值50的類的全名,並按照複雜度由大到小的順序排列。jeditor0.2中圈複雜度最高的類為jeditor,圈複雜度260。通過人工查看源碼,發現這個類的代碼行達到了2746行,屬性有44個,方法有60個,明顯類中包含功能太多。根據方法層圈複雜度度量,可得:jeditor0.2項目版本的方法總數為550個,圈複雜度小於10的方法有522個,佔總方法個數的94.91%;圈複雜度在10到20之間的有14個,佔比為2.55%;圈複雜度在20到50之間的方法有8個,佔比為1.45%;圈複雜度大於50的方法為6個,佔比為1.09%。具體數據如表2所示:表2.方法的圈複雜度分布表方法圈複雜度(cc)範圍方法個數所佔比例cc<=1052294.91%10<cc<=20142.55%20<cc5061.09%方法層度量也可得到所有複雜度大於閾值的方法的全名,並按照複雜度由大到小的順序排列。jeditor0.2項目版本中圈複雜度最高的方法值為130,是org.jeditor.scripts.perltokenmarker類中的marktokensimpl(byte,segment,int)方法。從軟體代碼庫中獲取jeditor項目的其它6個版本的源碼,分別按照步驟1)和步驟2)進行代碼解析和各層次的圈複雜度度量。jeditor項目各版本系統層圈複雜度度量結果如下:表3.jeditor各版本的系統層圈複雜度jeditor版本號0.20.30.40.4.10.4.20.4.30.4.4系統層圈複雜度cc1983198520002032204720472049jeditor項目各版本類層圈複雜度度量結果如下:表4.jeditor各版本的類層圈複雜度jeditor項目各版本方法層圈複雜度度量結果如下:表5.jeditor各版本的方法層圈複雜度從表3可以看到:各版本中系統圈複雜度最低的是0.2版本,為1983;最高的是0.4.4版本,為2049。從整體趨勢上看,jeditor項目的圈複雜度逐漸提高,在0.4.2版本後趨於穩定。變化幅度最大的是0.4到0.4.1版本,但複雜度增加的數值較小,所以可以看出jeditor項目的整體邏輯結構很穩定,項目版本間的變化較小。因此,以下的對比分析將針對變化幅度最大的0.4到0.4.1版本進行。步驟3)對jeditor0.4和0.4.1版本的類層複雜度信息表(classmccabeinfo)中調取兩個版本中類信息進行分析和比較,定位發生變化的類;然後從相應版本方法層複雜度信息表(methodmccabeinfo)中調取類信息所有度量結果進行分析比較,找出其中質量指標變化之處。通過對兩個版本類層次度量值的比對發現有3個類發生了變化,其中有一個是新增類。由系統分析得:兩個變更類是jappeditor類和filepane類,0.4.1版的新增類是settingsdialog,它們都屬於org.jeditor.app包。步驟5)對jeditor0.4和0.4.1版本的項目源碼本身進行分析比較,找出兩者的代碼差異;進行差異原因分析,對導致度量結果各項變化的原因進行定位,並將結果輸出到csv文件中。通過對兩個版本的項目源碼進行去重比對,發現:jappeditor類中新增3個方法,刪除2個方法,同時其中的actionperformed方法複雜度由2降為1;filepane類中新增1個方法;0.4.1版本的新增類settingsdialog中有19個方法。方法名在此不再贅述。上述實施例僅是本發明的優選實施方式,應當指出:對於本
技術領域:
的普通技術人員來說,在不脫離本發明原理的前提下,還可以做出若干改進和等同替換,這些對本發明權利要求進行改進和等同替換後的技術方案,均落入本發明的保護範圍。當前第1頁12

同类文章

一種新型多功能組合攝影箱的製作方法

一種新型多功能組合攝影箱的製作方法【專利摘要】本實用新型公開了一種新型多功能組合攝影箱,包括敞開式箱體和前攝影蓋,在箱體頂部設有移動式光源盒,在箱體底部設有LED脫影板,LED脫影板放置在底板上;移動式光源盒包括上蓋,上蓋內設有光源,上蓋部設有磨沙透光片,磨沙透光片將光源封閉在上蓋內;所述LED脫影

壓縮模式圖樣重疊檢測方法與裝置與流程

本發明涉及通信領域,特別涉及一種壓縮模式圖樣重疊檢測方法與裝置。背景技術:在寬帶碼分多址(WCDMA,WidebandCodeDivisionMultipleAccess)系統頻分復用(FDD,FrequencyDivisionDuplex)模式下,為了進行異頻硬切換、FDD到時分復用(TDD,Ti

個性化檯曆的製作方法

專利名稱::個性化檯曆的製作方法技術領域::本實用新型涉及一種檯曆,尤其涉及一種既顯示月曆、又能插入照片的個性化檯曆,屬於生活文化藝術用品領域。背景技術::公知的立式檯曆每頁皆由月曆和畫面兩部分構成,這兩部分都是事先印刷好,固定而不能更換的。畫面或為風景,或為模特、明星。功能單一局限性較大。特別是畫

一種實現縮放的視頻解碼方法

專利名稱:一種實現縮放的視頻解碼方法技術領域:本發明涉及視頻信號處理領域,特別是一種實現縮放的視頻解碼方法。背景技術: Mpeg標準是由運動圖像專家組(Moving Picture Expert Group,MPEG)開發的用於視頻和音頻壓縮的一系列演進的標準。按照Mpeg標準,視頻圖像壓縮編碼後包

基於加熱模壓的纖維增強PBT複合材料成型工藝的製作方法

本發明涉及一種基於加熱模壓的纖維增強pbt複合材料成型工藝。背景技術:熱塑性複合材料與傳統熱固性複合材料相比其具有較好的韌性和抗衝擊性能,此外其還具有可回收利用等優點。熱塑性塑料在液態時流動能力差,使得其與纖維結合浸潤困難。環狀對苯二甲酸丁二醇酯(cbt)是一種環狀預聚物,該材料力學性能差不適合做纖

一種pe滾塑儲槽的製作方法

專利名稱:一種pe滾塑儲槽的製作方法技術領域:一種PE滾塑儲槽一、 技術領域 本實用新型涉及一種PE滾塑儲槽,主要用於化工、染料、醫藥、農藥、冶金、稀土、機械、電子、電力、環保、紡織、釀造、釀造、食品、給水、排水等行業儲存液體使用。二、 背景技術 目前,化工液體耐腐蝕貯運設備,普遍使用傳統的玻璃鋼容

釘的製作方法

專利名稱:釘的製作方法技術領域:本實用新型涉及一種釘,尤其涉及一種可提供方便拔除的鐵(鋼)釘。背景技術:考慮到廢木材回收後再加工利用作業的方便性與安全性,根據環保規定,廢木材的回收是必須將釘於廢木材上的鐵(鋼)釘拔除。如圖1、圖2所示,目前用以釘入木材的鐵(鋼)釘10主要是在一釘體11的一端形成一尖

直流氧噴裝置的製作方法

專利名稱:直流氧噴裝置的製作方法技術領域:本實用新型涉及ー種醫療器械,具體地說是ー種直流氧噴裝置。背景技術:臨床上的放療過程極易造成患者的局部皮膚損傷和炎症,被稱為「放射性皮炎」。目前對於放射性皮炎的主要治療措施是塗抹藥膏,而放射性皮炎患者多伴有局部疼痛,對於止痛,多是通過ロ服或靜脈注射進行止痛治療

新型熱網閥門操作手輪的製作方法

專利名稱:新型熱網閥門操作手輪的製作方法技術領域:新型熱網閥門操作手輪技術領域:本實用新型涉及一種新型熱網閥門操作手輪,屬於機械領域。背景技術::閥門作為流體控制裝置應用廣泛,手輪傳動的閥門使用比例佔90%以上。國家標準中提及手輪所起作用為傳動功能,不作為閥門的運輸、起吊裝置,不承受軸向力。現有閥門

用來自動讀取管狀容器所載識別碼的裝置的製作方法

專利名稱:用來自動讀取管狀容器所載識別碼的裝置的製作方法背景技術:1-本發明所屬領域本發明涉及一種用來自動讀取管狀容器所載識別碼的裝置,其中的管狀容器被放在循環於配送鏈上的文檔匣或託架裝置中。本發明特別適用於,然而並非僅僅專用於,對引入自動分析系統的血液樣本試管之類的自動識別。本發明還涉及專為實現讀