问题提出:
1、概念:什么是圈复杂度,有什么影响;
2、工具:需要有工具定期扫描,谁负责管理;
3、标准:统一代码标准;
4、整改:如何整改,可落地执行的方案;
5、培训:需要对开发团队全员培训,工具可能后面要交由运维进行管理维护,
需要对运维人员进行工具使用的培训。
名词解释
圈复杂度简介
圈复杂度(Cyclomatic complexity)是一种衡量代码复杂度的标准,由托马斯·J·麦凯布(Thomas J. McCabe, Sr.)于1976年提出,用来表示程序的复杂度,符号为v(G)。它用来衡量一个模块判定结构的复杂程度,数量上表现为独立路径条数,也可表示为覆盖软件所有的可能情况最少使用的测试用例数。圈复杂度越高说明程序的判断逻辑越复杂,可能致使程序质量低且难于测试和维护。程序的缺陷和高圈复杂度有着很大关系,圈复杂度最高的模块,其缺陷个数也可能最多。McCabe将圈复杂度限制为10。圈复杂度可应用在程序的子程序、模块、方法或类中。
圈复杂度标准
对复杂度基本可以分为以下几个级别:
- 1 - 10 程序简单,风险小
- 11 - 20 更复杂,中等风险
- 21 - 50 复杂、高风险
- 50 不可测试的代码,非常高的风险
安装开源工具
go install github.com/fzipp/gocyclo/cmd/gocyclo@latest
rem gocyclo -top 5 .\core
开源集成工具:
安装goinstall.bat
执行检查
gomini cc默认项目根目录再分子目录
gomini ccfile指定文件
gomini ccall默认根目录或指定
gocyclo -top 10 D:\go-ichub\go\gomini/cmd > D:\go-ichub\go\gomini/data/cc/cmd-cc-report.txt gocyclo -top 10 D:\go-ichub\go\gomini/mini > D:\go-ichub\go\gomini/data/cc/mini-cc-report.txt gocyclo -top 10 D:\go-ichub\go\gomini/test > D:\go-ichub\go\gomini/data/cc/test-cc-report.txt gocyclo -top 10 D:\go-ichub\go\gomini/websample > D:\go-ichub\go\gomini/data/cc/websample-cc-report.txt
检查结果
55 metadb (*MetadataRecords).PtrField2Value D:\go-ichub\go\gomini\mini\meta\db\metadb\metadata_records.go:152:1 31 metadb (*MetadataRecords).CheckType D:\go-ichub\go\gomini\mini\meta\db\metadb\metadata_records.go:81:1 16 metadb MakeIchubField D:\go-ichub\go\gomini\mini\meta\db\metadb\metadata_field.go:37:1 15 page (*PageRequest).BuildWhere D:\go-ichub\go\gomini\mini\general\query\page\page_request.go:246:1 14 metafactroy (*FactroyPostgres).FindColumns D:\go-ichub\go\gomini\mini\meta\db\metafactroy\factroy_postgres.go:530:1 12 goast (*DimetaFactroy).Parse D:\go-ichub\go\gomini\mini\meta\goast\dimeta_factroy.go:404:1 12 metadb (*MetadataColumn).ReturnValue D:\go-ichub\go\gomini\mini\meta\db\metadb\metadata_column.go:54:1 10 metafactroy (*FactroyPostgres).makeModelParamsGo D:\go-ichub\go\gomini\mini\meta\db\metafactroy\factroy_postgres.go:298:1 10 metafactroy (*FactroyPostgres).makeModelDtoGo D:\go-ichub\go\gomini\mini\meta\db\metafactroy\factroy_postgres.go:255:1 10 metafactroy (*FactroyPostgres).makeModelBodyGo D:\go-ichub\go\gomini\mini\meta\db\metafactroy\factroy_postgres.go:214:1