1. 程式人生 > 實用技巧 >Sonar圈複雜度介紹及高圈複雜度程式碼的優化思路

Sonar圈複雜度介紹及高圈複雜度程式碼的優化思路

一、sonar是什麼:

sonar是一個程式碼質量管理平臺,能檢測出專案中存在的以下一些常見問題。

1.缺乏單元測試。統計並展示單元測試覆蓋率。

2.重複程式碼。檢測專案中存在的重複程式碼,並可以線上檢視哪些程式碼重複。

3.註釋不足或過多。沒有註釋將使程式碼可讀性變差,而過多的註釋又會使得開發人員花費過多的精力去閱讀註釋,違背初衷。

4.潛在的缺陷。比如程式有可能存在空指標,陣列越界等問題。

5.不遵循程式碼標準。如方法,類的命名不規範。

6.糟糕的複雜分佈。檔案,類,方法等,如果複雜度過高將難以維護,這將會使其它開發人員難以理解它們,且如果沒有自動化的單元測試,對於程式中的任何小的修改都將可能導致需要全量回歸測試。

二、sonar的圈複雜度是如何計算的:

圈複雜度是一種程式碼複雜度的衡量標準。它是一種固定的資料模型計算方式。它可以用來衡量一個模組判定結構的複雜程式,數量上表現為獨立線性路徑條數,也可理解為覆蓋所有的可能情況最少使用的測試用例數。圈複雜度高說明程式程式碼的判斷邏輯複雜,可能質量低且難以測試和維護。

下面是圈複雜度計算規則:

1. &&、|| 條件判斷符號+1

2. if,else if,else,switch分支語句+1

3. for、while、do while 迴圈語句+1

4. catch 捕獲異常語句+1

5. break、continue 終端語句+1

6. 如果if、for、while、do while、catch存在巢狀時,裡層的語句相對於外層+1

7. sonar要求認知複雜度不能高於15

下面看一個例子:

上面的兩個方法雖然程式碼複雜度相同,但是再可讀性上卻有很大差別,開始圈複雜度的數學模型賦予這兩種方法同等的權重,但是從視覺上看,sunOfPrimes比getWords的程式碼更難理解,因此圈複雜度放棄使用數學模型來平評估,而是使用一套簡單的規則將直觀感受轉化為數字。

三、圈複雜度程式碼優化思路:

1. 針對if,else判斷的處理,如果之後沒有處理,則在if中直接返回,else無需使用 --優化表示式

2.程式碼中多層巢狀迴圈,邏輯重組,將多層迴圈抽取(明確執行該處程式碼具體需要滿足的條件) --提煉函式

3.減少if,else,for,while,do while,catch關鍵字巢狀,可以把深層次的程式碼抽象成方法 --簡化程式碼

4.如果大量使用if-else語句可以考慮用switch代替 --減少認知複雜度

5.判空等操作可以使用工具類,減少||,&&的判斷使用 。如StringUtils.isBlank(str)可替換str==null&&str=="" --工具類替換邏輯判斷

有關圈複雜度的內容就先說這麼多~

喜歡的朋友歡迎點贊,評論,關注哦~~