1. 圈复杂度

1.1 什么是圈复杂度?

引用[1]
圈复杂度是 Thomas J. McCabe 在 1976年开创的软件指标,用来判断程序的复杂度。这个指标度量源代码中线性独立的路径或分支的数量。根据 McCabe 所说,一个方法的复杂度最好保持在10 以下。这是因为对人类记忆力的研究表明,人的短期记忆只能存储 7 件事(偏差为正负 2)。

如果开发人员编写的代码有 50 个线性独立的路径,那么为了在头脑中描绘出方法中发生的情况,需要的记忆力大约超过短期记忆容量的 5倍。简单的方法不会超过人的短期记忆力的极限,因此更容易应付,事实证明它们的错误更少。Enerjy 在 2008年所做的研究表明,在圈复杂度与错误数量之间有很强的相关性。复杂度为 11 的类的出错概率为 0.28,而复杂度为 74的类的出错概率会上升到 0.98。

1.2 计算原理

TODO

2. lizard

Git源码链接 https://github.com/terryyin/lizard

  • 默认递归分析文件夹
  • 支持15中开发语言: C/C++ (works with C++14); Java; C# (C Sharp); JavaScript (With ES6 and JSX); Objective-C; Swift; Python; Ruby; TTCN-3; PHP; Scala; GDScript;Golang; Lua; Rust

2.1 依赖安装

方式一 pip安装

pip install lizard

方式二 源码安装

python setup.py install --install-dir=/path/to/installation/directory/

方式三 直接运行
直接将lizard.py及依赖的目录移动到待检测的文件目录中, 直接在命令行中运行以下命令,控制台数据结果表格

python lizard.py

2.2 使用

命令行使用

lizard [options] [PATH or FILE] [PATH] ...
# 示例 检测某目录下 除 tests目录下 Python文件
lizard mySource/ -x"./tests/*" -l python-h, --help            显示帮助并退出
--version             显示当前lizard版本并退出
-l LANGUAGES, --languages LANGUAGES开发语言列表, 检测支持的开发语言 例如:lizard -l cpp -l java支持语言:cpp, csharp, java, javascript, objectivec, php, python, ruby, swift, ttcn
-V, --verbose         Output in verbose mode (long function name)
-C CCN, --CCN CCN     Threshold for cyclomatic complexity number warning.The default value is 15. Functions with CCN biggerthan it will generate warning
-L LENGTH, --length LENGTHThreshold for maximum function length warning. Thedefault value is 1000. Functions length bigger than itwill generate warning
-a ARGUMENTS, --arguments ARGUMENTSLimit for number of parameters
-w, --warnings_only   Show warnings only, using clang/gcc's warning formatfor printing warnings.http://clang.llvm.org/docs/UsersManual.html#cmdoption-fdiagnostics-format
-i NUMBER, --ignore_warnings NUMBERIf the number of warnings is equal or less than thenumber, the tool will exit normally, otherwise it willgenerate error. Useful in makefile for legacy code.
-x EXCLUDE, --exclude EXCLUDE    不检测文件Exclude files that match this pattern. * matcheseverything, ? matches any single character,"./folder/*" exclude everything in the folderrecursively. Multiple patterns can be specified. Don'tforget to add "" around the pattern.
--csv                 Generate CSV output as a transform of the defaultoutput
-X, --xml             Generate XML in cppncss style instead of the tabularoutput. Useful to generate report in Jenkins server
-t WORKING_THREADS, --working_threads WORKING_THREADSnumber of working threads. The default value is 1.Using a bigger number can fully utilize the CPU andoften faster.
-m, --modified        Calculate modified cyclomatic complexity number,which count a switch/case with multiple cases asone CCN.
-E EXTENSIONS, --extension EXTENSIONSUser the extensions. The available extensions are:-Ecpre: it will ignore code in the #else branch.-Ewordcount: count word frequencies and generate tagcloud. -Eoutside: include the global code as onefunction.
-s SORTING, --sort SORTINGSort the warning with field. The field can be nloc,cyclomatic_complexity, token_count, parameter_count,etc. Or an customized file.
-W WHITELIST, --whitelist WHITELIST  白名单The path and file name to the whitelist file. It's'./whitelizard.txt' by default.

结果解读

NLOC    the nloc (lines of code without comments),
CCN     cyclomatic complexity number
token   token count of functions.
param   parameter count of functions.

结果样例

================================================== ============NLOC CCN令牌参数function @ line @ file
-------------------------------------------------- ------------10 2 29 2 start_new_player @ 26 @。/ html_game.c...6 1 3 0 set_shutdown_flag @ 449 @。/ httpd.c24 3 61 1 server_main @ 454 @。/ httpd.c
-------------------------------------------------- ------------
2文件分析。
================================================== ============
LOC Avg.NLOC AvgCCN Avg.ttoken function_cnt文件
-------------------------------------------------- ------------191 15 3 51 12 ./html_game.c363 24 4 86 15 ./httpd.c=====================================
!!!! 警告(CCN> 15)!!!!
=====================================66 19 247 1 accept_request @ 64 @。/ httpd.c
================================================== ==============================
NLOC平均总NLOC平均CCN平均代币Fun Cnt警告cnt Fun Rt NLOC Rt
-------------------------------------------------- ------------------------------554 20 4.07 71.15 27 1 0.04 0.12

更多用法:

  • 白名单设置
  • CNN阈值设置
  • 重复代码检测

2.* Jenkins中配置

TODO

3. PyCmetrics

TODO

4.pygenie

TODO

5. 圈复杂度优化建议

  • 尽量少用 if …else … ,等分支语句
  • 每个函数要有明确的功能实现,不要为了追求行数少而合并功能实现
  • 模型数据的赋值、校验最好放在 model 自己里面
  • 逻辑模块和数据模块要区分开编写

引用

[1] 用 Python 编写干净、可测试、高质量的代码

【Python CI】圈复杂度 lizard相关推荐

  1. java 圈复杂度_详解圈复杂度

    详解圈复杂度 圈复杂度概念 圈复杂度(Cyclomatic complexity,简写CC)也称为条件复杂度,是一种代码复杂度的衡量标准.由托马斯·J·麦凯布(Thomas J. McCabe, Sr ...

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

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

  3. 圈复杂度 (Cyclomatic Complexity)

    概念 圈复杂度也称条件复杂度,是一种衡量代码复杂度的标准.它可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,也可以理解为覆盖所有情况最少使用的测试用例数.圈复杂度大说明程序代码的 ...

  4. java 圈复杂度_圈复杂度和代码质量优化(附带示例代码纠正代码质量)

    什么是圈复杂度? --------------------------------------- 圈复杂度(Cyclomatic Complexity)是衡量计算机程序复杂程度的一种措施.它根据程序从 ...

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

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

  6. php 函数圈复杂度,圈复杂度和McCabe

    [书名]:软件架构--Python语言实现 [主题]:圈复杂度 [摘要]:圈复杂度(Cyclomatic Complexity)是衡量计算机程序复杂程度的一种措施.它根据程序从开始到结束的线性独立路径 ...

  7. 浅析代码圈复杂度及认知复杂度

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

  8. 圈复杂度 Cyclomatic complexity 介绍

    背景 代码的可测试性和可维护性是非常重要的,比如,下面的代码: 只是输出简单的"Hello, world", 大家都不会否认这个代码写得太复杂太难维护了.那么,有没有什么度量指标来 ...

  9. 圈复杂度 - 软件工具

    1. 圈复杂度 圈复杂度(Cyclomatic complexity,简写CC)也称为条件复杂度,是一种代码复杂度的衡量标准.由托马斯·J·麦凯布(Thomas J. McCabe, Sr.)于197 ...

  10. java 圈复杂度_关于Java:降低Switch语句的循环复杂度-Sonar

    我想减少开关盒的圈复杂度 我的代码是: public String getCalenderName() { switch (type) { case COUNTRY: return country = ...

最新文章

  1. Java并发面试,幸亏有点道行,不然又被忽悠了
  2. 企业网络运行中,您是否遇到如下问题?——Vecloud
  3. Ubuntu12.04 VMware Tools的安装
  4. 动态规划:求最长公共子序列和最长公共子串
  5. 用inno做setup遇到的一些问题及解决方法
  6. 移动端下拉刷新原理和实例
  7. 新手思考如何开发自己的软件
  8. phpstudy配置SSL证书的步骤(Apache环境)以及一些注意事项
  9. concat oracle 多个字符串_史上最全的MySQL 字符串函数,赶紧收藏!!
  10. linux分区命令mtd,修改IPQ4019/4018的MTD分区
  11. 一键卸载MSSQL_1.2 Beta版
  12. Java调用第三方接口(http总结)
  13. pdftomusic pro(音乐谱曲软件) v1.0.4
  14. 解决微擎框架出现Could not resolve: cloud.zhifun.cc (Domain name not found)问题
  15. 人工智能神经网络概念股,神经网络芯片概念股
  16. SPSS多元线性回归残差分析的基本方法
  17. 【工业大数据】工厂大数据之数据源分析;如何挖掘并驾驭大数据的价值,成为“大数据企业”?
  18. Spring Boot 3.0 正式发布,这份升级指南必须收藏
  19. 带你了解中国互联网发展报告
  20. 免费开放NBA赛事接口

热门文章

  1. python[爬虫]爬取百万条新浪新闻 新浪滚动新闻中心(多进程)
  2. php 实现心芯图案,利用php输出不同的心形图案,php心形图案
  3. AOSP、AOKP、CM的区别
  4. C# RSA、AES加密解密
  5. linux录制声卡声音_linux下ALSA声卡 录音问题
  6. 波士顿房价预测python决策树_机器学习第二练---波士顿房价预测
  7. 亲自动手搭建微服务框架和测试环境-3-Redis
  8. 联想Y470 非虚拟机安装苹果Mac OS X Mavericks 10.9.1教程详解(文字+图片),通俗易懂亲自动手——序列一之综述简介,硬盘分区
  9. 正面管教读书笔记 05 当心逻辑后果
  10. 用p5.js绘制创意自画像