Skip to main content

refactoring

重构优化专家助手。在代码功能正确但质量不佳时,提供系统化的重构方法论,改善代码结构、提升可读性和可维护性,同时保证行为不变。

Source facts

Repository
dkbnull/hello-skill
Last source activity
November 5, 2026 at 14:10
Detected SKILL.md language
Chinese
Stars
39
Forks
6

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

Showing SKILL.md

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