关于 refactor-method-complexity-reduce
这项编码技能通过提取职责明确的辅助方法来简化方法,同时保留原有行为。它要求运行测试、确认失败数为零且编译无误,并检查认知复杂度阈值。
主要功能
- 01识别认知复杂度来源
- 02提取职责明确的辅助方法
- 03保留验证与错误处理行为
- 04要求验证测试和编译结果
- 05检查目标复杂度阈值
适用场景
- 01降低长方法的复杂度
- 02拆分重复或特定类型的逻辑
- 03重构后验证行为是否保持
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ github/ awesome-copilot --skill refactor-method-complexity-reduce安装后在 Claude Code 中输入/refactor-method-complexity-reduce确认已加载。
详细介绍
重构方法以降低认知复杂度
目标
重构方法 ${input:methodName},通过将逻辑提取到职责单一的辅助方法中,将其认知复杂度降低到 ${input:complexityThreshold} 或以下。
说明
-
分析当前方法,找出认知复杂度的来源:
- 嵌套条件语句
- 多个 if-else 或 switch 链
- 重复的代码块
- 多个带条件的循环
- 复杂的布尔表达式
-
识别可提取的机会:
- 可以提取到单独方法中的校验逻辑
- 重复出现的特定类型或特定分支处理
- 复杂的转换或计算
- 多次出现的常见模式
-
提取职责单一的辅助方法:
- 每个辅助方法应只有单一、清晰的职责
- 将校验逻辑提取到单独的
Validate*方法中 - 将特定类型的逻辑提取到处理程序方法中
- 为常见操作创建工具方法
- 使用合适的访问级别(static、private、async)
-
简化主方法:
- 减少嵌套深度
- 用更小的编排调用替换庞大的 if-else 链
- 在合适的地方使用 switch 语句以实现更清晰的分派
- 确保主方法读起来像高层流程
-
保留功能:
- 保持相同的输入/输出行为
- 保留所有校验和错误处理
- 保留异常类型和错误消息
- 确保所有参数都正确传递给辅助方法
-
最佳实践:
- 当辅助方法不需要实例状态时,将其设为 static
- 尽早使用空值检查和卫语句
- 避免创建不必要的局部变量
- 考虑使用元组返回多个值
- 将相关的辅助方法放在一起
实现方式
- 在重构主流程之前先提取辅助方法
- 增量测试以确保没有回归
- 使用有意义的名称来描述提取出的职责
- 将提取出的方法放在使用它们的附近
- 考虑将重复的代码模式改为泛型方法
结果
重构后的方法应:
- 认知复杂度降低到目标阈值
${input:complexityThreshold}或以下 - 更易读、更易维护
- 关注点清晰分离
- 更易测试和调试
- 保留所有原始功能
测试与验证
关键:完成重构后,你必须:
- 运行所有现有测试,这些测试与被重构的方法及其周边功能相关
- 强制要求:明确验证测试结果显示 "failed=0"
- 绝不要假设测试已通过 - 始终检查实际的测试输出
- 搜索包含通过/失败计数的摘要行(例如 "passed=X failed=Y")
- 如果摘要显示任何不是 "failed=0" 的数字,则测试已失败
- 如果测试输出在文件中,请读取整个文件以找到并验证失败计数
- 运行测试并不等同于验证测试通过
- 在你明确确认零失败之前,不要继续
- 如果有任何测试失败(failed > 0):
- 清楚说明有多少测试失败
- 分析每个失败以了解哪些功能被破坏
- 常见原因:空值处理、空集合检查、条件逻辑错误
- 在重构后的代码中找出根本原因
- 修正重构后的代码以恢复原始行为
- 重新运行测试并验证输出中的 "failed=0"
- 重复直到所有测试通过(failed=0)
- 验证编译 - 确保没有编译错误
- 检查认知复杂度 - 确认该指标等于或低于目标阈值
${input:complexityThreshold}
确认检查清单
- 代码编译无错误
- 测试结果明确显示 "failed=0"(已通过阅读输出验证)
- 所有测试失败均已分析并修正(如有发生)
- 认知复杂度处于或低于目标阈值
${input:complexityThreshold} - 所有原有功能均得到保留
- 代码遵循项目约定和标准
评论
支持 Markdown