美文网首页
圈复杂度

圈复杂度

作者: Hedy1203 | 来源:发表于2019-01-13 15:38 被阅读0次

简介

圈复杂度(Cyclomatic complexity)是一种代码复杂度的衡量标准,在1976年由Thomas J. McCabe, Sr. 提出。

在软件测试的概念里,圈复杂度用来衡量一个模块判定结构的复杂程度,数量上表现为线性无关的路径条数,即合理的预防错误所需测试的最少路径条数。圈复杂度大说明程序代码可能质量低且难于测试和维护,根据经验,程序的可能错误和高的圈复杂度有着很大关系。

定义

软件源码某部分的圈复杂度就是这部分代码中线性无关路径的数量。

计算

它的计算方法很简单:

计算公式1:V(G)=e-n+2p。其中,e表示控制流图中的数量,n表示控制流图中节点的数量,p图的连接组件数目(图的组件数是相连节点的最大集合)。因为控制流图都是连通的,所以p为1。例如图1:

图1

计算公式2:V(G)=区域数=判定节点数+1。其实,圈复杂度的计算还有更直观的方法,因为圈复杂度所反映的是“判定条件”的数量,所以圈复杂度实际上就是等于判定节点的数量再加上1,也即控制流图的区域数。

对于多分支的CASE结构或IF-ELSEIF-ELSE结构,统计判定节点的个数时需要特别注意一点,要求必须统计全部实际的判定节点数,也即每个ELSEIF语句,以及每个CASE语句,都应该算为一个判定节点。例如图2:

图2

计算公式3:V(G)=R。其中R代表平面被控制流图划分成的区域数。例如图3

图3

针对程序的控制流图计算圈复杂度V(G)时,最好还是采用第一个公式,也即V(G)=e-n+2;而针对模块的控制流图时,可以直接统计判定节点数,这样更为简单;针对复杂的控制流图是,使用区域计算公式V(G)=R更为简单。

圈复杂度检测

采用python脚本检测,参考链接:本地圈复杂度检测工具

在链接中找到 lizard.py 并下载到本地,移动到需要检测的文件目录下,然后用控制台进入到目标目录,运行 python lizard.py 指令就可以在控制台生成圈复杂度结果数据表。

圈复杂度优化建议

1、尽量少用 switch case ,&& ,|| ,if ,等判断运算;

2、每一个方法要有明确的功能实现,不要为了追求行数少而合并功能实现;

3、模型数据的赋值、校验最好放在 model 自己里面;

4、逻辑模块和数据模块要区分开编写;

备注:圈复杂度计算公式和图片来源百度百科

相关文章

  • 代码复杂度的size

    一,HighCyclomaticComplexity(高圈复杂度) 圈复杂度由通过程序源代码的线性无关路径的数量决...

  • 圈复杂度

    简介 圈复杂度(Cyclomatic complexity)是一种代码复杂度的衡量标准,在1976年由Thomas...

  • 圈复杂度

    圈复杂度(Cyclomatic Complexity)是一种代码复杂度的衡量标准。它可以用来衡量一个模块判定结构的...

  • 模块2作业 朋友圈高性能复杂度

    分析一下微信朋友圈的高性能复杂度 【作业要求】对照模块 2 讲述的复杂度分析方法,分析微信朋友圈的复杂度;针对各个...

  • 驱动开发在Golang中的应用

    前言 在了解表驱动开发之前,有一个概念需要了解以下,那就是圈复杂度,又叫循环复杂度,那么什么是圈复杂度呢? 维基百...

  • 程序复杂度之圈复杂度

    圈复杂度(Cyclomatic complexity)也称为条件复杂度或循环复杂度,是一种软件度量,是由Thoma...

  • 架构训练营模块二作业

    分析一下微信朋友圈的高性能复杂度【作业要求】 对照模块2讲述的复杂度分析方法,分析微信朋友圈的复杂度。 针对各个复...

  • 软件的复杂度 vs 难度

    本文是对于软件复杂度的零碎思考和记录。 内容包括,软件复杂度本身没有统一定义; 介绍常见代码复杂度,圈复杂度;比较...

  • 圈复杂度度量

    在C/C++下强烈推荐 CCM ,优点如下: 配置文件是类xml格式,参数很少,非常容易配置 可以按目录、文件、函...

  • 圈复杂度详解

    文章首发于技术博客Aller_Dong 一、现象 当项目规模达到一定的程度,比如达到十万行的代码量。那么项目肯定存...

网友评论

      本文标题:圈复杂度

      本文链接:https://www.haomeiwen.com/subject/nyxldqtx.html