什麼(me)是圈複雜度?

創提信息
2022/06/13

分享到

圈複雜度是衡量軟件質量的一個重要指标。
 
在這(zhè)裡(lǐ),我們將(jiāng)闡釋什麼(me)是圈複雜度和圈複雜度McCabe,并提供圈複雜度的示例。


本文將(jiāng)包含如下幾個部分:
 
     • 什麼(me)是圈複雜度?
 
     • 如何計算圈複雜度McCabe?
 
     • 兩(liǎng)個圈複雜度的示例


什麼(me)是圈複雜度?
 
圈複雜度(Cyclomatic Complexity, 簡稱‘CYC’)是一種(zhǒng)用于确定程序複雜度的軟件度量指标。它是對(duì)源代碼中決策(decision)數量的計數。計數越高,代碼越複雜。


爲什麼(me)圈複雜度很重要?
 
圈複雜度有兩(liǎng)種(zhǒng)用法:
 
    • 限制代碼複雜度。
 
    • 确定所需測試用例的數量。
 
然而,圈複雜度可能(néng)是最難理解的軟件質量度量指标之一。這(zhè)使得圈複雜度(CYC)難以計算,也是爲什麼(me)了解軟件質量度量指标(比如,圈複雜度)以及如何準确地度量它們非常重要。


如何計算圈複雜度McCabe?
 
使用下面(miàn)的公式計算圈複雜度(CYC):
 
CYC = E – N + 2P
 
在這(zhè)個方程式中:
 
    • P = 流程圖中斷開(kāi)部分的數量(例如,一個調用程序和一個子程序)
 
    • E = 邊數(控制傳輸)
 
    • N = 節點數(隻包含一次控制傳輸的順序語句組)
 
這(zhè)將(jiāng)轉化爲決策數量+ 1。
 
像“if”和“while”語句這(zhè)樣(yàng)的二進(jìn)制決策使得複雜度增加了1。
 
布爾運算符可能(néng)使複雜度增加1,也可能(néng)不增加複雜度。例如,如果在條件語句中找到布爾運算符,則複雜度就(jiù)會(huì)增加1。


兩(liǎng)個圈複雜度的示例


圈複雜度示例 1
 
以下是一個關于CYC的示例。

 

什麼(me)是圈複雜度-1.png


首先,這(zhè)個示例中看起(qǐ)來隻有一個決策。因此,CYC = 2。
 
然而,當您考慮布爾運算符的副作用時(shí),實際上有兩(liǎng)個決策。


什麼(me)是圈複雜度-2.png


因此,在這(zhè)個示例中,CYC = 3。


圈複雜度示例 2
 
CYC還(hái)有其他變體。
 
邁爾斯間隔(Myers’Interval)是CYC的擴展。它解釋了複合謂語造成(chéng)的複雜度。它使用CYC作爲下限,將(jiāng)上限定義爲代碼中條件的總數加1。它表示爲兩(liǎng)個值:
 
                                                                                                     CYC:邏輯運算符個數
 
以下是一個使用邁爾斯間隔的示例。

 

什麼(me)是圈複雜度-3.png


以上示例的STMCC值爲3:4。它的CYC是3。在條件中使用一個連接詞(&&)。
 
不過(guò),複雜度僅僅是衡量軟件質量的一個指标。


低圈複雜度=更好(hǎo)的代碼
 
CYC數值宜小不宜大。
 
這(zhè)是因爲高複雜度的代碼很難測試,而且很可能(néng)會(huì)導緻錯誤。
 
因此,低複雜度的代碼更容易測試,而且不太可能(néng)産生錯誤。
 
欲了解如何降低代碼的複雜度并維護可讀的代碼庫,可以使用靜态代碼分析工具(如Helix QAC),立刻注冊申請免費試用吧。