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
設置字段的限制數??梢源a行數,圈復雜度,令牌數,參數數或自定義字段。如果函數設置超過了限制數會報警。
-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文章
3791瀏覽量
81157 -
代碼
+關注
關注
30文章
4802瀏覽量
68735 -
數據模塊
+關注
關注
0文章
11瀏覽量
9784
原文標題:重構指標之如何監控代碼圈復雜度
文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論