創提部落格
希望我們能與您分享和探討成長中的點點滴滴
什麼是圈複雜度?
分享到
圈複雜度是衡量軟體品質的一個重要指標。
在這裡,我們將闡釋什麼是圈複雜度和圈複雜度McCabe,並提供圈複雜度的示例。
本文將包含如下幾個部分:
• 什麼是圈複雜度?
• 如何計算圈複雜度McCabe?
• 兩個圈複雜度的示例
什麼是圈複雜度?
圈複雜度(Cyclomatic Complexity, 簡稱‘CYC’)是一種用於確定程式複雜度的軟體度量指標。它是對原始程式碼中決策(decision)數量的計數。計數越高,程式碼越複雜。
為什麼圈複雜度很重要?
圈複雜度有兩種用法:
• 限制程式碼複雜度。
• 確定所需測試用例的數量。
然而,圈複雜度可能是最難理解的軟體品質度量指標之一。這使得圈複雜度(CYC)難以計算,也是為什麼瞭解軟體品質度量指標(比如,圈複雜度)以及如何準確地度量它們非常重要。
如何計算圈複雜度McCabe?
使用下面的公式計算圈複雜度(CYC):
CYC = E – N + 2P
在這個方程式中:
• P = 流程圖中斷開部分的數量(例如,一個調用程式和一個子程式)
• E = 邊數(控制傳輸)
• N = 節點數(只包含一次控制傳輸的順序語句組)
這將轉化為決策數量+ 1。
像“if”和“while”語句這樣的二進位決策使得複雜度增加了1。
布林運算子可能使複雜度增加1,也可能不增加複雜度。例如,如果在條件陳述式中找到布林運算子,則複雜度就會增加1。
兩個圈複雜度的示例
圈複雜度示例 1
以下是一個關於CYC的示例。
首先,這個示例中看起來只有一個決策。因此,CYC = 2。
然而,當您考慮布林運算子的副作用時,實際上有兩個決策。
因此,在這個示例中,CYC = 3。
圈複雜度示例 2
CYC還有其他變體。
邁爾斯間隔(Myers’Interval)是CYC的擴展。它解釋了複合謂語造成的複雜度。它使用CYC作為下限,將上限定義為程式碼中條件的總數加1。它表示為兩個值:
CYC:邏輯運算子個數
以下是一個使用邁爾斯間隔的示例。
以上示例的STMCC值為3:4。它的CYC是3。在條件中使用一個連接詞(&&)。
不過,複雜度僅僅是衡量軟體品質的一個指標。
低圈複雜度=更好的程式碼
CYC數值宜小不宜大。
這是因為高複雜度的程式碼很難測試,而且很可能會導致錯誤。
因此,低複雜度的程式碼更容易測試,而且不太可能產生錯誤。
欲瞭解如何降低程式碼的複雜度並維護可讀的程式碼庫,可以使用靜態程式碼分析工具(如Helix QAC),立刻註冊申請免費試用吧。