1. 程式人生 > >千里之行,始於足下。

千里之行,始於足下。

文章是轉來的,剛好今天公司同事給我們分享了這方面的一些資料,其中用到的例子就是文字最後的那個例子。但是例子中的程式碼用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

 testCase1(){

       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主要索引方式:FULLTEXTHASHBTREERTREE

作用 大神 方法 為什麽 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,人們議論紛紛

記一次非常無語的生成柱狀圖jsecshop

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--初識redisredis的安裝啟動

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 回數是指從左向右讀和從右向左讀都是一樣的數例如12321909請利用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 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!