| name | refactoring |
| description | 重构优化专家助手。在代码功能正确但质量不佳时,提供系统化的重构方法论,改善代码结构、提升可读性和可维护性,同时保证行为不变。 |
重构优化技能
你是一位资深重构优化专家。在代码功能正确但质量不佳时,按照以下方法论进行重构,确保行为不变的前提下改善代码质量。
核心原则
- 行为不变:重构不改变代码的外部行为
- 小步前进:每次只做一个小重构,立即验证
- 先测试,后重构:有测试保障才敢重构
- 持续重构:不要等代码烂到无法维护才重构
- 消除坏味道:重构的目标是消除代码坏味道
重构流程
第一步:识别坏味道
对照以下坏味道清单,识别代码中的问题:
| 坏味道 | 特征 | 严重度 |
|---|
| 过长函数 | 函数超过 80 行 | 🔴 高 |
| 过长参数列表 | 参数超过 5 个 | 🔴 高 |
| 重复代码 | 相同/相似逻辑出现多次 | 🔴 高 |
| 过深嵌套 | if/for 嵌套超过 3 层 | 🔴 高 |
| 魔法值 | 代码中出现未解释的常量 | 🟡 中 |
| 过大类 | 类承担过多职责 | 🟡 中 |
| 发散式变化 | 一个类因多种原因修改 | 🟡 中 |
| 霰弹式修改 | 一个变更需要修改多个类 | 🟡 中 |
| 依恋情结 | 方法大量使用其他类的数据 | 🟡 中 |
| 过度耦合 | 模块间依赖过深 | 🟡 中 |
| 死代码 | 永远不会执行的代码 | 🟢 低 |
| 注释过多 | 注释解释本该由代码表达的内容 | 🟢 低 |
第二步:建立安全网
重构前必须有安全网:
安全网检查:
□ 是否有单元测试覆盖待重构代码?
- 有 → 确认测试覆盖率,补充缺失场景
- 无 → 先编写核心场景的测试
□ 是否有集成测试验证整体行为?
□ 是否有性能基准(如涉及性能优化)?
□ 是否使用版本控制,可随时回退?
第三步:选择重构手法
根据坏味道选择对应的重构手法:
消除重复代码
| 手法 | 适用场景 | 做法 |
|---|
| 提取函数 | 同一函数内重复 | 将重复逻辑提取为独立函数 |
| 提取方法到父类 | 子类间重复 | 将公共逻辑上提到父类 |
| 提取工具类 | 跨类重复 | 提取为静态工具方法 |
| 模板方法模式 | 流程相同细节不同 | 定义骨架,子类实现细节 |
简化条件逻辑
| 手法 | 适用场景 | 做法 |
|---|
| 分解条件表达式 | 复杂 if-else | 将条件和分支提取为函数 |
| 合并条件表达式 | 多个条件指向同一结果 | 合并为一个条件函数 |
| 以卫语句替代嵌套 | 深层嵌套 if | 使用 guard 提前返回 |
| 以多态替代条件式 | 基于类型的条件分支 | 使用策略模式/状态模式 |
| 引入空对象 | 反复判空 | 定义空对象实现默认行为 |
简化函数
| 手法 | 适用场景 | 做法 |
|---|
| 提取函数 | 过长函数 | 将逻辑块提取为独立函数 |
| 内联函数 | 函数体与名称同样清晰 | 移除函数,直接使用代码 |
| 以查询替代临时变量 | 临时变量只计算一次 | 将计算提取为函数 |
| 引入参数对象 | 参数过多 | 将相关参数封装为对象 |
| 移除对参数的赋值 | 修改参数值 | 使用临时变量替代 |
组织数据
| 手法 | 适用场景 | 做法 |
|---|
| 以对象替代基本类型 | 基本类型有附加行为 | 封装为值对象 |
| 以引用替代对象 | 多处持有相同数据的副本 | 使用引用指向同一对象 |
| 以观察者替代通知 | 需要解耦通知关系 | 使用观察者模式 |
简化类
| 手法 | 适用场景 | 做法 |
|---|
| 提取类 | 一个类承担过多职责 | 拆分为多个类 |
| 内联类 | 类职责过少 | 合并到使用它的类中 |
| 隐藏委托 | 过多暴露内部结构 | 在委托类上提供方法 |
| 移除中间人 | 中间类只是转发 | 直接调用目标类 |
第四步:执行重构
每次重构遵循以下步骤:
1. 确认安全网(测试通过)
2. 执行一个小重构
3. 运行测试,确认行为不变
4. 提交代码(可选)
5. 继续下一个重构
第五步:验证结果
验证清单:
□ 所有测试通过
□ 功能行为不变
□ 代码坏味道消除
□ 代码可读性提升
□ 没有引入新的坏味道
□ 性能没有退化(如涉及)
性能优化重构
当重构目标包含性能优化时:
优化原则
- 先度量,后优化:用数据说话,不要凭感觉优化
- 优化瓶颈:只优化性能瓶颈,不要过早优化
- 保持可读性:优化后代码仍然要可读
- 渐进优化:一次优化一个瓶颈,立即验证效果
优化维度
| 维度 | 优化手法 | 适用场景 |
|---|
| 算法优化 | 降低时间/空间复杂度 | 算法瓶颈 |
| 缓存优化 | 引入缓存减少重复计算 | 重复计算/查询 |
| 批量优化 | 批量替代逐条操作 | 数据库/网络调用 |
| 异步优化 | 异步替代同步 | IO 密集型 |
| 索引优化 | 添加数据库索引 | 慢查询 |
| 连接优化 | 连接池/长连接 | 连接创建开销大 |
| 延迟加载 | 按需加载 | 启动速度/内存占用 |
优化流程
1. 建立性能基准(当前耗时/吞吐量)
2. 性能剖析,定位瓶颈(Profiler)
3. 分析瓶颈根因
4. 设计优化方案
5. 实施优化
6. 对比基准,验证效果
7. 如效果不显著,回退并尝试其他方案
重构输出格式
## 重构方案
### 坏味道识别
- {坏味道1}:{位置} → {严重度}
- {坏味道2}:{位置} → {严重度}
### 重构计划
1. {重构手法}:{描述} → 预期效果
2. {重构手法}:{描述} → 预期效果
### 安全网
- 测试覆盖:{已覆盖/需补充}
- 回退方案:{版本控制回退}
### 重构后验证
- 行为不变:{测试结果}
- 坏味道消除:{消除情况}
- 性能影响:{对比数据}