程序復(fù)雜度之圈復(fù)雜度

圈復(fù)雜度(Cyclomatic complexity)也稱為條件復(fù)雜度或循環(huán)復(fù)雜度桥爽,是一種軟件度量肥矢,是由Thomas J. McCabe, Sr. 在 1976 年提出哈垢,用來表示程序的復(fù)雜度忠烛,其符號(hào)為 VG 或是 M概耻。圈復(fù)雜度是對(duì)源代碼中線性獨(dú)立路徑數(shù)的定量測量芥喇。

圈復(fù)雜度使用的程序的控制流圖來計(jì)算:在圖中的節(jié)點(diǎn)對(duì)應(yīng)于程序中一組不可分割的命令[代碼行]西采,有向邊連接兩個(gè)可連續(xù)執(zhí)行的節(jié)點(diǎn);[可連續(xù)執(zhí)行的兩個(gè)節(jié)點(diǎn):第二個(gè)節(jié)點(diǎn)的命令組可能在第一個(gè)節(jié)點(diǎn)執(zhí)行后立刻開始執(zhí)行]继控。圈復(fù)雜度可以應(yīng)用到獨(dú)立的功能械馆,模塊,方法或類武通。

基礎(chǔ)路徑測試:通過測試用例測試程序中的每個(gè)線性無關(guān)的獨(dú)立路徑霹崎;在這種測試策略下,測試用例的數(shù)目將等于該程序的圈復(fù)雜度冶忱;

圈復(fù)雜度定義

圈復(fù)雜度度量的是程序中線性獨(dú)立路徑的數(shù)量尾菇;例如:如果程序中不包含控制、判斷囚枪、條件語句(例如 if派诬,swith 等),那么復(fù)雜度就是 1 链沼;因?yàn)檎麄€(gè)程序只有一條執(zhí)行路徑默赂;如果程序包含一條IF語句,那么就會(huì)有兩條路徑來執(zhí)行完整個(gè)程序(IF為 TRUE括勺,IF 為 FALSE)放可,所以這時(shí)候的復(fù)雜度就是 2;兩個(gè)嵌套的 IF 語句朝刊,或者包含兩個(gè)判斷條件的一個(gè) IF 語句耀里,復(fù)雜度就是 4;

在數(shù)學(xué)上拾氓,一個(gè)結(jié)構(gòu)化程序的圈復(fù)雜度通過該程序的控制流圖來定義冯挎;控制流圖包含程序的基本塊(圖的節(jié)點(diǎn)),和兩個(gè)基本塊之間可執(zhí)行性(圖的邊)。

原理:


上圖:單程序的控制流圖房官。此程序由紅色的節(jié)點(diǎn)開始運(yùn)行趾徽,然后進(jìn)入循環(huán)(紅色節(jié)點(diǎn)下由三個(gè)節(jié)點(diǎn)組成),離開循環(huán)后有條件分支翰守,最后運(yùn)行藍(lán)色節(jié)點(diǎn)后結(jié)束孵奶,此控制流圖中,E = 9, N = 8, P = 1蜡峰,因此其圈復(fù)雜度為 9 - 8 + (2*1) = 3

數(shù)學(xué)表達(dá)式:

                    M = E - N + 2P

其中
E 為圖中邊的個(gè)數(shù)
N 為圖中節(jié)點(diǎn)的個(gè)數(shù)
P 為連接組件的個(gè)數(shù)

強(qiáng)連通圖的圈復(fù)雜度定義:要求做完線上功能的先要求線上的功能

上圖:對(duì)應(yīng)同一個(gè)程序的控制流圖了袁,但多加一個(gè)從結(jié)束點(diǎn)到啟始點(diǎn)的邊,因此為強(qiáng)連通的控制流圖湿颅,若利用此圖計(jì)算圈復(fù)雜度载绿,其公式為 M=E-N+P,而 E = 10油航、N = 8崭庸、P = 1,因此圈復(fù)雜度為 3
另一個(gè)計(jì)算圈復(fù)雜度的公式用與計(jì)算每一個(gè)結(jié)束節(jié)點(diǎn)總是連接到啟動(dòng)節(jié)點(diǎn)的流程控制圖谊囚;這種圖稱為強(qiáng)連通的怕享;此時(shí)的圈復(fù)雜度就是圖中回路的個(gè)數(shù),也稱為第一貝蒂數(shù)[first Betti number])镰踏,其公式如下:

                      M = E - N + P

上式可以視為計(jì)算圖中線性獨(dú)立回路(回路內(nèi)不包括其他回路)的個(gè)數(shù)熬粗,由于控制流圖增加結(jié)束點(diǎn)到啟始點(diǎn)的邊,因此對(duì)應(yīng)一個(gè)結(jié)束點(diǎn)至少會(huì)有一個(gè)回路余境。
對(duì)于單一的程序(或副程序或方法),P 恒為 1灌诅。對(duì)于單一子程序芳来,該公式可以簡單的表達(dá)為:

                      M = E - N + 2

圈復(fù)雜度可以適用于同時(shí)分析許多程序或副程序的情形(例如針對(duì)一個(gè)類中的所有方法),此時(shí) P 等于程序的個(gè)數(shù)猜拾,因?yàn)槊恳粋€(gè)程序的圖都是一個(gè)獨(dú)立的連接組件即舌。若每一個(gè)程序都只一個(gè)結(jié)束點(diǎn),P 也可以視為是結(jié)束點(diǎn)的個(gè)數(shù)挎袜。

McCache 證明了任何只有一個(gè)進(jìn)入點(diǎn)和一個(gè)技術(shù)點(diǎn)的結(jié)構(gòu)化程序顽聂,其圈復(fù)雜度等于程序中決策點(diǎn)(IF,F(xiàn)OR loops)的個(gè)數(shù)加 1盯仪;

圈復(fù)雜度也可以延伸到多個(gè)結(jié)束點(diǎn)的程序紊搪,此時(shí)的圈復(fù)雜度如下:

                       π - s + 2

其中
π 是程序中決策點(diǎn)的個(gè)數(shù)

s 為結(jié)束點(diǎn)的個(gè)數(shù)

圈復(fù)雜度應(yīng)用

限制軟件復(fù)雜度
麥凱布提出圈復(fù)雜度時(shí),其原始目的之一就是希望在軟件開發(fā)過程中就限制其復(fù)雜度全景。他建議程序設(shè)計(jì)者需計(jì)算其開發(fā)模塊的復(fù)雜度耀石,若一模塊的圈復(fù)雜度超過 10,需再分區(qū)為更小的模塊爸黄。NIST(國家標(biāo)準(zhǔn)技術(shù)研究所)的結(jié)構(gòu)化測試方法論已此作法略作調(diào)整滞伟,在一些特定情形下揭鳞,模塊圈復(fù)雜度上限放寬到 15 會(huì)比較合適。此方法論也承認(rèn)有些特殊情形下梆奈,模塊的復(fù)雜度需要超過上述的上限野崇,其建議為“模塊的圈復(fù)雜度需在上限范圍以內(nèi),否則需提供書面數(shù)據(jù)亩钟,說明為何此模塊圈復(fù)雜度有必要超過上限乓梨。”

評(píng)估軟件的結(jié)構(gòu)化程度 「structuredness」
Essential complexity (numerical measure of "structuredness")

啟示軟件測試工作

圈復(fù)雜度決定了需要多少個(gè)測試用來達(dá)到特定模塊測試覆蓋率要求径荔;

模塊內(nèi)聚性的評(píng)估
可以預(yù)期一個(gè)復(fù)雜度較高模塊的內(nèi)聚性會(huì)比較低督禽,至少不會(huì)到功能內(nèi)聚性的程度。一個(gè)有高復(fù)雜度及低內(nèi)聚性的模塊中會(huì)有許多的決策點(diǎn)总处,這類的模塊多半運(yùn)行超過一個(gè)明確定義的任務(wù)狈惫,因此內(nèi)聚性較低。一個(gè) 2005 年的研究發(fā)現(xiàn)復(fù)雜度的度量和由專家評(píng)估的模塊內(nèi)聚性有高度負(fù)相關(guān)鹦马,反而針對(duì)內(nèi)聚性設(shè)計(jì)的度量和專家評(píng)估結(jié)果之間的相關(guān)性還比較不明顯[6]胧谈。

推測軟件缺陷個(gè)數(shù)

許多研究指出一模塊及方法的圈復(fù)雜度和其中的缺陷個(gè)數(shù)有相關(guān)性,許多這類研究發(fā)現(xiàn)圈復(fù)雜度和缺陷個(gè)數(shù)有高度的正相關(guān):圈復(fù)雜度最高的模塊及方法荸频,其中的缺陷個(gè)數(shù)也最多菱肖。

不過,有些研究是在控制模塊大小相近的情形下進(jìn)行分析(例如比較二個(gè)源代碼行數(shù)相近旭从,但圈復(fù)雜度不同模塊的缺陷個(gè)數(shù))稳强,許多這類的研究發(fā)現(xiàn)圈復(fù)雜度和缺陷個(gè)數(shù)沒有明顯相關(guān),不過仍有一些研究認(rèn)為在此情形下二者仍有相關(guān)性和悦。有些此領(lǐng)域的研究者認(rèn)為那些研究結(jié)果圈復(fù)雜度和缺陷個(gè)數(shù)沒有明顯相關(guān)的研究退疫,其研究方法的有效性可能有問題。

萊斯·哈頓認(rèn)為利用圈復(fù)雜度來預(yù)測缺陷個(gè)數(shù)鸽素,和利用源代碼行數(shù)來預(yù)測缺陷個(gè)數(shù)的結(jié)果大致相近褒繁。

OneAPM Mobile Insight 以真實(shí)用戶體驗(yàn)為度量標(biāo)準(zhǔn)進(jìn)行 Crash 分析,監(jiān)控網(wǎng)絡(luò)請(qǐng)求及網(wǎng)絡(luò)錯(cuò)誤馍忽,提升用戶留存棒坏。訪問 OneAPM 官方網(wǎng)站感受更多應(yīng)用性能優(yōu)化體驗(yàn),想閱讀更多技術(shù)文章遭笋,請(qǐng)?jiān)L問 OneAPM 官方技術(shù)博客坝冕。
本文轉(zhuǎn)自 OneAPM 官方博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末趁尼,一起剝皮案震驚了整個(gè)濱河市孩擂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌牡属,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谎替,死亡現(xiàn)場離奇詭異偷溺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)钱贯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門挫掏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人秩命,你說我怎么就攤上這事尉共。” “怎么了弃锐?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵袄友,是天一觀的道長。 經(jīng)常有香客問我霹菊,道長剧蚣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任旋廷,我火速辦了婚禮鸠按,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饶碘。我一直安慰自己目尖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布扎运。 她就那樣靜靜地躺著瑟曲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪豪治。 梳的紋絲不亂的頭發(fā)上洞拨,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音鬼吵,去河邊找鬼。 笑死篮赢,一個(gè)胖子當(dāng)著我的面吹牛齿椅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播启泣,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼涣脚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了寥茫?” 一聲冷哼從身側(cè)響起遣蚀,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后芭梯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體险耀,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年玖喘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了甩牺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡累奈,死狀恐怖贬派,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情澎媒,我是刑警寧澤搞乏,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站戒努,受9級(jí)特大地震影響请敦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜柏卤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一冬三、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缘缚,春花似錦勾笆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至齐媒,卻和暖如春蒲每,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背喻括。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國打工邀杏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人唬血。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓望蜡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拷恨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子脖律,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,129評(píng)論 25 707
  • 銀行軟件測試面試問題 軟件測試經(jīng)典面試題 軟件測試面試題匯總 測試技術(shù)面試題 1、什么是兼容性測試腕侄?兼容性測試側(cè)重...
    天宇逍遙heart閱讀 1,443評(píng)論 0 20
  • 今天小泉,天氣晴朗芦疏,陽光明媚。奶奶說:今天咱們吃燉雞微姊。我盼了好久酸茴,從起床一直到中午,終于可以吃頓雞了柒桑。 ...
    皓皓_f9d7閱讀 297評(píng)論 0 0
  • 親愛的珍姐: 展信佳弊决! 給你寫這封信不要覺得奇怪喔,只是把平時(shí)沒有說的話說出來魁淳。在這些忙碌的日...
    Melodyhui閱讀 181評(píng)論 0 1
  • 每個(gè)人都有自己的個(gè)性,不是別人的影子息拜,可以改變自己溉潭,不能讓自己迷失,人最可怕的就是找不到自己少欺,從不想去改變自己喳瓣,而...
    Ownery閱讀 1,665評(píng)論 0 1