一種基于加權(quán)a指數(shù)的軟件包重要性度量方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及一種軟件包重要性度量方法,尤其是涉及一種基于加權(quán)a指數(shù)的軟件 包重要性度量方法。
【背景技術(shù)】
[0002] 計(jì)算機(jī)軟件已經(jīng)滲透到我們工作和日常生活的各個(gè)方面,正在改變并且還將繼續(xù) 改變我們的生活。隨著軟件技術(shù)的發(fā)展和互聯(lián)網(wǎng)的普及,人們對(duì)軟件的依賴與日倶增,對(duì)軟 件質(zhì)量的要求越來(lái)越高。這導(dǎo)致了系統(tǒng)規(guī)模的激增和軟件應(yīng)用環(huán)境的日益復(fù)雜,使得軟件 開發(fā)的風(fēng)險(xiǎn)增加、軟件質(zhì)量很難得到有效的控制。
[0003] 同時(shí)演化性是軟件的本質(zhì)屬性之一。軟件系統(tǒng)同生物一樣,在其生命周期內(nèi),也必 須不斷的演化,否則就有可能提前被淘汰。軟件演化的重要內(nèi)容之一是對(duì)軟件源代碼的修 改。然而要修改代碼,我們必須對(duì)軟件系統(tǒng)有一定的了解。在維護(hù)資源有限的情況下,對(duì)于 一個(gè)新加入的開發(fā)者,加快其對(duì)系統(tǒng)的了解具有比較重要的意義??梢酝ㄟ^為新開發(fā)者推 薦重要的軟件元素(如類、包等)從而加快其對(duì)系統(tǒng)的了解。盡管目前已經(jīng)有不少軟件度量 方面的研究工作,如L0C( Lines of Code)代碼行、McCabe圈復(fù)雜度(Cyclomat ic Complexity)、Halstead度量法、CK度量組、MOOD度量集等,能夠?yàn)檎J(rèn)識(shí)軟件的復(fù)雜性提供一 定的幫助,但是仍有如下不足:
[0004] (1)現(xiàn)有的工作主要集中于度量代碼元素本身的復(fù)雜性,缺少對(duì)代碼元素重要性 的度量。
[0005] (2)現(xiàn)有工作主要是針對(duì)元素級(jí)的度量,度量的往往是軟件的局部特征,如度量一 個(gè)方法、一個(gè)類,缺少?gòu)恼w角度進(jìn)行軟件度量的工作,更缺少?gòu)恼w角度度量軟件元素重 要性的工作。
[0006] 包是目前主流的面向?qū)ο筌浖闹饕獦?gòu)成元素之一。因此,提供一種有效的包重 要性度量方法,從整體角度度量包的重要性,對(duì)于理解軟件,提高代碼維護(hù)效率具有重要意 義。
【發(fā)明內(nèi)容】
[0007] 本發(fā)明的目的在于針對(duì)現(xiàn)有技術(shù)的不足,提供了一種基于加權(quán)a指數(shù)的軟件包重 要性度量方法。
[0008] 本發(fā)明的上述技術(shù)問題主要是通過下述技術(shù)方案得以解決的:一種基于加權(quán)a指 數(shù)的軟件包重要性度量方法,該方法包括以下步驟:
[0009] (1)將Java語(yǔ)言編寫的軟件源代碼在特征粒度抽象為特征依賴網(wǎng)Π )Ν= (Nf,Df)。其 中,Nf為源代碼中特征節(jié)點(diǎn)的集合;Df = {(f i,f j)} (f i eNf,f j eNf)是無(wú)向邊的集合,表示特 征間的依賴關(guān)系。特征包括了 Java源代碼中的屬性和方法。特征間的依賴關(guān)系包括了方法 間的調(diào)用關(guān)系和方法對(duì)屬性的使用關(guān)系。
[0010] (2)基于步驟(1)完成的Π )Ν構(gòu)建類依賴網(wǎng)00~=(隊(duì),0。,?)。其中具為源代碼中類 節(jié)點(diǎn)的集合;〇。(^卽。,(3盧〇。)是一個(gè)無(wú)向邊的集合,表示類之間的依賴關(guān)系;?是一個(gè)|仏 X I N。|的矩陣,代表類之間依賴關(guān)系的強(qiáng)度矩陣。類包含了 Java中的類、內(nèi)部類、抽象類和 接口。類之間的依賴關(guān)系是根據(jù)類包含的特征間的依賴關(guān)系得到的,即類包含的特征間具 有依賴關(guān)系,則相應(yīng)的類之間也存在依賴關(guān)系。
[0011] (3)基于步驟⑵完成的CDN構(gòu)建包依賴網(wǎng)^^二…義^丄其中為為源代碼中包 節(jié)點(diǎn)的集合;〇Ρ(ρ#〇Ρ,ρ^〇Ρ)是一個(gè)無(wú)向邊的集合,表示包之間的依賴關(guān)系;P p是一個(gè)|NP X |NP|的矩陣,代表包之間依賴關(guān)系的強(qiáng)度矩陣。包之間的依賴關(guān)系是根據(jù)包所包含的類 之間的依賴關(guān)系得到的,即包所包含的類間具有依賴關(guān)系,則相應(yīng)的包之間也存在依賴關(guān) 系。
[00?2] (4)基于步驟(3)完成的FON計(jì)算節(jié)點(diǎn)i的加權(quán)h指數(shù)h(i)。
[0013] (5)基于步驟(3)完成的FON計(jì)算節(jié)點(diǎn)i的加權(quán)cit指數(shù)cit(i)。
[0014] (6)基于步驟(4)和步驟(5)計(jì)算節(jié)點(diǎn)i的加權(quán)a指數(shù)
[0015] (7)基于步驟(4)、(5)和(6)計(jì)算PDN中所有節(jié)點(diǎn)的加權(quán)a指數(shù),作為節(jié)點(diǎn)相應(yīng)包的 重要性值。
[0016] 進(jìn)一步地,上述步驟(2)中⑶N的構(gòu)建具體包括以下子步驟:
[0017] (2.1)提取Java語(yǔ)言編寫的源代碼中的所有類,構(gòu)建一個(gè)只有節(jié)點(diǎn)沒有邊的⑶N, 即⑶N= (N。,Φ,P)。Φ代表邊集為空,同時(shí)P是一個(gè)零矩陣。
[0018] (2.2)取步驟(1)加中的一條邊(心,灼)6加,根據(jù)源代碼得到匕和灼所定義的類,若 fi在類k中定義,f j在類p中定義,若k矣p,則將(k,p)加入D。,同時(shí)步驟(2.1)中P相應(yīng)位置的P (k,p)自加1;若k與p相等,則不做任何處理。
[0019] (2 · 3)重復(fù)步驟(2 · 2),直到遍歷完Π )Ν中的所有邊。
[0020] 進(jìn)一步地,上述步驟(3)中TON的構(gòu)建具體包括以下子步驟:
[0021] (3.1)提取Java語(yǔ)言編寫的源代碼中的所有包,構(gòu)建一個(gè)只有節(jié)點(diǎn)沒有邊的PDN, 即PDN= (ΝΡ,Φ,Pp)。Φ代表邊集為空,同時(shí)-個(gè)零矩陣。
[0022] (3.2)取步驟(2)0。中的一條邊((:1,(^)6〇。,根據(jù)源代碼得到(3 1和(^所定義的包,若 ci在包k中定義,cj在包p中定義,若k矣p,則將(k,p)加入DP,同時(shí)步驟(3.1)中Pp相應(yīng)位置的 PP(k,p)加上P(i,j);若k與p相等,則不做任何處理。
[0023] (3.3)重復(fù)步驟(3.2),直到遍歷完⑶N中的所有邊。
[0024] 進(jìn)一步地,上述步驟(4)中節(jié)點(diǎn)i的加權(quán)h指數(shù)h (i)的計(jì)算具體包括以下子步驟:
[0025] (4.1)求步驟(3)所得PDN中所有節(jié)點(diǎn)的節(jié)點(diǎn)權(quán)。節(jié)點(diǎn)j的節(jié)點(diǎn)權(quán)Sj定義為PDN中與 該節(jié)點(diǎn)相連的所有邊的權(quán)重和,即:
[0027]其中,Vj是節(jié)點(diǎn)j的鄰居節(jié)點(diǎn)集合。
[0028] (4.2)求步驟(3)所得TON中節(jié)點(diǎn)i的鄰居節(jié)點(diǎn)集合Vi。
[0029] (4.3)將^中的節(jié)點(diǎn)按其節(jié)點(diǎn)權(quán)降序排列(若存在節(jié)點(diǎn)權(quán)相等的情況,則相等的幾 個(gè)值隨機(jī)選擇一種可能的排序),得到排序后的數(shù)組list,list[l]位置存放的是節(jié)點(diǎn)權(quán)最 大的那個(gè)節(jié)點(diǎn)。
[0030] (4.4)從list[1]開始,依次遍歷list列表中的每個(gè)節(jié)點(diǎn)list[q],找到第一個(gè)滿足 節(jié)點(diǎn)權(quán)小于(n+1)的節(jié)點(diǎn)1 ist [n+1 ],則節(jié)點(diǎn)i的加權(quán)h指數(shù)h(i)為η。
[0031] 進(jìn)一步地,上述步驟(5)中節(jié)點(diǎn)i的加權(quán)cit指數(shù)cit(i)的計(jì)算具體包括以下子步 驟:
[0032] (5.1)求步驟(3)所得PDN中所有節(jié)點(diǎn)的節(jié)點(diǎn)權(quán)。節(jié)點(diǎn)j的節(jié)點(diǎn)權(quán)s j定義為PDN中與 該節(jié)點(diǎn)相連的所有邊的權(quán)重和,即:
[0034]其中,Vj是節(jié)點(diǎn)j的鄰居節(jié)點(diǎn)集合。
[0035] (5.2)求步驟(3)所得TON中節(jié)點(diǎn)i的鄰居節(jié)點(diǎn)集合Vi。
[0036] (5.3)將^中的節(jié)點(diǎn)按其節(jié)點(diǎn)權(quán)降序排列(若存在節(jié)點(diǎn)權(quán)相等的情況,則相等的幾 個(gè)值隨機(jī)選擇一種可能的排序),得到排序后的數(shù)組list,list[l]位置存放的是節(jié)點(diǎn)權(quán)最 大的那個(gè)節(jié)點(diǎn),list[ | Vl | ]位置存放的是節(jié)點(diǎn)權(quán)最小的那個(gè)節(jié)點(diǎn)(| Vl |為^中節(jié)點(diǎn)個(gè)數(shù))。
[0037]
節(jié)點(diǎn)i的加權(quán)cit指數(shù)cit(i)。
[0038] 與現(xiàn)有技術(shù)相比,本發(fā)明具有以下優(yōu)點(diǎn)和積極效果:
[0039] (1)本發(fā)明中加權(quán)a指數(shù)的構(gòu)建都考慮了軟件作為一個(gè)整體的影響,因?yàn)闃?gòu)建a指 數(shù)所使用的加權(quán)h指數(shù)和加權(quán)cit指數(shù)都考慮了網(wǎng)絡(luò)中其它節(jié)點(diǎn)的節(jié)點(diǎn)權(quán),是一種整體視 角,在一定程度上克服了現(xiàn)有方法只關(guān)注局部特征忽略整體特征的問題。
[0040] (2)本發(fā)明提出用加權(quán)a指數(shù)度量軟件中包的重要性,在一定程度上克服了現(xiàn)有方 法只關(guān)注軟件元素復(fù)雜性的度量,忽略軟件元素重要性度量的問題,可以為理解軟件、提高 代碼維護(hù)效率提供支持。
【附圖說(shuō)明】
[0041] 圖1本發(fā)明的Java語(yǔ)言編寫的源代碼片段;
[0042]圖2本發(fā)明的實(shí)施例構(gòu)建的Π )Ν;
[0043] 圖3本發(fā)明的實(shí)施例構(gòu)建的無(wú)邊⑶Ν;
[0044] 圖4本發(fā)明的實(shí)施例構(gòu)建的無(wú)邊CDN相應(yīng)的Ρ;
[0045] 圖5本發(fā)明的實(shí)施例構(gòu)建的無(wú)邊⑶Ν加入一條邊后的⑶Ν;