衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何獲取應用的代碼圈復雜度做到線上監控

電子工程師 ? 來源:OSCHINA 社區 ? 作者:京東云開發者 ? 2022-08-08 15:11 ? 次閱讀

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 圈復雜度度量標準

9a6f6d2c-16c5-11ed-ba43-dac502259ad0.png 如上列出行業內相對認可的度量數據,實際這個完全是看自己的業務體量和項目情況來決定的。假設你的業務很簡單,而且是個單體應用,功能都是很簡單的 CRUD,那你的圈復雜度即使想上去也沒有那么容易。此時你就可以選擇把圈復雜度的重構閾值設定為 10. 假設你的業務十分復雜,而且涉及到多個其他的微服務系統調用,再加上各種業務中的 corner case 的判斷,圈復雜度上 100 可能都不在話下。

2.4 降低圈復雜度方法

1)函數提煉與拆分,單一職責

拆分成子函數

每個函數要有明確的功能實現,不要為了追求行數少而合并功能實現

邏輯模塊和數據模塊要區分開編寫

2)優化算法

減少不必要條件、循環分支,盡量少用 if …else … ,采用三元表達式替換 if else

3)表達式邏輯優化

合并條件表達式,比如使用 a || b || c

4)減少提前 return

3 方案概述

3.1 腳本設計

1)開發語言

python

2)依賴環境

lizard

APScheduler

smtplib

pymysql

3)腳本架構 9a843afe-16c5-11ed-ba43-dac502259ad0.png

3.2 功能介紹

1)支持檢索語言范圍: 支持 15 種開發語言,包含常用語言如下

C/C++ (works with C++14)

Java

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 報告

9a9d7532-16c5-11ed-ba43-dac502259ad0.png

每周定期執行,按照系統維度掃描,支持觸發郵件通知對應系統研發查看超過閥值方法名稱

9ac2ce18-16c5-11ed-ba43-dac502259ad0.png 3.3.3 應用數據監控

每周定期拉取指定分支最新代碼,執行文件分析,存儲掃描結果,通過數據圖表展示

9aef003c-16c5-11ed-ba43-dac502259ad0.png

4 總結

對于軟件代碼好壞的衡量,圈復雜度可以作為一個參考指標,研發可以通過提煉拆分函數、優化算法、優化邏輯表達式等方法降低模塊(函數)圈復雜度。以上闡述圈復雜度一種線上監控方法,利用好線上化數據,結合現有團隊項目情況,才能形成更好的實踐機制。

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 程序
    +關注

    關注

    117

    文章

    3795

    瀏覽量

    81406
  • 代碼
    +關注

    關注

    30

    文章

    4825

    瀏覽量

    69043
  • 數據模塊
    +關注

    關注

    0

    文章

    11

    瀏覽量

    9793

原文標題:重構指標之如何監控代碼圈復雜度

文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    AI時代下芯片復雜度飆升,思爾芯國產硬件仿真加速芯片創新

    引言在人工智能(AI)技術蓬勃發展的今天,芯片的復雜度正以前所未有的速度飆升,輕松跨越了百億邏輯門級別的大關。這一趨勢不僅推動了半導體行業的快速發展,也對硬件仿真系統提出了更高的挑戰和要求。在近日
    的頭像 發表于 12-27 18:01 ?444次閱讀
    AI時代下芯片<b class='flag-5'>復雜度</b>飆升,思爾芯國產硬件仿真加速芯片創新

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

    。 ? 實際上,國內中小IC設計企業居多,而如今他們面臨更加復雜的設計需求。隨著芯片制程和規模要求不斷提高,芯片設計環境所需資源越來越大,設計環境構建更加復雜,初創企業如何搭建設計環境,中小企業如何在人員經驗欠缺的情況下完成有效布局,又如
    的頭像 發表于 12-26 17:04 ?923次閱讀
    芯片設計<b class='flag-5'>復雜度</b>劇增,紫光芯片云 3.0 助力企業搭建專業設計環境

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

    關于電機控制位置信息的獲取,你們都是用什么方法?編碼器?霍爾傳感器?最近,B站KOL達爾聞的妮姐收到了一套位置傳感器demo,簡單小試后,她驚訝地發現這個位置傳感器能記錄46,也就是0°至
    的頭像 發表于 12-11 01:04 ?367次閱讀
    46<b class='flag-5'>圈</b>,16,560°!什么樣的位置傳感器能<b class='flag-5'>做到</b>!

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

    ,將復雜的邏輯轉化為直觀、易用的用戶功能,并將冗長、難以維護的代碼結構變為簡潔、效率高的形式。 在《人月神話》中作者提到,軟件開發的復雜度可以劃分為本質復雜度和偶然
    的頭像 發表于 10-25 11:12 ?900次閱讀
    簡潔至上——探索產品與技術的優雅原則

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

    作者:京東保險 王奕龍 對于小規模數據,我們可以選用時間復雜度為 O(n2) 的排序算法。因為時間復雜度并不代表實際代碼的執行時間,它省去了低階、系數和常數,僅代表的增長趨勢,所以在小規模數據情況下
    的頭像 發表于 10-19 16:31 ?1250次閱讀
    時間<b class='flag-5'>復雜度</b>為 O(n^2) 的排序算法

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

    主要面向方案設計群體(系統架構師、設計工程師等),探討(由多種需求驅動的)設計復雜度增加,和資格認證所帶來的挑戰,以及如何減少開發成本并縮短上市時間。話題涵蓋:可
    的頭像 發表于 10-15 08:04 ?352次閱讀
    10月25日|英飛凌儲存器解決方案<b class='flag-5'>線上</b>技術論壇

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

    隨著汽車軟件開發復雜度的提升,異構硬件平臺的應用已成為必然趨勢。多編譯器環境的引入不僅是技術發展的自然產物,更是解決日益增長的功能需求和技術挑戰的有效途徑。在此背景下,Helix QAC 作為一款
    的頭像 發表于 10-09 16:15 ?586次閱讀
    汽車異構硬件平臺開發如何進行靜態<b class='flag-5'>代碼</b>分析

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

    隨著紡織行業的快速發展,卷染機作為紡織生產中的重要設備,其穩定性和效率直接影響到產品的質量和生產成本。然而,傳統的卷染機監控方式存在著數據不集中、響應速度慢、資源浪費嚴重及操作復雜度高等痛點,這些
    的頭像 發表于 10-08 15:53 ?144次閱讀
    卷染機物聯網遠程<b class='flag-5'>監控</b>系統方案

    PCB與PCBA工藝復雜度的量化評估與應對措施

    一站式PCBA智造廠家今天為大家講講PCBA工藝復雜嗎?PCBA工藝的復雜性應對PCBA工藝復雜性的措施。在電子制造領域,PCBA工藝是至關重要的環節。盡管對許多人來說,PCBA工藝可能看似
    的頭像 發表于 09-13 09:21 ?474次閱讀

    業務復雜度治理方法論--十年系統設計經驗總結

    一、復雜度綜述 1、什么是復雜度 軟件設計的核心在于降低復雜性。 --《軟件設計的哲學》 業界對于復雜度并沒有統一的定義, 斯坦福教授John Ousterhout從認知負擔和工作量方
    的頭像 發表于 09-05 14:11 ?1059次閱讀
    業務<b class='flag-5'>復雜度</b>治理方法論--十年系統設計經驗總結

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

    在日常對接客戶的時候,小編多次遇到如下情況,譬如客戶上來就問你們的音電機速度能做到多快?你們的音電機模組精度能做到多高?等等諸如此類的問題,在此,小編想跟大家解釋一番。 關于音
    的頭像 發表于 09-04 08:19 ?440次閱讀
    關于音<b class='flag-5'>圈</b>電機一些參數的解析

    CISC(復雜指令集)與RISC(精簡指令集)的區別  

    復雜度, 將復雜性交給編譯器。舉一個例子,CISC提供的乘法指令,調用時可完成內存a和內存b中的兩個數相乘,結果存入內存a ,需要多個CPU周期才可以完成;而RISC不提供“一站式”的乘法指令,需
    發表于 07-30 17:21

    PCB與PCBA工藝復雜度的量化評估與應用初探!

    , 不知道如何區分普通和復雜的PCB和 PCBA的設計,并采用什么樣的方式來處理。 基于上述考慮, 我們參考了業 界已有的作法, 設計了一個PCB 和 PCBA的工藝復雜度計算公式以解決這 方面
    發表于 06-14 11:15

    軟件架構搞好了,還用擔心代碼可讀性差?

    一、架構的概念及由來嵌入式軟件架構是指在嵌入式系統中用于組織和管理軟件組件的結構和設計。嵌入式軟件架構的出現是為了解決嵌入式系統中軟件復雜度和系統要求不斷增加的挑戰。以下是嵌入式軟件架構出現的原因
    的頭像 發表于 06-14 08:10 ?327次閱讀
    軟件架構搞好了,還用擔心<b class='flag-5'>代碼</b>可讀性差?

    STM32F303啟動文件中的Stack_Size和Stack_Mem如何在C代碼獲取其地址或值?

    為了在業務代碼監控系統的堆棧使用情況,想在業務代碼獲取Stack_Mem的內存地址和Stack_Size的值。目前定義如下:可實現讀取棧地址但無法讀取棧大小 extern unsi
    發表于 04-01 08:18
    百家乐官网特殊计| 百家乐官网网上公式| 赌博百家乐官网经验| 百家乐游戏机子| 百家乐骰盅规则| 六合彩管家婆| 百家乐官网的注码技巧| 噢门百家乐注码技巧| 大发888娱乐城 casino| 玩百家乐官网优博娱乐城| 百家乐怎样算大小| 大发888娱乐平台| 百家乐官网的关键技巧| 百家乐概率计算过程| 太阳城ktv| 百家乐官网赢钱海立方| 百家乐娱乐全讯网| 大发888加盟合作| 百家乐官网电脑赌博| 神人百家乐赌场| 宜兴市| 连环百家乐| 百家乐官网论坛bocaila| 大发888真钱赌场娱乐网规则| 赌博百家乐官网趋势把握| 蓝盾百家乐庄家利润分| 枣庄市| 澳门百家乐单注下限| 皇冠信用网| 3U百家乐游戏| bet365娱乐平台| 百家乐官网怎么玩请指教| 亚洲顶级赌场手机版| 香港百家乐官网玩| 威尼斯人娱乐网网址| 百家乐官网筹码桌| 百家乐几点不用补牌| 澳门百家乐官网真人娱乐城| 百盛百家乐的玩法技巧和规则| 百家乐官网概率计算过程| 鼎龙百家乐的玩法技巧和规则|