圈復(fù)雜度度量以軟件的結(jié)構(gòu)流程圖為基礎(chǔ)?刂屏鞒虉D描述了軟件模塊的邏輯結(jié)構(gòu)。一個(gè)模塊在典型的語言中是一個(gè)函數(shù)或子程序,有一個(gè)入口和一個(gè)出口,也可以通過調(diào)用/返回機(jī)制設(shè)計(jì)模塊。軟件模塊的每個(gè)執(zhí)行路徑,都有與從模塊的控制流程圖中的入口到出口的節(jié)點(diǎn)相符合的路徑。
“Cyclomatic”來源于非直接連接基本測(cè)試周期的數(shù)目,更重要的是,也通過直接相連的圖表給出獨(dú)立路徑的數(shù)目。通過圖表的相關(guān)性,一個(gè)節(jié)點(diǎn)可到達(dá)另一個(gè)節(jié)點(diǎn)。
圈復(fù)雜度度量也可作為模塊基本流程圖路徑的數(shù)目,其重點(diǎn)在于模塊線形組合后,所產(chǎn)生的路徑數(shù)目是最小的。
對(duì)圈復(fù)雜度的限制
現(xiàn)在有許多好方法可以用來限制圈復(fù)雜度。過于復(fù)雜的模塊容易出錯(cuò),難于理解、測(cè)試、更正,所以應(yīng)當(dāng)在軟件開發(fā)的各個(gè)階段有意識(shí)地限制復(fù)雜度,許多開發(fā)者已經(jīng)成功地實(shí)現(xiàn)把對(duì)軟件復(fù)雜度的限制作為軟件項(xiàng)目的一部分,盡管在確切的數(shù)目上略微有些爭議。最初支持的數(shù)目是10,現(xiàn)在支持?jǐn)?shù)目可達(dá)15。但是,只應(yīng)當(dāng)在條件較好的情況下使數(shù)目大于10,例如開發(fā)者非常有經(jīng)驗(yàn),設(shè)計(jì)合乎正式標(biāo)準(zhǔn),使用現(xiàn)代化的程序語言、結(jié)構(gòu)程序、代碼預(yù)排和先進(jìn)的測(cè)試計(jì)劃。換句話說,開發(fā)團(tuán)隊(duì)可以選擇超過10的限制數(shù)目,但是必須根據(jù)經(jīng)驗(yàn)進(jìn)行一些取舍,把精力花在比較復(fù)雜的模塊上。
Essential Complexity (ev(G))基本復(fù)雜度
基本復(fù)雜度是用來衡量程序非結(jié)構(gòu)化程度的,非結(jié)構(gòu)成分降低了程序的質(zhì)量,增加了代碼的維護(hù)難度,使程序難于理解。因此,基本復(fù)雜度高意味著非結(jié)構(gòu)化程度高,難以模塊化和維護(hù)。實(shí)際上,消除了一個(gè)錯(cuò)誤有時(shí)會(huì)引起其他的錯(cuò)誤。
計(jì)算方法
將圈復(fù)雜度圖中的結(jié)構(gòu)化部分簡化成一個(gè)點(diǎn),計(jì)算簡化以后流程圖的圈復(fù)雜度就是基本復(fù)雜度。
優(yōu)點(diǎn)
衡量非結(jié)構(gòu)化程度;反映代碼的質(zhì)量;預(yù)測(cè)代碼維護(hù)量,輔助模塊劃分;與所用的高級(jí)程序設(shè)計(jì)語言類型無關(guān)。
應(yīng)用
當(dāng)基本復(fù)雜度為1,這個(gè)模塊是充分結(jié)構(gòu)化的;當(dāng)基本復(fù)雜度大于1而小于圈復(fù)雜度,這個(gè)模塊是部分結(jié)構(gòu)化的;當(dāng)基本復(fù)雜度等于圈復(fù)雜度,這個(gè)模塊是完全非結(jié)構(gòu)化的。
Module Design Complexity (iv(G))模塊設(shè)計(jì)復(fù)雜度
模塊設(shè)計(jì)復(fù)雜度是用來衡量模塊判定結(jié)構(gòu),即模塊和其他模塊的調(diào)用關(guān)系。軟件模塊設(shè)計(jì)復(fù)雜度高意味模塊耦合度高,這將導(dǎo)致模塊難于隔離、維護(hù)和復(fù)用。
計(jì)算方法
模塊設(shè)計(jì)復(fù)雜度是從模塊流程圖中移去那些不包含調(diào)用子模塊的判定和循環(huán)結(jié)構(gòu)后得出的圈復(fù)雜度,因此模塊設(shè)計(jì)復(fù)雜度不能大于圈復(fù)雜度,通常是遠(yuǎn)小于圈復(fù)雜度。
優(yōu)點(diǎn)
衡量模塊對(duì)其下層模塊的支配作用;衡量一個(gè)模塊到其子模塊進(jìn)行集成測(cè)試的最小數(shù)量;定位可能多余的代碼;以復(fù)雜的計(jì)算邏輯和設(shè)計(jì)來區(qū)分模塊;是設(shè)計(jì)復(fù)雜度(S0)和集成復(fù)雜度(S1)計(jì)算的基礎(chǔ);與所用的高級(jí)程序設(shè)計(jì)語言類型無關(guān)。
Design Complexity (S0)設(shè)計(jì)復(fù)雜度
設(shè)計(jì)復(fù)雜度以數(shù)量來衡量程序模塊之間的相互作用關(guān)系,它提供了系統(tǒng)級(jí)模塊設(shè)計(jì)復(fù)雜度的概況,有助于衡量進(jìn)行自底向上集成測(cè)試的效果,而且提供了全面衡量程序設(shè)計(jì)規(guī)格和復(fù)雜度的數(shù)據(jù),不反映獨(dú)立模塊的內(nèi)部情況。高設(shè)計(jì)復(fù)雜度的系統(tǒng)意味著系統(tǒng)各部分之間有著復(fù)雜的相互關(guān)系,這樣系統(tǒng)將難以維護(hù)。
S0是程序中所有模塊設(shè)計(jì)復(fù)雜度之和,計(jì)算公式如下:
優(yōu)點(diǎn)
可應(yīng)用于完整的軟件,也可應(yīng)用于任何子系統(tǒng);衡量代碼的質(zhì)量;指出一個(gè)模塊整體的復(fù)雜度,反映了每個(gè)模塊和其內(nèi)部模塊的控制關(guān)系;揭示了程序中模塊調(diào)用的復(fù)雜度;有助于集成復(fù)雜度的計(jì)算。
Integration Complexity (S1)集成復(fù)雜度
集成復(fù)雜度是為了防止錯(cuò)誤所必須進(jìn)行的集成測(cè)試的數(shù)量表示,另一種說法是程序中獨(dú)立線性子樹的數(shù)目,一棵子樹是一個(gè)有返回的調(diào)用序列。就像圈復(fù)雜度是測(cè)試路徑的數(shù)目,而集成復(fù)雜度是程序或其子系統(tǒng)的獨(dú)立線性子樹。
計(jì)算方法
一個(gè)程序的集成復(fù)雜度和一個(gè)模塊的圈復(fù)雜度是非常相似的,必須計(jì)算對(duì)程序進(jìn)行完全測(cè)試所需集成測(cè)試的數(shù)目。S1的計(jì)算公式:
S1=S0-N+1
N是程序中模塊的數(shù)目。
優(yōu)點(diǎn)
有助于集成測(cè)試的實(shí)施;量化集成測(cè)試工作且反映了系統(tǒng)設(shè)計(jì)復(fù)雜度;有助于從整體上隔離系統(tǒng)復(fù)雜度。
Number of Lines (nl)行數(shù)
行數(shù)是模塊中總的行數(shù),包括代碼和注釋。
優(yōu)點(diǎn):
計(jì)算簡單;與所用的高級(jí)程序設(shè)計(jì)語言類型無關(guān);指出了模塊的行數(shù)(即模塊的規(guī)模),規(guī)模小的模塊易于理解和維護(hù)。
Normalized Complexity (nv)規(guī)范化復(fù)雜度
規(guī)范化復(fù)雜度是圈復(fù)雜度除以行數(shù)。
計(jì)算方法
nv=v(G)/nl
優(yōu)點(diǎn)
與所用的高級(jí)程序設(shè)計(jì)語言類型無關(guān);定義那些有著顯著判定邏輯密度的模塊,這些模塊相對(duì)于其他常見規(guī)范模塊需要做更多的維護(hù)工作。
Global Data Complexity (gdv(G))全局?jǐn)?shù)據(jù)復(fù)雜度
全局?jǐn)?shù)據(jù)復(fù)雜度(需有McCabe Data)量化了模塊結(jié)構(gòu)和全局?jǐn)?shù)據(jù)變量的關(guān)系,它說明了模塊對(duì)外部數(shù)據(jù)的依賴程度,同時(shí)度量了全局?jǐn)?shù)據(jù)的測(cè)試工作,也描述了模塊之間的耦合關(guān)系,能反映潛在的維護(hù)問題。
對(duì)于如何跟蹤全局?jǐn)?shù)據(jù)使用情況的更多信息,可以參考《McCabe Data in Using McCabe IQ Add-Ons》。
Specified Data Complexity (sdv(G))局部數(shù)據(jù)復(fù)雜度
局部數(shù)據(jù)復(fù)雜度(需有McCabe Data)量化了模塊結(jié)構(gòu)和用戶局部數(shù)據(jù)變量的關(guān)系,同時(shí)度量了局部數(shù)據(jù)的測(cè)試工作。
我們能夠使用McCabe Data的數(shù)據(jù)字典選擇單獨(dú)的數(shù)據(jù)元素,指出每個(gè)數(shù)據(jù)元素具體的數(shù)據(jù)類型。局部數(shù)據(jù)復(fù)雜度還提供了其他的數(shù)據(jù)選擇準(zhǔn)則,量化了每個(gè)模塊中相應(yīng)數(shù)據(jù)對(duì)模塊控制結(jié)構(gòu)的影響。
關(guān)于數(shù)據(jù)字典的更多信息,參考文檔《McCabe Data in Using McCabe IQ Add-Ons.》。
Pathological Complexity (pv(G))病態(tài)數(shù)據(jù)復(fù)雜度
病態(tài)數(shù)據(jù)復(fù)雜度衡量一個(gè)模塊包含的完全非結(jié)構(gòu)化成份的程度,標(biāo)出向循環(huán)內(nèi)部跳入的問題代碼,而這些部分具有最大的風(fēng)險(xiǎn)度,通常需要重新設(shè)計(jì)。
計(jì)算方法
所有的非結(jié)構(gòu)部分除去向循環(huán)內(nèi)跳入的結(jié)構(gòu),轉(zhuǎn)化為線結(jié)構(gòu),病態(tài)復(fù)雜度就等于簡化以后流程圖的圈復(fù)雜度。
優(yōu)點(diǎn)
與所用的高級(jí)程序設(shè)計(jì)語言類型無關(guān);指出了可靠性的問題,降低了維護(hù)風(fēng)險(xiǎn);幫助識(shí)別極不可靠的軟件。
Halstead Metrics(Halstead 復(fù)雜度)
McCabe QA能夠?yàn)樗x擇的語言產(chǎn)生Halstead Metrics復(fù)雜度。Halstead復(fù)雜度是以程序中出現(xiàn)的運(yùn)算符和運(yùn)算元為計(jì)數(shù)對(duì)象,以它們出現(xiàn)的次數(shù)作為計(jì)數(shù)目標(biāo)(直接測(cè)量指標(biāo)),然后據(jù)以計(jì)算出程序容量、工作量。
優(yōu)點(diǎn)
不要求對(duì)程序結(jié)構(gòu)進(jìn)行深層次分析;能夠預(yù)測(cè)錯(cuò)誤率;預(yù)測(cè)維護(hù)工作量;有利于項(xiàng)目規(guī)劃,衡量所有程序的復(fù)雜度;計(jì)算方法簡單;與所用的高級(jí)程序設(shè)計(jì)語言類型無關(guān);眾多研究結(jié)構(gòu)研究表明Halstead復(fù)雜度對(duì)于預(yù)測(cè)程序工作計(jì)劃和程序的Bug非常有用。
Line Count復(fù)雜度描述了Line Count復(fù)雜度并列出了它們的優(yōu)點(diǎn)
Line Count Metrics(Line Count復(fù)雜度)
優(yōu)點(diǎn)
軟件物理規(guī)模的度量;定義了具體的Line Count數(shù)據(jù),例如注釋行和空行;協(xié)助指出難于理解的模塊。





