【Python CI】圈复杂度 lizard
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相关推荐
- java 圈复杂度_详解圈复杂度
详解圈复杂度 圈复杂度概念 圈复杂度(Cyclomatic complexity,简写CC)也称为条件复杂度,是一种代码复杂度的衡量标准.由托马斯·J·麦凯布(Thomas J. McCabe, Sr ...
- 利用Java反射机制降低代码圈复杂度
利用Java反射机制降低代码圈复杂度 在实际的工作中,我遇到了项目里老代码存在圈复杂度过高的问题,在提交代码的时候通不过CI(代码检查)的Lizard复杂度检查,所以迫切需要解决这个问题,运用Java ...
- 圈复杂度 (Cyclomatic Complexity)
概念 圈复杂度也称条件复杂度,是一种衡量代码复杂度的标准.它可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,也可以理解为覆盖所有情况最少使用的测试用例数.圈复杂度大说明程序代码的 ...
- java 圈复杂度_圈复杂度和代码质量优化(附带示例代码纠正代码质量)
什么是圈复杂度? --------------------------------------- 圈复杂度(Cyclomatic Complexity)是衡量计算机程序复杂程度的一种措施.它根据程序从 ...
- 如何降低前端代码圈复杂度?
作者 | ConardLi 责编 | maozz 出品 | CSDN(ID:CSDNnews) 写程序时时刻记着,这个将来要维护你写的程序的人是一个有严重暴力倾向,并且知道你住在哪里的精神变态者. 导 ...
- php 函数圈复杂度,圈复杂度和McCabe
[书名]:软件架构--Python语言实现 [主题]:圈复杂度 [摘要]:圈复杂度(Cyclomatic Complexity)是衡量计算机程序复杂程度的一种措施.它根据程序从开始到结束的线性独立路径 ...
- 浅析代码圈复杂度及认知复杂度
Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...
- 圈复杂度 Cyclomatic complexity 介绍
背景 代码的可测试性和可维护性是非常重要的,比如,下面的代码: 只是输出简单的"Hello, world", 大家都不会否认这个代码写得太复杂太难维护了.那么,有没有什么度量指标来 ...
- 圈复杂度 - 软件工具
1. 圈复杂度 圈复杂度(Cyclomatic complexity,简写CC)也称为条件复杂度,是一种代码复杂度的衡量标准.由托马斯·J·麦凯布(Thomas J. McCabe, Sr.)于197 ...
- java 圈复杂度_关于Java:降低Switch语句的循环复杂度-Sonar
我想减少开关盒的圈复杂度 我的代码是: public String getCalenderName() { switch (type) { case COUNTRY: return country = ...
最新文章
- Java并发面试,幸亏有点道行,不然又被忽悠了
- 企业网络运行中,您是否遇到如下问题?——Vecloud
- Ubuntu12.04 VMware Tools的安装
- 动态规划:求最长公共子序列和最长公共子串
- 用inno做setup遇到的一些问题及解决方法
- 移动端下拉刷新原理和实例
- 新手思考如何开发自己的软件
- phpstudy配置SSL证书的步骤(Apache环境)以及一些注意事项
- concat oracle 多个字符串_史上最全的MySQL 字符串函数,赶紧收藏!!
- linux分区命令mtd,修改IPQ4019/4018的MTD分区
- 一键卸载MSSQL_1.2 Beta版
- Java调用第三方接口(http总结)
- pdftomusic pro(音乐谱曲软件) v1.0.4
- 解决微擎框架出现Could not resolve: cloud.zhifun.cc (Domain name not found)问题
- 人工智能神经网络概念股,神经网络芯片概念股
- SPSS多元线性回归残差分析的基本方法
- 【工业大数据】工厂大数据之数据源分析;如何挖掘并驾驭大数据的价值,成为“大数据企业”?
- Spring Boot 3.0 正式发布,这份升级指南必须收藏
- 带你了解中国互联网发展报告
- 免费开放NBA赛事接口
热门文章
- python[爬虫]爬取百万条新浪新闻 新浪滚动新闻中心(多进程)
- php 实现心芯图案,利用php输出不同的心形图案,php心形图案
- AOSP、AOKP、CM的区别
- C# RSA、AES加密解密
- linux录制声卡声音_linux下ALSA声卡 录音问题
- 波士顿房价预测python决策树_机器学习第二练---波士顿房价预测
- 亲自动手搭建微服务框架和测试环境-3-Redis
- 联想Y470 非虚拟机安装苹果Mac OS X Mavericks 10.9.1教程详解(文字+图片),通俗易懂亲自动手——序列一之综述简介,硬盘分区
- 正面管教读书笔记 05 当心逻辑后果
- 用p5.js绘制创意自画像