SuperAPI AI 工具集

refactor

编程与开发

查看项目

更新于 10-15 13:28

技能介绍

用途

Refactor 是一套基于 Martin Fowler《重构(第 2 版)》目录的专家级代码重构技能。其核心目标是在不改变外部行为的前提下,改善代码的结构、可读性与可维护性。它强调“渐进式演进,而非革命”,即通过一系列微小、安全的变换来改进代码,而不是一次性大重写。

何时使用

该技能会在以下情况下激活:

  • 代码难以理解或维护
  • 函数或类变得过于庞大
  • 检测到代码坏味道
  • 由于结构不佳导致添加功能困难
  • 用户明确要求重构、清理或改进
  • 用户说出“refactor、重构、clean up、improve code、code smell、extract method、rename、simplify”等关键词

黄金规则

技能给出五条不可协商的规则,违反任何一条都会使重构变成鲁莽的编辑:

  1. 行为保持不变:只有代码的工作方式改变,其功能绝不改变。如果重构前存在测试,重构后必须通过。若引入了行为变化,那就不是重构,而是重写。
  2. 小步前进:每一步都应是能编译并通过测试的最小变换。若某一步出错,就能准确知道是哪一处改动导致的。
  3. 版本控制是朋友:开始前提交,每完成一个成功步骤后提交,从而获得无限次撤销能力。从干净状态拉分支,以便无后果地放弃重构。
  4. 测试必不可少:“没有测试,你不是在重构,只是在编辑。”如果目标代码没有测试,应先编写特征测试(characterization tests),用它们捕获当前行为以检测回归。
  5. 一次只做一件事:绝不把重构与功能修改混在一起,绝不同时重构两件无关的事,每次提交只包含一个重构操作。

不应重构的场景

技能以表格形式列出:代码能正常工作且不会再变——不动它;无测试的关键生产路径——先写特征测试;时间紧迫——记录坏味道,日后再重构;没有明确目的或收益——不要为重构而重构;代码从根本上就是错的——这是重写,不是重构。

重构决策评分表

在选择 Fowler 手法前,需记录一张决策卡,包含字段:主要坏味道(一个根因)、证据(位置、行为、调用方、变更历史或度量)、首要原则(最具体的适用原则)、相关原则(仅作解释性标签,不单独计数)、预期影响(变更扩散、认知负荷、重复知识、耦合、延迟失败或运行时成本的可观察减少)、最小重构(针对根因的最少侵入式 Fowler 手法)、基线/成功条件(如何验证行为保持与预期收益)。

技能还提供四类决策视角:

  • 职责与依赖:SOLID、SRP、OCP、DIP、关注点分离——判断变更理由是否混杂、高层策略是否依赖具体机制、关注点是否跨越边界泄漏。
  • 复用与结构:DRY、组合——判断是同一知识重复,还是仅仅语法相似;组合是否比继承更能局部化真实变化。
  • 简洁与范围:KISS、YAGNI——判断所提结构对今日问题是否更简单,每个抽象是否有现存变化或边界支撑。
  • 运行时与反馈:Fail Fast、Measure First——判断无效状态能否在不改变错误语义的前提下更靠近源头失败,什么基线能证明问题与结果。

技能说明:SOLID 是总称,当证据支持 SRP、OCP 或 DIP 时,应使用该具体视角而不另建 SOLID 问题;LSP 与 ISP 可标记为 SOLID/LSP 与 SOLID/ISP。DRY 指共享知识,而非所有相似代码。只有当继承产生真实耦合时才优先组合,而非默认优先。OCP 与 DIP 绝不能为违反 KISS 或 YAGNI 的推测性层次辩护。技能中的数字阈值(行数、参数数、方法数、嵌套深度)是依赖上下文的候选指标,须先确认存在职责混杂、认知成本、重复变更、知识重复或可测量的运行时影响再采取行动。

代码坏味道目录

基于 Fowler 分类法,技能要求在重构前先识别当前存在哪种坏味道,并给出各类坏味道的描述与首选重构手法:

  • 膨胀者(Bloaters):长方法(候选:方法超过 10-15 行)、大类、基本类型偏执、长参数列表(候选:超过 3-4 个参数)、数据泥团。
  • 面向对象滥用者(Object-Orientation Abusers):switch 语句、临时字段、被拒绝的遗赠、接口不同的替代类。
  • 变化阻止者(Change Preventers):发散式变化、霰弹式修改、平行继承体系。
  • 冗余物(Dispensables):注释(解释代码做什么而非为什么)、重复代码、懒类、数据类、死代码、推测性泛化。
  • 耦合者(Couplers):依恋情结、不恰当的亲密关系、消息链、中间人、不完整的库类。

重构技术目录

技能按类别收录 Fowler 目录中的重构手法,每种都包含机械步骤。

组合方法:Extract Method(提取方法,附前后 Java 代码示例)、Inline Method(内联方法)、Extract Variable(提取变量,附前后示例)、Inline Temp(内联临时变量)、Replace Temp with Query(以查询取代临时变量)、Split Temporary Variable(拆分临时变量)、Remove Assignments to Parameters(移除对参数的赋值)、Replace Method with Method Object(以方法对象取代方法)、Substitute Algorithm(替换算法)。

在对象间搬移特性:Move Method(移动方法)、Move Field(移动字段)、Extract Class(提取类)、Inline Class(内联类)、Hide Delegate(隐藏委托关系)、Remove Middle Man(移除中间人)、Introduce Foreign Method(引入外加函数)、Introduce Local Extension(引入本地扩展)。

组织数据:Self Encapsulate Field(自封装字段)、Replace Data Value with Object(以对象取代数据值,附前后示例)、Change Value to Reference(将值对象改为引用对象)、Change Reference to Value(将引用对象改为值对象)、Replace Array with Object(以对象取代数组)、Duplicate Observed Data(复制被监视数据,采用观察者模式)、Change Unidirectional Association to Bidirectional(将单向关联改为双向)、Change Bidirectional Association to Unidirectional(将双向关联改为单向)、Replace Magic Number with Symbolic Constant(以符号常量取代魔法数)、Encapsulate Field(封装字段)、Encapsulate Collection(封装集合)、Replace Type Code with Class(以类取代类型码)、Replace Type Code with Subclasses(以子类取代类型码)、Replace Type Code with State/Strategy(以状态/策略取代类型码)、Replace Subclass with Fields(以字段取代子类)。

简化条件表达式:Decompose Conditional(分解条件表达式,附前后示例)、Consolidate Conditional Expression(合并条件表达式)、Consolidate Duplicate Conditional Fragments(合并重复的条件片段)、Remove Control Flag(移除控制标记)、Replace Nested Conditional with Guard Clauses(以卫语句取代嵌套条件表达式,附“箭头代码”前后对比)、Replace Conditional with Polymorphism(以多态取代条件表达式)、Introduce Null Object(引入 Null 对象)、Introduce Assertion(引入断言)。

简化方法调用:Rename Method(重命名方法)、Add Parameter / Remove Parameter(添加/移除参数)、Separate Query from Modifier(将查询函数与修改函数分离)、Parameterize Method(令函数携带参数)、Replace Parameter with Explicit Methods(以明确函数取代参数)、Preserve Whole Object(保持对象完整)、Replace Parameter with Method(以函数取代参数,注明参考 refactoring.guru 的 Replace Parameter with Method Call)。

限制

资料未提供该技能的具体实现语言、运行时依赖、安装命令、支持平台与授权信息,这些内容暂未提供。技能中的行数、参数数等数字阈值仅为依赖上下文的候选指标,不构成硬性判定标准。