mcpField
C
cyclomatic-complexity

cyclomatic-complexity

github.com/saurabhkumar8112开发40886 次安装9 周前更新
代码仓库

关于 cyclomatic-complexity

cyclomatic-complexity 是用于测量和降低代码圈复杂度的技能,面向编写或维护代码的 Agent。它提供阈值、重构方法及前后测量流程,并强调保持行为和公共 API 不变。

主要功能

  1. 01测量并排序函数复杂度
  2. 02按项目配置或默认阈值评估
  3. 03提供分支与嵌套重构策略
  4. 04要求重构前后运行测试
  5. 05输出复杂度前后对比报告

适用场景

  1. 01定位复杂度过高的函数
  2. 02重构新增分支较多的代码
  3. 03审查 AI 编写代码的可维护性
  4. 04验证重构前后的行为与指标

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/saurabhkumar8112/cyclomatic-complexity-skill --skill cyclomatic-complexity

安装后在 Claude Code 中输入/cyclomatic-complexity确认已加载。

详细介绍

圈复杂度

目的:AI 编写的代码往往能正常工作,但分支却像丛林一样复杂。本技能用于衡量复杂度、重构热点,让代码保持易于人工维护。

先衡量

CC = 决策点 + 1。决策点包括:if、else if、case、循环、catch、三元表达式,以及条件中的 &&、||。

以项目的 linter 配置为准。如果 eslintrc、radon 配置、sonar 配置或类似配置设置了复杂度阈值,就使用该阈值。没有配置时,使用以下默认值。

阈值:

  • 1-5:正常,保持不动
  • 6-10:留意;如果本来就要修改,可考虑重构
  • 11-15:立即重构
  • 15 以上:必须拆分,不容争议

环境允许时,优先使用实际工具,而不是凭目测判断:

  • Python:radon cc -s -a <path>
  • JS/TS:eslint complexity 规则
  • Go:gocyclo
  • 多语言项目:lizard <path>

没有可用工具时,按函数手动计数,并显示计数结果。

重构策略,按优先顺序排列

  1. 卫语句。 反转条件,提前返回,消除嵌套。
  2. 提取函数。 为提取出的每段代码起一个说明做什么、而非怎么做的名字。名称就是文档。
  3. 使用查找表 / 映射代替 if-else 或 switch 链。
  4. 命名谓词。 if (isEligibleForRefund(order)) 胜过包含 4 个子句的布尔表达式。
  5. 对按类型切换的逻辑使用多态 / 策略模式。仅当该 switch 出现在 2 个或更多位置时使用。
  6. 扁平化循环。 提取循环体,并使用 continue 代替嵌套 if。

硬性规则

  • 保持行为不变。修改前后都运行测试。没有测试时,应说明并建议添加测试,谨慎重构。
  • 不要钻指标空子。用一行密集代码隐藏 6 个分支,比原本直白的 if 链更糟。复杂度应转移到名称清晰的单元中,而不是靠技巧将其隐藏。
  • 未经询问,不要破坏公共 API 或导出签名。
  • 函数少而职责清晰、命名明确,胜过用注释解释各个部分。
  • 每个函数只负责一项职责。如果名称里需要用“和”,就拆分。

工作流

  1. 衡量所有涉及的函数,按 CC 从高到低排序。
  2. 动手前,报告复杂度最高的热点及其数值。
  3. 从最复杂的函数开始,一次重构一个函数。
  4. 重新衡量。展示修改前后的表格:函数、修改前 CC、修改后 CC。
  5. 验证:测试通过、行为未变、差异易于审查。

输出格式

每次重构结束时都附上:

## Complexity report
| Function | Before | After |
|----------|--------|-------|
| parseOrder | 14 | 4 |

Extracted: validateHeader, resolveDiscount
Behavior verified: <how>

尽量精简说明。用数字和差异说话。

评论

支持 Markdown