chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

3天內(nèi)不再提示

如何獲取應(yīng)用的代碼圈復雜度做到線上監(jiān)控

電子工程師 ? 來源:OSCHINA 社區(qū) ? 作者:京東云開發(fā)者 ? 2022-08-08 15:11 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1 引言

軟件應(yīng)用在發(fā)展到適當時機,” 重構(gòu)”,是開發(fā)過程中不可避免需要進行的一項工作。重構(gòu)代碼,以適配當前模塊設(shè)計之初未考慮到的多樣化場景,并增加模塊的可維護性、健壯性、可測試性。那么,如何明確重構(gòu)的方向,以及量化重構(gòu)的結(jié)果呢?代碼圈復雜度可以是一個供選擇的指標。下文介紹如何獲取應(yīng)用的代碼圈復雜度做到線上監(jiān)控,給到復盤程序復雜程度的數(shù)據(jù)支撐。

2 背景知識

2.1 圈復雜度

圈復雜度(Cyclomatic complexity,簡寫 CC)也稱為條件復雜度,是一種代碼復雜度的衡量標準。由托馬斯?J?麥凱布(Thomas J. McCabe, Sr.)于 1976 年提出,用來表示程序的復雜度,其符號為 VG 或是 M。它可以用來衡量一個模塊判定結(jié)構(gòu)的復雜程度,數(shù)量上表現(xiàn)為獨立現(xiàn)行路徑條數(shù),也可理解為覆蓋所有的可能情況最少使用的測試用例數(shù)。圈復雜度大說明程序代碼的判斷邏輯復雜,可能質(zhì)量低且難于測試和維護。程序的可能錯誤和高的圈復雜度有著很大關(guān)系。

2.2 圈復雜度計算方式

常用結(jié)構(gòu)圈復雜度計算

順序結(jié)構(gòu):順序結(jié)構(gòu)復雜度為 1。

if-else-else、switch-case:每增加一個分支,復雜度增加 1,&& 、|| 運算也為一個分支。

循環(huán)結(jié)構(gòu):增加一個循環(huán)結(jié)構(gòu),復雜度增加 1。

return:增加一條 return 語句,復雜度將加 1。

2.3 圈復雜度度量標準

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

2.4 降低圈復雜度方法

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

拆分成子函數(shù)

每個函數(shù)要有明確的功能實現(xiàn),不要為了追求行數(shù)少而合并功能實現(xiàn)

邏輯模塊和數(shù)據(jù)模塊要區(qū)分開編寫

2)優(yōu)化算法

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

3)表達式邏輯優(yōu)化

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

4)減少提前 return

3 方案概述

3.1 腳本設(shè)計

1)開發(fā)語言

python

2)依賴環(huán)境

lizard

APScheduler

smtplib

pymysql

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

3.2 功能介紹

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

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

Java

C# (C Sharp)

JavaScript (With ES6 and JSX)

Python

Golang

2)掃描參數(shù)配置說明:
利用 lizard 執(zhí)行掃描,常用命令如下: 配置檢查范圍:

列出要分析的編程語言。如果留空,將搜索支持的所有語言。

-l LANGUAGES,--languages LANGUAGES

排除與模式匹配的文件。匹配一切?匹配任何單個字符,“/folder/” 遞歸地排除文件夾中的所有內(nèi)容??梢灾付ǘ鄠€模式。不要忘了在模式周圍加 “” 號。

-x EXCLUDE,--exclude EXCLUDE

設(shè)置白名單,默認’./whitelizard.txt’

-W WHITELIST,--whitelist WHITELIST

配置閥值警告:

圈復雜度數(shù)警告的閾值,默認值為 15,>15 會產(chǎn)生警告。

-C CCN,--CCN CCN

設(shè)置字段的限制數(shù)。可以代碼行數(shù),圈復雜度,令牌數(shù),參數(shù)數(shù)或自定義字段。如果函數(shù)設(shè)置超過了限制數(shù)會報警。

-T THRESHOLDS,--ThresholdTHRESHOLDS

配置報告輸出:

根據(jù)格式輸出到文件

-o OUTPUT_FILE,--output_file OUTPUT_FILE

官網(wǎng)地址:http://www.lizard.ws
源碼地址:https://github.com/terryyin/lizard 3)定時執(zhí)行掃描任務(wù):

通過 BackgroundScheduler 創(chuàng)建調(diào)度任務(wù),自動觸發(fā)掃描方法,結(jié)果寫庫

defdojob():

scheduler=BackgroundScheduler()

scheduler.add_job(func,"cron",hour=21,minute=30)

scheduler.start()

3.3 結(jié)果展示

3.3.1 報告名詞解釋

Cyclomatic complexity,圈復雜度也就是分支復雜度,最好保持在 15 以下,目前腳本設(shè)置閥值 10。

LOC,包含注釋的代碼行數(shù),目前設(shè)置 200 閥值。

Token count ,token 的個數(shù),一個程序最多可以有 8192 個令牌, 每個令牌都是一個詞,例如關(guān)鍵字,標識符,常量,標點符號,操作符。對括號和字符串計數(shù)作為 1 個令牌。逗號、句點、LOCAL、分號、END 和注釋不計算在內(nèi)。

Parameter count,參數(shù)統(tǒng)計就是函數(shù)的參數(shù)個數(shù),目前腳本設(shè)置閥值 10。

3.3.2 執(zhí)行結(jié)果展示

Windows 環(huán)境運行腳本,輸入 file_root(文件地址)執(zhí)行掃描,支持自動彈出瀏覽器展示本次運行的 Html 報告

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

每周定期執(zhí)行,按照系統(tǒng)維度掃描,支持觸發(fā)郵件通知對應(yīng)系統(tǒng)研發(fā)查看超過閥值方法名稱

9ac2ce18-16c5-11ed-ba43-dac502259ad0.png 3.3.3 應(yīng)用數(shù)據(jù)監(jiān)控

每周定期拉取指定分支最新代碼,執(zhí)行文件分析,存儲掃描結(jié)果,通過數(shù)據(jù)圖表展示

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

4 總結(jié)

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

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

    關(guān)注

    117

    文章

    3832

    瀏覽量

    84359
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4922

    瀏覽量

    72238
  • 數(shù)據(jù)模塊
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    9887

原文標題:重構(gòu)指標之如何監(jiān)控代碼圈復雜度

文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    Siumulink模型測試典型問題分享——模型層級設(shè)計不合理

    典型測試問題分享-模型層級設(shè)計不合理 問題描述: ?重點功能與非重點功能混合,導致測試層級選擇困難。 ?模型未體現(xiàn)層級劃分,結(jié)構(gòu)平鋪導致層級復雜度異常。 ?部分計算/判斷/賦值等結(jié)構(gòu)位于測試層級之外,存在未覆蓋風險。
    的頭像 發(fā)表于 09-20 12:31 ?2640次閱讀
    Siumulink模型測試典型問題分享——模型層級設(shè)計不合理

    物聯(lián)網(wǎng)平臺應(yīng)用環(huán)境監(jiān)控:低代碼零編程簡化開發(fā),組態(tài)應(yīng)用

    復雜開發(fā)轉(zhuǎn)化為“拖拽組件、關(guān)聯(lián)設(shè)備”的簡單操作,讓企業(yè)無需編程也能快速搭建、靈活調(diào)整監(jiān)控系統(tǒng),適配工業(yè)、園區(qū)、農(nóng)業(yè)等多場景環(huán)境監(jiān)控需求。 一、低代碼零編程:打破技術(shù)壁壘,人人能搭
    的頭像 發(fā)表于 08-29 15:33 ?475次閱讀

    機PLC數(shù)據(jù)采集解決方案

    中,如何高效采集成機 PLC 數(shù)據(jù),以實現(xiàn)生產(chǎn)過程的精細化管理和遠程監(jiān)控,成為眾多電線生產(chǎn)企業(yè)亟待解決的問題。 某中型電線生產(chǎn)企業(yè)擁有多條電線成生產(chǎn)線,這些成機來自不同廠家,型號
    的頭像 發(fā)表于 07-10 17:08 ?391次閱讀
    成<b class='flag-5'>圈</b>機PLC數(shù)據(jù)采集解決方案

    網(wǎng)絡(luò)化多電機伺服系統(tǒng)監(jiān)控終端設(shè)計

    在多電機伺服系統(tǒng)的調(diào)試及使用過程中,需要實時獲取系統(tǒng)運行時各個電機和負載的運行狀態(tài)數(shù)據(jù),并通過對相應(yīng)數(shù)據(jù)的分析進行控制器參數(shù)的整定和故障判斷。而在傳統(tǒng)的基于CAN總線的多電機系統(tǒng)中,總線上傳輸?shù)臄?shù)據(jù)
    發(fā)表于 06-23 07:15

    ADIN2111集成10BASE-T1L PHY的低復雜度、2端口以太網(wǎng)交換機技術(shù)手冊

    ADIN2111是一款低功耗、低復雜度、雙以太網(wǎng)端口交換機,它集成了10BASE-T1L PHY和一個串行外設(shè)接口(SPI)端口。該器件使用低功率受限節(jié)點,面向工業(yè)以太網(wǎng)應(yīng)用且符合IEEE
    的頭像 發(fā)表于 05-15 11:41 ?841次閱讀
    ADIN2111集成10BASE-T1L PHY的低<b class='flag-5'>復雜度</b>、2端口以太網(wǎng)交換機技術(shù)手冊

    如何獲取 OpenAI API Key?API 獲取代碼調(diào)用示例 (詳解教程)

    ,催生了從智能聊天到復雜數(shù)據(jù)分析等前所未有的應(yīng)用場景。OpenAI API Key 是開啟這些能力的關(guān)鍵,它既是身份憑證,也是資源管理和安全保障的核心。然而,安全、高效地獲取、管理和使用 API
    的頭像 發(fā)表于 05-04 11:42 ?8280次閱讀
    如何<b class='flag-5'>獲取</b> OpenAI API Key?API <b class='flag-5'>獲取</b>與<b class='flag-5'>代碼</b>調(diào)用示例 (詳解教程)

    如何獲取XferData的錯誤代碼?

    我正在使用 FX3 EVM,并將把該產(chǎn)品用于我公司的某種產(chǎn)品。我有一個類似標題的問題。如何獲取XferData的錯誤代碼 原型如下 bool CCyUSBEndPoint::XferData
    發(fā)表于 04-30 08:27

    如何獲取SMBus示例代碼

    想找一個用硬件SMBus外設(shè)的示例代碼,但是在網(wǎng)上找到的很多都是HAL庫的版本,我目前的代碼是用的標準庫,想知道ST官方有沒有相關(guān)的示例代碼,從哪里可以獲取到?
    發(fā)表于 03-10 07:16

    Jenkins 與 SonarQube 集成部署,自動化代碼質(zhì)量監(jiān)控

    前言 強化代碼質(zhì)量,加速軟件交付!Jenkins 攜手 SonarQube,與華為云 Flexus X 云服務(wù)器強強聯(lián)合,打造自動化代碼質(zhì)量監(jiān)控新生態(tài)。Flexus X 以其靈活的算力配置、卓越
    的頭像 發(fā)表于 01-07 17:24 ?904次閱讀
    Jenkins 與 SonarQube 集成部署,自動化<b class='flag-5'>代碼</b>質(zhì)量<b class='flag-5'>監(jiān)控</b>

    AI時代下芯片復雜度飆升,思爾芯國產(chǎn)硬件仿真加速芯片創(chuàng)新

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

    芯片設(shè)計復雜度劇增,紫光芯片云 3.0 助力企業(yè)搭建專業(yè)設(shè)計環(huán)境

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

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

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

    STM32連接機智云,代碼移植,NTP實時時間獲取(二)

    如何利用NTP(網(wǎng)絡(luò)時間協(xié)議)獲取精確的實時時間,并將其集成到我們的STM32應(yīng)用中。本文將涵蓋以下幾個方面:1.代碼編寫準備:我們將分析所需的開發(fā)環(huán)境配置、庫文件和工
    的頭像 發(fā)表于 11-20 01:02 ?2186次閱讀
    STM32連接機智云,<b class='flag-5'>代碼</b>移植,NTP實時時間<b class='flag-5'>獲取</b>(二)

    簡潔至上——探索產(chǎn)品與技術(shù)的優(yōu)雅原則

    ,將復雜的邏輯轉(zhuǎn)化為直觀、易用的用戶功能,并將冗長、難以維護的代碼結(jié)構(gòu)變?yōu)楹啙崱⑿矢叩男问健?在《人月神話》中作者提到,軟件開發(fā)的復雜度可以劃分為本質(zhì)復雜度和偶然
    的頭像 發(fā)表于 10-25 11:12 ?1289次閱讀
    簡潔至上——探索產(chǎn)品與技術(shù)的優(yōu)雅原則

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

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