关于 refactoring
面向开发者的 PHP 8.3+ 重构参考,涵盖重构技巧、代码异味及实用指导,帮助以小步验证的方式改善代码结构。
主要功能
- 0189 种重构技巧与代码异味
- 02PHP 8.3+ 示例及原理说明
- 03分步变更指南
- 04变更前后对照
- 05重构实践建议
适用场景
- 01选择方法或类的重构技巧
- 02代码审查时识别代码异味
- 03结合测试规划安全变更
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ krzysztofsurdy/ code-virtuoso --skill refactoring安装后在 Claude Code 中输入/refactoring确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/add-parameter.mdalternative-classes-with-different-interfaces.mdchange-bidirectional-association-to-unidirectional.mdchange-reference-to-value.mdchange-unidirectional-association-to-bidirectional.mdchange-value-to-reference.mdcollapse-hierarchy.mdcomments.mdconsolidate-conditional-expression.mdconsolidate-duplicate-conditional-fragments.mddata-class.mddata-clumps.mddead-code.mddecompose-conditional.mddivergent-change.mdduplicate-code.mdduplicate-observed-data.mdencapsulate-collection.mdencapsulate-field.mdextract-class.mdextract-interface.mdextract-method.mdextract-subclass.mdextract-superclass.mdextract-variable.mdfeature-envy.mdform-template-method.mdhide-delegate.mdhide-method.mdinappropriate-intimacy.md详细介绍
重构
一份全面的参考资料,涵盖 89 种重构技巧和代码异味——包含 PHP 8.3+ 示例、原理、分步操作说明以及前后对比。
重构技巧(67 种)
组合方法
- 提取方法 — 将代码片段提取到命名方法中 → 参考
- 内联方法 — 用方法体替换方法调用 → 参考
- 提取变量 — 通过说明性变量为复杂表达式赋予有意义的名称 → 参考
- 内联临时变量 — 用表达式替换临时变量 → 参考
- 以查询替换临时变量 — 用方法调用替换临时变量 → 参考
- 拆分临时变量 — 为不同用途分别赋值给不同变量 → 参考
- 移除对参数的赋值 — 引入局部变量,而非重新赋值给参数 → 参考
- 以方法对象替换方法 — 将复杂方法转换为独立的类 → 参考
- 替换算法 — 用更清晰的替代方案替换算法 → 参考
在对象之间移动特性
- 移动方法 — 将方法移至最依赖它的类中 → 参考
- 移动字段 — 将字段移至最依赖它的类中 → 参考
- 提取类 — 拆分职责过多的类 → 参考
- 内联类 — 合并职责过少的类 → 参考
- 隐藏委托关系 — 引入隐藏委托链的方法 → 参考
- 移除中间人 — 允许客户端直接调用委托对象 → 参考
- 引入外部方法 — 为无法修改的类添加缺少的方法 → 参考
- 引入本地扩展 — 为库类构建包装器或子类 → 参考
组织数据
- 自封装字段 — 即使在类内部,也通过 getter 访问字段 → 参考
- 以对象替换数据值 — 将原始数据提升为功能丰富的对象 → 参考
- 将值改为引用 — 将值对象转换为引用对象 → 参考
- 将引用改为值 — 将引用对象转换为值对象 → 参考
- 以对象替换数组 — 用合适的对象替换作为数据结构使用的数组 → 参考
- 复制被观察数据 — 通过 Observer 让领域数据与 UI 保持同步 → 参考
- 将单向关联改为双向关联 — 在需要时引入反向引用 → 参考
- 将双向关联改为单向关联 — 消除不必要的反向引用 → 参考
- 以符号常量替换魔法数字 — 为魔法数字指定有意义的名称 → 参考
- 封装字段 — 限制字段可见性,并提供访问器 → 参考
- 封装集合 — 提供集合的只读视图 → 参考
- 以类替换类型码 — 用枚举或类替换类型码 → 参考
- 以子类替换类型码 — 用类层次结构替换类型码 → 参考
- 以状态模式/策略模式替换类型码 — 用状态模式/策略模式替换会影响行为的类型码 → 参考
- 以字段替换子类 — 消除仅在常量上有所不同的子类 → 参考
简化条件表达式
- 分解条件表达式 — 将复杂条件表达式拆分为命名方法 → 参考
- 合并条件表达式 — 合并会产生相同结果的条件 → 参考
- 合并重复的条件代码片段 — 将相同代码移到条件表达式之外 → 参考
- 移除控制标志 — 用 break/return/continue 替换控制标志 → 参考
- 以卫语句替换嵌套条件表达式 — 使用提前返回简化嵌套条件表达式 → 参考
- 以多态替换条件表达式 — 用多态方法调用替换条件表达式 → 参考
- 引入空对象 — 用空对象替换空值检查 → 参考
- 引入断言 — 插入断言以记录假设 → 参考
简化方法调用
- 重命名方法 — 选择能体现方法用途的名称 → 参考
- 添加参数 — 引入新参数以支持更多数据 → 参考
- 移除参数 — 删除未使用的方法参数 → 参考
- 将查询与修改分离 — 拆分同时返回值并更改状态的方法 → 参考
- 参数化方法 — 通过添加参数统一相似的方法 → 参考
- 将参数替换为显式方法 — 为每个参数值创建单独的方法 → 参考
- 保留整个对象 — 传递整个对象,而非单独的值 → 参考
- 将参数替换为方法调用 — 在内部推导值,而不是传入值 → 参考
- 引入参数对象 — 将相关参数封装到一个对象中 → 参考
- 移除设置方法 — 删除仅在创建时赋值的字段对应的 setter → 参考
- 隐藏方法 — 缩小未使用的公共方法的可见范围 → 参考
- 将构造函数替换为工厂方法 — 使用工厂方法创建复杂对象 → 参考
- 将错误代码替换为异常 — 抛出异常,而不是返回错误代码 → 参考
- 将异常替换为测试 — 预先验证条件,而不是捕获异常 → 参考
处理泛化
- 上移字段 — 将相同的字段提升到超类中 → 参考
- 上移方法 — 将相同的方法提升到超类中 → 参考
- 上移构造函数体 — 将共享的构造函数逻辑提升到超类中 → 参考
- 下移方法 — 将方法移至使用它的子类中 → 参考
- 下移字段 — 将字段移至使用它的子类中 → 参考
- 提取子类 — 为一部分特性提取子类 → 参考
- 提取超类 — 将共享行为提取到父类中 → 参考
- 提取接口 — 为常见操作定义共享接口 → 参考
- 折叠层次结构 — 当超类和子类过于相似时将它们合并 → 参考
- 形成模板方法 — 将相似方法泛化为模板 → 参考
- 用委托替换继承 — 用组合替代继承 → 参考
- 用继承替换委托 — 用继承替代过度委托 → 参考
代码异味(22)
膨胀类
- 过长方法 — 方法变得过于冗长 → 参考
- 过大的类 — 试图处理太多事情的类 → 参考
- 基本类型偏执 — 过度使用基本类型,而不是小型对象 → 参考
- 过长参数列表 — 接受过多参数的方法 → 参考
- 数据泥团 — 反复一起出现的数据组 → 参考
面向对象滥用
- 接口不同的替代类 — 方法签名不匹配的相似类 → 参考
- 被拒绝的馈赠 — 忽视继承行为的子类 → 参考
- Switch 语句 — 本应使用多态的复杂 switch/match 结构 → 参考
- 临时字段 — 仅在特定条件下填充的字段 → 参考
变更阻碍者
可有可无项
- 注释 — 过多的注释掩盖了不清晰的代码 → 参考
- 重复代码 — 多处存在相同或几乎相同的代码 → 参考
- 数据类 — 只包含字段和 getter/setter 的类 → 参考
- 死代码 — 无法到达或未使用的代码 → 参考
- 惰性类 — 贡献过少、不值得存在的类 → 参考
- 推测性通用性 — 为了“以防万一”而构建的未使用抽象 → 参考
耦合项
- 依恋情结 — 相比自身数据,更依赖另一个类的数据的方法 → 参考
- 不恰当的亲密关系 — 彼此深入访问对方内部实现的类 → 参考
- 不完整的库类 — 未能提供所需功能的库类 → 参考
- 消息链 — 很长的方法调用链(a.b().c().d())→ 参考
- 中间人 — 只负责委托给另一个类的类 → 参考
最佳实践
- 以小步、经过验证的方式重构——每次变更后都运行测试
- 遵循童子军规则:让代码保持得比你发现时更好
- 条件允许时,使用 IDE 重构工具进行安全、自动化的转换
- 切勿同时重构并改变行为——将两者分开
- 优先处理能降低耦合并提高内聚的重构
- 优先处理最接近当前工作的代码异味
评论
支持 Markdown