1 引言
軟件應用在發展到適當時機,” 重構”,是開發過程中不可避免需要進行的一項工作。重構代碼,以適配當前模塊設計之初未考慮到的多樣化場景,并增加模塊的可維護性、健壯性、可測試性。那么,如何明確重構的方向,以及量化重構的結果呢?代碼圈復雜度可以是一個供選擇的指標。下文介紹如何獲取應用的代碼圈復雜度做到線上監控,給到復盤程序復雜程度的數據支撐。
2 背景知識
2.1 圈復雜度
圈復雜度(Cyclomatic complexity,簡寫 CC)也稱為條件復雜度,是一種代碼復雜度的衡量標準。由托馬斯?J?麥凱布(Thomas J. McCabe, Sr.)于 1976 年提出,用來表示程序的復雜度,其符號為 VG 或是 M。它可以用來衡量一個模塊判定結構的復雜程度,數量上表現為獨立現行路徑條數,也可理解為覆蓋所有的可能情況最少使用的測試用例數。圈復雜度大說明程序代碼的判斷邏輯復雜,可能質量低且難于測試和維護。程序的可能錯誤和高的圈復雜度有著很大關系。
2.2 圈復雜度計算方式
常用結構圈復雜度計算
順序結構:順序結構復雜度為 1。
if-else-else、switch-case:每增加一個分支,復雜度增加 1,&& 、|| 運算也為一個分支。
循環結構:增加一個循環結構,復雜度增加 1。
return:增加一條 return 語句,復雜度將加 1。
2.3 圈復雜度度量標準
如上列出行業內相對認可的度量數據,實際這個完全是看自己的業務體量和項目情況來決定的。假設你的業務很簡單,而且是個單體應用,功能都是很簡單的 CRUD,那你的圈復雜度即使想上去也沒有那么容易。此時你就可以選擇把圈復雜度的重構閾值設定為 10. 假設你的業務十分復雜,而且涉及到多個其他的微服務系統調用,再加上各種業務中的 corner case 的判斷,圈復雜度上 100 可能都不在話下。
2.4 降低圈復雜度方法
1)函數提煉與拆分,單一職責
拆分成子函數
每個函數要有明確的功能實現,不要為了追求行數少而合并功能實現
邏輯模塊和數據模塊要區分開編寫
2)優化算法
減少不必要條件、循環分支,盡量少用 if …else … ,采用三元表達式替換 if else
3)表達式邏輯優化
合并條件表達式,比如使用 a || b || c
4)減少提前 return
3 方案概述
3.1 腳本設計
1)開發語言
2)依賴環境
lizard
APScheduler
smtplib
pymysql
3)腳本架構
3.2 功能介紹
1)支持檢索語言范圍: 支持 15 種開發語言,包含常用語言如下
C# (C Sharp)
JavaScript (With ES6 and JSX)
Python
Golang
2)掃描參數配置說明:
利用 lizard 執行掃描,常用命令如下: 配置檢查范圍:
列出要分析的編程語言。如果留空,將搜索支持的所有語言。
-l LANGUAGES,--languages LANGUAGES
排除與模式匹配的文件。匹配一切?匹配任何單個字符,“/folder/” 遞歸地排除文件夾中的所有內容。可以指定多個模式。不要忘了在模式周圍加 “” 號。
-x EXCLUDE,--exclude EXCLUDE
設置白名單,默認’./whitelizard.txt’
-W WHITELIST,--whitelist WHITELIST
配置閥值警告:
圈復雜度數警告的閾值,默認值為 15,>15 會產生警告。
-C CCN,--CCN CCN
設置字段的限制數。可以代碼行數,圈復雜度,令牌數,參數數或自定義字段。如果函數設置超過了限制數會報警。
-T THRESHOLDS,--ThresholdTHRESHOLDS
配置報告輸出:
根據格式輸出到文件
-o OUTPUT_FILE,--output_file OUTPUT_FILE
官網地址:http://www.lizard.ws
源碼地址:https://github.com/terryyin/lizard 3)定時執行掃描任務:
通過 BackgroundScheduler 創建調度任務,自動觸發掃描方法,結果寫庫
defdojob():
scheduler=BackgroundScheduler()
scheduler.add_job(func,"cron",hour=21,minute=30)
scheduler.start()
3.3 結果展示
3.3.1 報告名詞解釋
Cyclomatic complexity,圈復雜度也就是分支復雜度,最好保持在 15 以下,目前腳本設置閥值 10。
LOC,包含注釋的代碼行數,目前設置 200 閥值。
Token count ,token 的個數,一個程序最多可以有 8192 個令牌, 每個令牌都是一個詞,例如關鍵字,標識符,常量,標點符號,操作符。對括號和字符串計數作為 1 個令牌。逗號、句點、LOCAL、分號、END 和注釋不計算在內。
Parameter count,參數統計就是函數的參數個數,目前腳本設置閥值 10。
3.3.2 執行結果展示
Windows 環境運行腳本,輸入 file_root(文件地址)執行掃描,支持自動彈出瀏覽器展示本次運行的 Html 報告
每周定期執行,按照系統維度掃描,支持觸發郵件通知對應系統研發查看超過閥值方法名稱
3.3.3 應用數據監控
每周定期拉取指定分支最新代碼,執行文件分析,存儲掃描結果,通過數據圖表展示
4 總結
對于軟件代碼好壞的衡量,圈復雜度可以作為一個參考指標,研發可以通過提煉拆分函數、優化算法、優化邏輯表達式等方法降低模塊(函數)圈復雜度。以上闡述圈復雜度一種線上監控方法,利用好線上化數據,結合現有團隊項目情況,才能形成更好的實踐機制。
-
程序
+關注
關注
117文章
3800瀏覽量
81565 -
代碼
+關注
關注
30文章
4846瀏覽量
69300 -
數據模塊
+關注
關注
0文章
11瀏覽量
9799
原文標題:重構指標之如何監控代碼圈復雜度
文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
AI時代下芯片復雜度飆升,思爾芯國產硬件仿真加速芯片創新

芯片設計復雜度劇增,紫光芯片云 3.0 助力企業搭建專業設計環境

46圈,16,560°!什么樣的位置傳感器能做到!

簡潔至上——探索產品與技術的優雅原則

時間復雜度為 O(n^2) 的排序算法

10月25日|英飛凌儲存器解決方案線上技術論壇

汽車異構硬件平臺開發如何進行靜態代碼分析

卷染機物聯網遠程監控系統方案

PCB與PCBA工藝復雜度的量化評估與應對措施
業務復雜度治理方法論--十年系統設計經驗總結

關于音圈電機一些參數的解析

CISC(復雜指令集)與RISC(精簡指令集)的區別
PCB與PCBA工藝復雜度的量化評估與應用初探!
軟件架構搞好了,還用擔心代碼可讀性差?

評論