Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475

写在开始

圈复杂度用来描述一段代码“可测性”很好(可测性这里指需要构建完善的覆盖全面的单元测试需要付出多少代价),但它的设计模型很难得出一个很好的“可读性&可维护性”的测量结果

新版soanrqube引入了认知复杂度的概念,这个复杂度指标弥补了圈复杂度的一些不足,能更准确的反映一段代码的理解成本,以及维护这段代码的困难程度。

下面就简要的描述下,为何认知复杂度更适合用来评价一段代码的可读性及可维护性。

什么是圈复杂度?

圈复杂度(Cyclomatic complexity)是一种代码复杂度的衡量标准,在1976年由Thomas J. McCabe, Sr. 提出,目标是为了指导程序员写出更具可测性和可维护性的代码。

它可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立路径条数,也可以理解为覆盖所有可能的情况最少需要的测试用例数量。

代码圈复杂度的计算方法

通常采用的计算方法为点边计算法(当然还有节点判定法),计算公式为:

V(G) = e – n + 2

e 代表在控制流图中的边的数量(对应代码中顺序结构的部分),n 代表在控制流图中的节点数量,包括起点和终点(注:所有终点只计算一次,即便有多个return或者throw;节点对应代码中的分支语句)

假定有如下这样一段代码:

根据公式 V(G) = e – n + 2 = 12 – 8 + 2 = 6 ,上图的圈复杂段为6。

注:说明一下为什么n = 8,虽然图上的真正节点有12个,但是其中有5个节点为throw、return,这样的节点为end节点,只能记做一个

为什么要引入认知复杂度?

圈复杂度最初的目的是用来识别“难以测试和维护的软件模块”,它能算出最少的全覆盖的测试用例量,但是不能测出一个让人满意的“理解难度”。

这是因为同样圈复杂度的代码,不一定会具有相同的可维护性,我们看看下面的两个例子:

上面这两段代码具有相同的圈复杂度,但显然不具有相同的可读性和可维护性性,这就是圈复杂度的不足之处。

因为圈复杂度理论是在1976年提出的,它不包含一些现代的语言结构,比如try-catch、lambda。

并且,每个方法都默认有一个最小圈复杂度1,这就让我们无从得知,一个给定的类如果圈复杂度很高,它是一个大的易维护的类,还是一个很小很复杂的类。

为了解决上述这些问题,所以引入了“认知复杂度”,它将一段代码被阅读和理解时的复杂程度,估算成一个具体数字

认知复杂度如何评判?

认知复杂度评定基本原则

  • 对线性的代码逻辑中,出现一个打断逻辑的东西,复杂度+1;
  • 当打断逻辑的是一个嵌套时,复杂度+1;
  • 忽略简写:把多句代码缩写为一句可读的代码,复杂度不会额外增加;

上面这种描述可能有点抽象,具体一点说,以下控制流结构会导致认知复杂度增加:

for, while, do while, 三元运算符, if/elif/else, catch语句, 跳转语句(goto/break/continue), 以及嵌套的控制流(每一层嵌套复杂度递增)

我们继续拿上面提到的两个例子举例:

圈复杂度对于getWord方法本身会默认有1的复杂度,每多一个case复杂度+1,所以最终圈复杂度为4

而认知复杂度,对于整个 switch 结构只增加1的复杂度,因为从可理解、可维护程度来说,多几个case并不会导致其增加(当然,大量的case也是我们应当尽力去避免的)

我们接着看另外一个例子:

如你所看到的,认知复杂度考虑到了使这个方法比前面提到的getWords()方法更难理解的因素——嵌套以及跳转语句

因此,虽然这两个方法的圈复杂度是一样的,但是它们的认知复杂度数据很好的反映了它们两者在可理解性/可维护性上的差异。

另外,相对于圈复杂度默认所有方法至少有1的复杂度,认知复杂度并没有这样一个评定规则,这对于entity等简单类的复杂度评判会更加友好和客观:

综上所述,认知复杂度作为代码的“可读性/可维护性”评定指标会更加合适。


附、代码复杂度与软件质量关系

以上复杂度数值可以理解为方法粒度,即如果某一个方法复杂度>30,那这个方法的可读性和可维护性就很低了

浅析代码圈复杂度及认知复杂度相关推荐

  1. 如何降低前端代码圈复杂度?

    作者 | ConardLi 责编 | maozz 出品 | CSDN(ID:CSDNnews) 写程序时时刻记着,这个将来要维护你写的程序的人是一个有严重暴力倾向,并且知道你住在哪里的精神变态者. 导 ...

  2. 利用Java反射机制降低代码圈复杂度

    利用Java反射机制降低代码圈复杂度 在实际的工作中,我遇到了项目里老代码存在圈复杂度过高的问题,在提交代码的时候通不过CI(代码检查)的Lizard复杂度检查,所以迫切需要解决这个问题,运用Java ...

  3. java代码质量 圈复杂度,代码圈复杂度(Cyclomatic Complexity,CC)和Oclint工具 介绍...

    什么是代码圈复杂度 圈复杂度是一种度量程序复杂度的方法,由 Thomas McCabe 于 1976年定义,用来衡量一个模块判定结构的复杂程度,数量上表现为独立路径条数,即合理的预防错误所需测试的最少 ...

  4. 控制流图|圈复杂度|基本复杂度

    控制流图|圈复杂度|基本复杂度 控制流图是McCabe复杂度计算的基础,McCabe度量标准是将软件的流程图转化为有向图,然后以图论的知识和计算方法来衡量软件的质量.McCabe复杂度包括圈复杂度(C ...

  5. 文档相似度之词条相似度word2vec、及基于词袋模型计算sklearn实现和gensim

    文档相似度之词条相似度word2vec.及基于词袋模型计算sklearn实现和gensim 示例代码: import jieba import pandas as pd from gensim.mod ...

  6. Java实现均摊_Java均摊复杂度和防止复杂度的震荡原理分析

    本文实例讲述了Java均摊复杂度和防止复杂度的震荡.分享给大家供大家参考,具体如下: 关于上一节封装数组的简单复杂度分析方法中我们对添加操作的时间复杂度归结为O(n)是考虑了扩容操作(resize)在 ...

  7. 玩转数据结构——均摊复杂度和防止复杂度的震荡(笔记)

    数据规模 时间复杂度 并不是所有的双层循环都是O(n^2)的 复杂度实验来确定复杂度 // O(N) 两倍增加 int findMax( int arr[], int n ){assert( n &g ...

  8. 架构之技术复杂度与业务复杂度

    2019独角兽企业重金招聘Python工程师标准>>> 今天给自己提出一个问题,如何在项目代码中,如何将技术复杂度与业务复杂度分开,我以前从未想过这个问题,直到看到张逸的领域驱动设计 ...

  9. 气温常年在25度的地方_25度是什么气候

    1.25度到30度是什么地区的气候类型 ? 2.天气25度左右大概要穿什么衣服合适了 25度左右的天气,其实早上是挺凉爽的,如果是上班族,早出晚归,可以穿长袖衬衫加上薄外套,或直接西装都可以. 推荐: ...

最新文章

  1. vue 同一个域名移动端pc端两套代码跳转_百度移动搜索优化:手机站优化指南
  2. Android 学习视频
  3. RabbitMQ六种工作模式:simple work publish routing topic rpc
  4. hdu5247 找连续数
  5. java单分支结构,java基础语法分支结构
  6. Linux内存管理:NUMA技术详解(非一致内存访问架构)
  7. 【Scala】使用Scala语言定义函数和函数使用(比较两个数的大小代码)
  8. Away3D 的实体收集器流程2
  9. 帝国CMS 7.5仿《讲历史网》模板/优秀的历史网帝国CMS模板下载
  10. 苹果id注册邮箱方法
  11. arcgis裁剪多个shp文件_ArcGIS批量裁剪矢量数据
  12. Android studio开发app实现仿微信滑动切换界面
  13. ‘MSOCache’是什么文件?
  14. 大牛云集!清华大学2019年姚班及智班第一届AI本科生名单公布!
  15. c语言的条件运算符,C语言条件运算符
  16. 免费支持顺丰、四通一达、EMS等快递物流单号查询的开放接口?
  17. kubectl源码分析之rollout history
  18. 计算机组装需要注意什么东西,组装一台计算机需要注意那些问题?
  19. 反馈 术语 串小鸭 并大流
  20. ✿2021NEWCTF6.1萌新赛✿MISC-all-WP

热门文章

  1. 数据一致性比对(番外)
  2. 使用kms软件激活windows 10企业版
  3. 测试中的数据统计分析的验证:python脚本+复杂SQL总结
  4. Electron从入门到精通
  5. androidAsync fridaManager 实现某宝 sgmain 70102 rpc 远程调用
  6. 计算机蓝屏重启,电脑总是会蓝屏重启的具体解决方法,一看就能学会
  7. kotlin创建静态单利_Kotlin程序来计算单利
  8. 几款好用的免费内网穿透
  9. 华为交换机中用户登陆相关配置
  10. Centos下无线网卡的安装配置