重构优化专家助手技能,在代码功能正确但质量不佳时,提供系统化的重构方法论,改善代码结构、提升可读性和可维护性。涵盖12种代码坏味道识别清单、5步重构流程、多种重构手法对照表,以及性能优化重构的度量-定位-优化-验证流程。
重构优化技能:消除代码坏味道保持行为不变的实操指南
【适用场景】
Step 1:代码质量诊断与坏味道识别
当你接手一段功能正常但难以维护的代码时,使用坏味道识别清单系统诊断代码问题,确定重构的优先级和方向。Step 2:小步安全重构
当你需要进行代码重构但担心破坏现有功能时,按照"建立安全网→小步前进→立即验证"的流程,确保每一步重构都不改变代码行为。Step 3:消除重复代码
当你发现代码中存在重复逻辑(过长函数、重复代码片段),使用提取函数、提取工具类、模板方法模式等手法消除重复。Step 4:性能优化重构
当代码性能不满足要求时,按照"先度量、后优化"原则,定位瓶颈后使用缓存优化、批量优化、算法优化等手法进行性能重构。【操作步骤】
第一步:识别坏味道
使用坏味道清单识别代码问题:
| 坏味道 | 特征 | 严重度 |
|---|---|---|
| 过长函数 | 函数超过80行 | 🔴 高 |
| 过长参数列表 | 参数超过5个 | 🔴 高 |
| 重复代码 | 相同/相似逻辑出现多次 | 🔴 高 |
| 过深嵌套 | if/for嵌套超过3层 | 🔴 高 |
| 魔法值 | 未解释的常量 | 🟡 中 |
| 过大类 | 类承担过多职责 | 🟡 中 |
| 依恋情结 | 方法大量使用其他类的数据 | 🟡 中 |
| 过度耦合 | 模块间依赖过深 | 🟡 中 |
第二步:建立安全网
重构前必须有安全网: - 是否有单元测试覆盖待重构代码? - 是否有集成测试验证整体行为? - 是否使用版本控制,可随时回退?
第三步:选择重构手法
消除重复代码: - 提取函数:同一函数内重复逻辑 → 提取为独立函数 - 提取方法到父类:子类间重复 → 公共逻辑上提 - 提取工具类:跨类重复 → 提取为静态工具方法
简化条件逻辑: - 分解条件表达式:复杂if-else → 将条件提取为函数 - 以卫语句替代嵌套:深层嵌套 → guard提前返回 - 以多态替代条件式:基于类型的分支 → 策略/状态模式
简化函数: - 提取函数:过长函数 → 逻辑块提取为独立函数 - 以查询替代临时变量:临时变量只计算一次 → 提取为函数 - 引入参数对象:参数过多 → 相关参数封装为对象
第四步:执行重构
每次重构遵循:确认安全网→执行一个小重构→运行测试确认行为不变→继续下一个重构
第五步:验证结果
验证清单:所有测试通过、功能行为不变、坏味道消除、可读性提升、没有引入新坏味道
【代码模板】
坏味道识别检查表: ``` □ 是否有函数超过80行? □ 是否有超过5个参数的函数? □ 是否有相同/相似逻辑重复出现? □ 是否有if/for嵌套超过3层? □ 是否有未解释的魔法值? □ 是否有类承担过多职责? □ 是否有模块间过度耦合? ```
重构安全网检查: ``` □ 是否有单元测试覆盖待重构代码? - 有 → 确认测试覆盖率,补充缺失场景 - 无 → 先编写核心场景的测试 □ 是否有版本控制,可随时回退? ```
性能优化流程: ``` 1. 建立性能基准(当前耗时/吞吐量) 2. 性能剖析,定位瓶颈(Profiler) 3. 分析瓶颈根因 4. 设计优化方案 5. 实施优化 6. 对比基准,验证效果 ```
【复盘要点】
1. 行为不变是重构的铁律:重构是在不改变代码外部行为的前提下改善内部结构。任何重构如果没有测试保障或无法确认行为不变,都是危险的冒险。
2. 小步前进原则:每次只做一个小重构,立即验证,立即提交。大步重构看起来效率高,但一旦出错就难以定位,而小步重构每一步都可追溯。
3. 先度量后优化:性能问题往往是少数瓶颈导致的,在优化前必须先用Profiler等工具定位真正的瓶颈,避免优化错方向浪费精力。
来源:dkbnull/hello-skill (GitHub) | https://raw.githubusercontent.com/dkbnull/hello-skill/main/common/skills/refactoring/SKILL.md