一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

1 引言

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

2 背景知識(shí)

2.1 圈復(fù)雜度

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

2.2 圈復(fù)雜度計(jì)算方式

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

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

if-else-else、switch-case:每增加一個(gè)分支,復(fù)雜度增加 1,&& 、|| 運(yùn)算也為一個(gè)分支。

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

return:增加一條 return 語(yǔ)句,復(fù)雜度將加 1。

2.3 圈復(fù)雜度度量標(biāo)準(zhǔn)

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

2.4 降低圈復(fù)雜度方法

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

拆分成子函數(shù)

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

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

2)優(yōu)化算法

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

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

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

4)減少提前 return

3 方案概述

3.1 腳本設(shè)計(jì)

1)開發(fā)語(yǔ)言

python

2)依賴環(huán)境

lizard

APScheduler

smtplib

pymysql

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

3.2 功能介紹

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

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

Java

C# (C Sharp)

JavaScript (With ES6 and JSX)

Python

Golang

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

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

-l LANGUAGES,--languages LANGUAGES

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

-x EXCLUDE,--exclude EXCLUDE

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

-W WHITELIST,--whitelist WHITELIST

配置閥值警告:

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

-C CCN,--CCN CCN

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

-T THRESHOLDS,--ThresholdTHRESHOLDS

配置報(bào)告輸出:

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

-o OUTPUT_FILE,--output_file OUTPUT_FILE

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

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

defdojob():

scheduler=BackgroundScheduler()

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

scheduler.start()

3.3 結(jié)果展示

3.3.1 報(bào)告名詞解釋

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

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

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

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

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

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

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

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

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

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

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

4 總結(jié)

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

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

    關(guān)注

    117

    文章

    3826

    瀏覽量

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

    關(guān)注

    30

    文章

    4900

    瀏覽量

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

    關(guān)注

    0

    文章

    11

    瀏覽量

    9869

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

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

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

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

    如何獲取XferData的錯(cuò)誤代碼?

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

    如何獲取SMBus示例代碼?

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

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

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

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

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

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

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

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

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

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

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

    汽車異構(gòu)硬件平臺(tái)開發(fā)如何進(jìn)行靜態(tài)代碼分析

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

    卷染機(jī)物聯(lián)網(wǎng)遠(yuǎn)程監(jiān)控系統(tǒng)方案

    隨著紡織行業(yè)的快速發(fā)展,卷染機(jī)作為紡織生產(chǎn)中的重要設(shè)備,其穩(wěn)定性和效率直接影響到產(chǎn)品的質(zhì)量和生產(chǎn)成本。然而,傳統(tǒng)的卷染機(jī)監(jiān)控方式存在著數(shù)據(jù)不集中、響應(yīng)速度慢、資源浪費(fèi)嚴(yán)重及操作復(fù)雜度高等痛點(diǎn),這些
    的頭像 發(fā)表于 10-08 15:53 ?303次閱讀
    卷染機(jī)物聯(lián)網(wǎng)遠(yuǎn)程<b class='flag-5'>監(jiān)控</b>系統(tǒng)方案

    PCB與PCBA工藝復(fù)雜度的量化評(píng)估與應(yīng)對(duì)措施

    一站式PCBA智造廠家今天為大家講講PCBA工藝復(fù)雜嗎?PCBA工藝的復(fù)雜性應(yīng)對(duì)PCBA工藝復(fù)雜性的措施。在電子制造領(lǐng)域,PCBA工藝是至關(guān)重要的環(huán)節(jié)。盡管對(duì)許多人來說,PCBA工藝可能看似復(fù)
    的頭像 發(fā)表于 09-13 09:21 ?859次閱讀

    業(yè)務(wù)復(fù)雜度治理方法論--十年系統(tǒng)設(shè)計(jì)經(jīng)驗(yàn)總結(jié)

    一、復(fù)雜度綜述 1、什么是復(fù)雜度 軟件設(shè)計(jì)的核心在于降低復(fù)雜性。 --《軟件設(shè)計(jì)的哲學(xué)》 業(yè)界對(duì)于復(fù)雜度并沒有統(tǒng)一的定義, 斯坦福教授John Ousterhout從認(rèn)知負(fù)擔(dān)和工作量方
    的頭像 發(fā)表于 09-05 14:11 ?1317次閱讀
    業(yè)務(wù)<b class='flag-5'>復(fù)雜度</b>治理方法論--十年系統(tǒng)設(shè)計(jì)經(jīng)驗(yàn)總結(jié)

    關(guān)于音電機(jī)一些參數(shù)的解析

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

    CISC(復(fù)雜指令集)與RISC(精簡(jiǎn)指令集)的區(qū)別  

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