復(fù)雜度
70年代,軟件系統(tǒng)已經(jīng)變得極其復(fù)雜,無論是開發(fā)還是維護(hù)都是一項(xiàng)成本高昂的工作。人們意識(shí)到必須使軟件模塊化,以便于開發(fā)、測(cè)試和維護(hù)。為此,成立于1976的McCabe&Associates公司開發(fā)出了McCabe Cyclomatic Complexity Metric(圈復(fù)雜度)技術(shù)對(duì)軟件進(jìn)行結(jié)構(gòu)測(cè)試。Metric以軟件復(fù)雜度測(cè)量的數(shù)目為基礎(chǔ),能幫助工程師識(shí)別難于測(cè)試和維護(hù)的模塊,圈復(fù)雜度已經(jīng)成為評(píng)估軟件質(zhì)量的一個(gè)重要標(biāo)準(zhǔn)。人們可以用圈復(fù)雜度對(duì)軟件的復(fù)雜度和質(zhì)量進(jìn)行衡量,來安排工程進(jìn)度,在成本、進(jìn)度和性能之間尋求平衡。
復(fù)雜度的種類
有模塊、類和程序三類復(fù)雜度。模塊復(fù)雜度包含了關(guān)于模塊的復(fù)雜度信息;類復(fù)雜度是針對(duì)那些使用McCabe面向?qū)ο筇匦缘某绦?它包含了關(guān)于類的復(fù)雜度信息;程序復(fù)雜度包含了關(guān)于程序的復(fù)雜度信息。
集成復(fù)雜度報(bào)告
對(duì)應(yīng)于三種復(fù)雜度的是三種復(fù)雜度報(bào)告。如果一個(gè)報(bào)告的復(fù)雜度信息不只一種,那么就把這些復(fù)雜度信息組合成新的報(bào)告。
集成復(fù)雜度信息只收集一個(gè)部件及其下級(jí)的信息。例如:如果一個(gè)程序級(jí)報(bào)告包含一個(gè)類復(fù)雜度,那么只報(bào)告組成程序的類的信息,而不包含類組成的信息。
McCabe復(fù)雜度
McCabe復(fù)雜度是對(duì)軟件結(jié)構(gòu)進(jìn)行嚴(yán)格的算術(shù)分析得來的,實(shí)質(zhì)上是對(duì)程序拓?fù)浣Y(jié)構(gòu)復(fù)雜性的度量,明確指出了任務(wù)復(fù)雜部分。McCabe復(fù)雜度包括:圈復(fù)雜度、基本復(fù)雜度、模塊設(shè)計(jì)復(fù)雜度、設(shè)計(jì)復(fù)雜度、集成復(fù)雜度、行數(shù)、規(guī)范化復(fù)雜度、全局?jǐn)?shù)據(jù)復(fù)雜度、局部數(shù)據(jù)復(fù)雜度、病態(tài)數(shù)據(jù)復(fù)雜度。
McCabe復(fù)雜度的用途
在軟件工程中,有三種使用McCabe復(fù)雜性度量的方式。
作為測(cè)試的輔助工具。McCabe復(fù)雜性度量的結(jié)果等于通過一個(gè)子程序的路徑數(shù),因而需要設(shè)計(jì)同樣多的測(cè)試案例以覆蓋所有的路徑。如果測(cè)試案例數(shù)小于復(fù)雜性數(shù),則有三種情況一是需要更多的測(cè)試;二是某些判斷點(diǎn)可以去掉;三是某些判斷點(diǎn)可用插入式代碼替換。
作為程序設(shè)計(jì)和管理指南。在軟件開發(fā)中,需要一種簡(jiǎn)單的方式指出可能出問題的子程序。保持子程序簡(jiǎn)單的通用方法是設(shè)置一個(gè)長(zhǎng)度限制,例如50行或2頁,但這實(shí)際上是在缺乏測(cè)試簡(jiǎn)明性的有效方法時(shí)無可奈何的替代方法。不少人認(rèn)為McCabe度量就是這樣一種簡(jiǎn)明性度量。但是要注意,McCabe度量數(shù)大的程序,不見得結(jié)構(gòu)化就不好。例如,Case語句是良結(jié)構(gòu)的,但可能有很大的McCabe度量數(shù)(依賴于語句中的分支數(shù)),這可能是由于問題和解決方案所固有的復(fù)雜性所決定的。使用者應(yīng)當(dāng)自己決定如何使用McCabe度量所提供的信息。
作為網(wǎng)絡(luò)復(fù)雜性度量的一種方法。Hall和Preiser提出了一種組合網(wǎng)絡(luò)復(fù)雜性度量,用于度量可能由多個(gè)程序員組按模塊化原理建立的大型軟件系統(tǒng)的復(fù)雜性。他們提出的組合度量公式為
式中C1,...,Ck是各個(gè)模塊的復(fù)雜性;CN是網(wǎng)絡(luò)復(fù)雜性;W1和W2為權(quán)值。
McCabe復(fù)雜度即可用于度量各個(gè)模塊的復(fù)雜性,也可用于度量網(wǎng)絡(luò)復(fù)雜性。
Cyclomatic Complexity (v(G))圈復(fù)雜度