软件应用在发展到适当时机,”重构”,是开发过程中不可避免需要进行的一项工作。重构代码,以适配当前模块设计之初未考虑到的多样化场景,并增加模块的可维护性、健壮性、可测试性。那么,如何明确重构的方向,以及量化重构的结果呢?代码圈复杂度可以是一个供选择的指标。下文介绍如何获取应用的代码圈复杂度做到线上监控,给到复盘程序复杂程度的数据支撑。
圈复杂度(Cyclomatic complexity,简写CC)也称为条件复杂度,是一种代码复杂度的衡量标准。由托马斯·J·麦凯布(Thomas J. McCabe, Sr.)于1976年提出,用来表示程序的复杂度,其符号为VG或是M。它可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,也可理解为覆盖所有的可能情况最少使用的测试用例数。圈复杂度大说明程序代码的判断逻辑复杂,可能质量低且难于测试和维护。程序的可能错误和高的圈复杂度有着很大关系。
常用结构圈复杂度计算
如上列出行业内相对认可的度量数据,实际这个完全是看自己的业务体量和项目情况来决定的。假设你的业务很简单,而且是个单体应用,功能都是很简单的CRUD,那你的圈复杂度即使想上去也没有那么容易。此时你就可以选择把圈复杂度的重构阈值设定为10.
假设你的业务十分复杂,而且涉及到多个其他的微服务系统调用,再加上各种业务中的corner case的判断,圈复杂度上100可能都不在话下。
1)函数提炼与拆分,单一职责
2)优化算法
3)表达式逻辑优化
4)减少提前return
1)开发语言
2)依赖环境
3)脚本架构
1)支持检索语言范围:
支持15种开发语言,包含常用语言如下
2)扫描参数配置说明:
利用lizard执行扫描,常用命令如下:
配置检查范围:
-l LANGUAGES, --languages LANGUAGES
-x EXCLUDE, --exclude EXCLUDE
-W WHITELIST, --whitelist WHITELIST
配置阀值警告:
-C CCN, --CCN CCN
-T THRESHOLDS, --Threshold THRESHOLDS
配置报告输出:
-o OUTPUT_FILE, --output_file OUTPUT_FILE
官网地址:http://www.lizard.ws
源码地址:https://github.com/terryyin/lizard
3)定时执行扫描任务:
def dojob(): scheduler = BackgroundScheduler() scheduler.add_job(func, "cron", hour=21, minute=30) scheduler.start()
对于软件代码好坏的衡量,圈复杂度可以作为一个参考指标,研发可以通过提炼拆分函数、优化算法、优化逻辑表达式等方法降低模块(函数)圈复杂度。以上阐述圈复杂度一种线上监控方法,利用好线上化数据,结合现有团队项目情况,才能形成更好的实践机制。
留言与评论(共有 0 条评论) “” |