当前位置: 首页 > 后端技术 > Java

重构指标如何监控代码圈复杂度

时间:2023-04-01 22:57:18 Java

1引言当软件应用程序开发到合适的时候,“重构”是开发过程中不可避免的需要完成的工作。重构代码以适应当前模块设计之初没有考虑到的多样化场景,增加模块的可维护性、健壮性和可测试性。那么,如何明确重构的方向,量化重构的结果呢?代码圈复杂度可以作为替代指标。下面介绍如何获取应用的代码圈复杂度进行在线监控,为回放程序的复杂度提供数据支持。2背景知识2.1圈复杂度圈复杂度(简称CC),又称条件复杂度,是代码复杂度的度量。由ThomasJ.McCabe,Sr.于1976年提出,用来表示程序的复杂度,符号为VG或M,可以用来衡量一个模块的判断结构的复杂度。在数量上表示为独立电流路径的数量,也可以理解为用于覆盖所有可能情况的最少测试用例数。圈复杂度大说明程序代码的判断逻辑复杂,可能质量低下,难以测试和维护。程序可能出现的错误与高圈复杂度有很大关系。2.2循环复杂度计算方法常用结构循环复杂度计算顺序结构:顺序结构复杂度为1。if-else-else,switch-case:每增加一个分支,复杂度加1,&&和||的运算。也是一个分支。循环结构:增加循环结构,复杂度增加1。return:增加return语句,复杂度增加1。2.3圈复杂度指标以上列举了业界比较认可的指标。实际上,这完全取决于您的业务量和项目情况。假设你的业务很简单,是一个单体应用,CRUD功能简单,那你的圈复杂度你想想也不是那么容易。此时可以选择将圈复杂度的重构阈值设置为10。假设你的业务非常复杂,涉及多个其他微服务系统调用,再加上各个业务中对cornercase的判断,100的圈复杂度可能并不高一个问题。2.4降低圈复杂度的方法1)功能抽取和拆分,将单一职责拆分成子功能。每个功能都必须有明确的功能实现。不要合并功能以减少行数。逻辑模块和数据模块要分开写2)优化算法,减少不必要的条件和循环分支,少用if…else…,用三元表达式代替ifelse3)表达式逻辑优化合并条件表达式,比如用||b||c4)减少早退3解决方案概述3.1脚本设计1)开发语言python2)依赖环境lizardAPSchedulersmtplibpymysql3)脚本架构3.2功能介绍1)支持搜索语言范围:支持15种开发语言,包括以下常用语言C/C++(workswithC++14)JavaC#(CSharp)JavaScript(WithES6andJSX)PythonGolang2)扫描参数配置说明:使用lizard进行扫描,常用命令如下:配置检查范围:列出编程语言待分析。如果留空,将搜索所有支持的语言。-lLANGUAGES,--languagesLANGUAGES排除匹配模式的文件。匹配一切?匹配任何单个字符,“/folder/”递归地排除文件夹中的所有内容。可以指定多个模式。不要忘记在图案周围加上“”符号。-xEXCLUDE,--excludeEXCLUDE设置白名单,默认'./whitelizard.txt'-WWHITELIST,--whitelistWHITELIST配置阈值警告:圈复杂度警告阈值,默认值为15,>15会产生警告。-CCCN,--CCNCCN设置限制字段数。可以是代码行数、圈复杂度、标记数、参数数或自定义字段。如果功能设置超过限制数量,将发出警报。-TTHRESHOLDS,--ThresholdTHRESHOLDS配置报告输出:按照-oOUTPUT_FILE,--output_fileOUTPUT_FILE格式输出到文件官网地址:http://www.lizard.ws源码地址:https://github。com/terryyin/l...3)定时执行扫描任务:通过BackgroundScheduler创建调度任务,自动触发扫描方法,并将结果写入库defdojob():scheduler=BackgroundScheduler()scheduler.add_job(func,"cron",hour=21,minute=30)scheduler.start()3.3结果显示3.3.1ReportNomenclatureExplanationCyclomaticcomplexity,cyclomaticcomplexity即分支复杂度,最好保持在15以下,并且当前脚本设置阈值为10。LOC,包含注释的代码行数,目前设置阈值为200。tokencount,标记数量,一个程序最多可以有8192个标记,每个标记是一个词,比如关键字、标识符、常量、标点符号、运算符。将括号和字符串计为1个标记。逗号、句点、LOCAL、分号、END和注释不计算在内。参数个数,参数个数为函数的参数个数,当前脚本设置阈值10个。3.3.2执行结果展示Windows环境运行脚本,输入file_root(文件地址)执行扫描,支持自动pop-up浏览器显示运行的Html报表,每周定时执行,按系统维度扫描,支持触发邮件通知对应系统研发查看超过阈值的方法名。图4总结圈复杂度可以作为衡量软件代码质量的参考指标。研发可以通过细化和拆分功能、优化算法、优化逻辑表达式来降低模块(功能)的圈复杂度。上面将圈复杂度描述为一种在线监控方法。只有利用好线上数据,结合现有团队项目情况,才能形成更好的实践机制。