什麼是圈複雜度?

創提科技
2022/06/13

分享到

圈複雜度是衡量軟體品質的一個重要指標。
 
在這裡,我們將闡釋什麼是圈複雜度和圈複雜度McCabe,並提供圈複雜度的示例。


本文將包含如下幾個部分:
 
     • 什麼是圈複雜度?
 
     • 如何計算圈複雜度McCabe?
 
     • 兩個圈複雜度的示例


什麼是圈複雜度?
 
圈複雜度(Cyclomatic Complexity, 簡稱‘CYC’)是一種用於確定程式複雜度的軟體度量指標。它是對原始程式碼中決策(decision)數量的計數。計數越高,程式碼越複雜。


為什麼圈複雜度很重要?
 
圈複雜度有兩種用法:
 
    • 限制程式碼複雜度。
 
    • 確定所需測試用例的數量。
 
然而,圈複雜度可能是最難理解的軟體品質度量指標之一。這使得圈複雜度(CYC)難以計算,也是為什麼瞭解軟體品質度量指標(比如,圈複雜度)以及如何準確地度量它們非常重要。


如何計算圈複雜度McCabe?
 
使用下面的公式計算圈複雜度(CYC):
 
CYC = E – N + 2P
 
在這個方程式中:
 
    • P = 流程圖中斷開部分的數量(例如,一個調用程式和一個子程式)
 
    • E = 邊數(控制傳輸)
 
    • N = 節點數(只包含一次控制傳輸的順序語句組)
 
這將轉化為決策數量+ 1。
 
像“if”和“while”語句這樣的二進位決策使得複雜度增加了1。
 
布林運算子可能使複雜度增加1,也可能不增加複雜度。例如,如果在條件陳述式中找到布林運算子,則複雜度就會增加1。


兩個圈複雜度的示例


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

 

什么是圈复杂度-1.png


首先,這個示例中看起來只有一個決策。因此,CYC = 2。
 
然而,當您考慮布林運算子的副作用時,實際上有兩個決策。


什么是圈复杂度-2.png


因此,在這個示例中,CYC = 3。


圈複雜度示例 2
 
CYC還有其他變體。
 
邁爾斯間隔(Myers’Interval)是CYC的擴展。它解釋了複合謂語造成的複雜度。它使用CYC作為下限,將上限定義為程式碼中條件的總數加1。它表示為兩個值:
 
                                                                                                     CYC:邏輯運算子個數
 
以下是一個使用邁爾斯間隔的示例。

 

什么是圈复杂度-3.png


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


低圈複雜度=更好的程式碼
 
CYC數值宜小不宜大。
 
這是因為高複雜度的程式碼很難測試,而且很可能會導致錯誤。
 
因此,低複雜度的程式碼更容易測試,而且不太可能產生錯誤。
 
欲瞭解如何降低程式碼的複雜度並維護可讀的程式碼庫,可以使用靜態程式碼分析工具(如Helix QAC),立刻註冊申請免費試用吧。