千里之行,始於足下。
文章是轉來的,剛好今天公司同事給我們分享了這方面的一些資料,其中用到的例子就是文字最後的那個例子。但是例子中的程式碼用SourceMonitor計算圈複雜度確實7。有朋友知道緣由可以分析下的。話說不同公司對圈複雜度的要求也有不一樣的,比如有的公司把switch語句作一個圈複雜度,而有的卻是安裝case的個數來計算的。
不過重要的是要有意識的減少自己程式碼的圈複雜度,畢竟你也不希望去維護一個圈複雜度很高的程式碼,那會讓你想到去殺了寫程式碼的人的。
不知道轉載的是不是原文,就不貼原文地址了。
原文如下:
圈複雜度(Cyclomatic Complexity)是一種程式碼複雜度的衡量標準。它可以用來衡量一個模組判定結構的複雜程度,數量上表現為獨立現行路徑條數,也可理解為覆蓋所有的可能情況最少使用的測試用例數。圈複雜度大說明程式程式碼的判斷邏輯複雜,可能質量低且難於測試和維護。程式的可能錯誤和高的圈複雜度有著很大關係。
下面這個例項中,單元測試的覆蓋率可以達到100%,但是很容易發現這其中已經漏掉了一個NPE的測試用例。case1方法的圈複雜度為2,因此至少需要2個用例才能完全覆蓋到其所有的可能情況。
//程式原始碼,圈複雜度為 2 public String case1(int num) { String string = null; if (num == 1) { string = "String"; } return string.substring(0); } //上面程式碼的單元測試程式碼 public void String test1 = case1(1); } |
圈複雜度主要與分支語句(if、else、,switch 等)的個數成正相關。可以在圖1中看到常用到的幾種語句的控制流圖(表示程式執行流程的有向圖)。當一段程式碼中含有較多的分支語句,其邏輯複雜程度就會增加。在計算圈複雜度時,可以通過程式控制流圖方便的計算出來。通常使用的計算公式是V(G) = e – n + 2 , e 代表在控制流圖中的邊的數量(對應程式碼中順序結構的部分),n 代表在控制流圖中的節點數量,包括起點和終點(1、所有終點只計算一次,即便有多個return或者throw;2、節點對應程式碼中的分支語句)。
圖1、各判斷語句的控制流圖
知道了如何計算圈複雜度,我們來使用控制流圖重新計算一次case1方法的圈複雜度,其控制流圖如下圖。狀態1表示if(num == 1 )的條件判斷,狀態2表示string=”String”的賦值操作。可以通過下面的控制流圖得到 e = 3 ; n = 3;那麼全複雜度V(G) = 3 - 3 + 2 = 2,既case1的圈複雜度為2。
圖2、case1的控制流圖
在看一個計算全複雜度的例子。程式程式碼如下:
public String case2(int index, String string) { String returnString = null; if (index < 0) { throw new IndexOutOfBoundsException("exception <0 "); } if (index == 1) { if (string.length() < 2) { return string; } returnString = "returnString1"; } else if (index == 2) { if (string.length() < 5) { return string; } returnString = "returnString2"; } else { throw new IndexOutOfBoundsException("exception >2 "); } return returnString; } |
程式控制流圖:
圖3、case2的控制流圖
根據公式 V(G) = e – n + 2 = 12 – 8 + 2 = 6 。case2的圈複雜段為6。說明一下為什麼n = 8,雖然圖上的真正節點有12個,但是其中有5個節點為throw、return,這樣的節點為end節點,只能記做一個。
在開發中常用的檢測圈複雜度的工具,PMD,checkstyle都可以檢測到高複雜度的程式碼塊。在程式碼的開發中,配合各種圈複雜度的檢測外掛,將高複雜度的程式碼進行適當的拆分、優化,可以大大提高程式碼整體的質量,減少潛在bug存在。
相關推薦
千里之行,始於足下。
文章是轉來的,剛好今天公司同事給我們分享了這方面的一些資料,其中用到的例子就是文字最後的那個例子。但是例子中的程式碼用SourceMonitor計算圈複雜度確實7。有朋友知道緣由可以分析下的。話說不同公司對圈複雜度的要求也有不一樣的,比如有的公司把switch語句作一個圈複
天才精英技術交流天地-千里之行,始於足下!
最近因為專案需要,開始進行STM32 CAN匯流排的嵌入式程式設計,關於CAN匯流排,也是慢慢的積累。 關於CAN地址(識別符號)問題,基本上清楚了,CAN本身通過識別符號來確
好朋友的小姨,希望一起幫助下度過難關,方便的話請幫忙轉發一下,謝謝。————————心情記錄
detail sha tail 之前 沒有 from weixin timeline 方便 好朋友的小姨,希望一起幫助下度過難關,方便的話請幫忙轉發一下,謝謝。 https://ssl.gongyi.qq.com/m/weixin/ws_detail.html?from
Mysql主要索引方式:FULLTEXT,HASH,BTREE,RTREE。
作用 大神 方法 為什麽 var 顯示 equal ror geo 使用方式CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL
js讀取json,糾結。。。
dsm article spa ava 文本格式 json對象 urn rac scrip 什麽是json。先小抄一段: ?? JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。採用全然獨立於語言的文本格式, 是理想的數據交換
Slack 的想法很好啊,很有創新,牛。
海量 發出 有意 頻道 而已 體系 lac ack form [原]https://www.leiphone.com/news/201411/aXHUpe4ZFI2sSwpb.html 由於以往一些用於辦公的應用反響平平,因此對迅速崛起的辦公交流應用Slack,人們議論紛紛
記一次非常無語的生成柱狀圖,js,ecshop。
width ecs fun ner text nbsp real mov span 如題,無語且非常郁悶。 要求是根據查詢出來的數據動態生成柱狀圖。但是ecshop的查詢ajax回調都是已經封裝好了的。根本就不能改。 無奈之下只好百度了一個畫柱狀圖的代碼,每隔2秒
用樹狀數組寫的最長上升子序列(友好城市),nlogn。
log stream blog sum spa 最長上升子序列 () += def #include<iostream> #include<algorithm> #define maxn 100000 #define lb(x) x&-x
寫不了,不會,告辭。程序員三連(第二次站立議會)
昨天 nbsp 會議 安卓 暫時 ima view 構建 困難 目前的進度: 個人進度: 劉子琦:已經熟悉安卓開發軟件的使用,計劃最近一個站立議會完成2個頁面開發,問題目前對Android結構理解較淺 陳藝祥:初步學習了sql server,學會了建表等基本操作,計劃
centos 安裝桌面,啟動。
targe 每次 inittab min ln -s 如果 vim evel div 每次都百度,真麻煩,收集起來給自己看 三步搞定 安裝圖形界面 # yum groupinstall "GNOME Desktop" "Graphical Administr
【python學習】今天看看學習 %d ,%s, %f 等用法,下面的學習例子是說輸入名字、年齡、工作,工資。並給出65歲退休還差多久的計算
msg ear end style 資料 科學 一個 保留 value 今天看看學習 %d ,%s, %f 等用法。%d 是占位符整數,%s 是占位符,%f 是浮點數。下面的學習例子是說輸入名字、年齡、工作,工資。並給出65歲退休還差多久的計算。重點在於用占位符來print
c# 工廠模式 ,委托 ,事件。
委托 callback ica 2個 handle str 函數名 函數指針 urn 有些時間 不用 c#了 ,想 寫 委托 和 事件 又會 卡下 ,之前也沒認真總結過。幹脆 做個小結 。 委托 : 1.概念:個人 理解 ,加強版的 函數指針,可以存放多個函數 指針 ,算是
達內科技NTD1712 cisco遠程控制路由,交換。
1.2 密碼 兩個 ica gin name 不可 ... 遠程 遠程控制路由器設置圖如下配置Router>enable 進入特權模式Router#c
oracle 存儲過程-動態行轉列,解決。
pla gin sel rom con left join from blog creat 包頭 create or replace package pro_test as TYPE out_cursor IS REF CURSOR; procedure A
類和對象,類定義了對象的特征和行為。屬性,方法。
sum pri 特征 tdi 喇叭 AC mount oar key 1、編寫一個ATM機類,有屬性:所屬銀行、顯示余額、,有方法:取款、存款、查詢余額 /* * 取款機實體類 * ATM */public class ATM { String affiliatedB
redis學習1--初識redis,redis的安裝,啟動。。。
redis 3.0 啟動 一個 工作 持久 集群 端口號 daemonize Linux 環境下 下載redis wget http://download.redis.io/releases/redis-3.0.7.tar.gz 解壓 tar -zxvf redis-3.0
python 代碼題06 回數是指從左向右讀和從右向左讀都是一樣的數,例如12321,909。請利用filter()篩選出回數
list turn 例如 lte else 代碼 rom 都是 python def is_palindrome(n): return str(n) == str(n)[::-1] output = filter(is_palindrome, range(1, 10
晚飯後,每天學習兩小時,堅持。每天分享正能量!
百度 繼續 都是 每年 十年 總監 pic tps 才有 轉自:https://www.douban.com/group/topic/39919603/ 職業 工作中的戰略戰術問題 我大學畢業10年了,和大部分大學畢業生一樣,我職業生涯的前五年可以說成是在走彎路,甚至可以說
【實戰】下載歌曲只能開綠鑽?NoNoNo, Python爬蟲,無所不能。
引言 給大家帶來絕對福利,之前在某Q音樂上聽歌,如果想要下載某首歌曲,總是提示小編開通綠鑽,作為一個爬蟲愛好者,怎麼可能花這冤枉錢呢?所以,辦法總是人想的,具體過程就不多說了,最終結果就是通過100行程式碼,可以下載只有綠鑽才能下載的歌曲哦~ 原始碼 連結:https:
Enjoy! 多達400多萬的動態搞笑,愛情,友情。。。。表情下載 表情表情自定義表情表情圖片下載 自定義QQ表情使用方法完全圖解
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!