Fable Simplify 是一个以“减少偶然复杂度,同时证明外部相关行为与契约未变”为目标的代码简化技能。它强调简化不是大范围重写的许可,而应通过小而可评审、带有刻画测试或不变量证据的变换,让代码更容易推理。
适用时机 当出现以下情况时可启用:重复逻辑带来分歧风险;嵌套或控制流复杂度遮蔽了不变量;死代码或过时间接层已被证明未被使用;明确要求进行不改变预期行为的重构;已完成实现需要在评审前做有边界清理。
不适用时机 当用户可见行为、API 或 schema 预期变更时(应使用 fable-tdd/fable-execute);行为未被充分刻画、无法保证保持时;架构本身正在重新设计时(应使用 fable-plan);清理机会与当前活动任务无关时。
简化分类与安全第一步 技能给出常见坏味道及安全首步:重复行为——证明等价后抽取共享规则;嵌套分支——识别决策表/不变量并逐步扁平化;死代码——证明运行时/注册/反射不可达;包装器/间接层——证明调用方与语义后再折叠;数据变换链——刻画代表性及边界输入;公共/内部 API 杂乱——保留公共契约并在边界后简化;生成代码噪音——修改生成器/源而非手工改输出。
七阶段协议
- 建立保持契约:声明不得改变的公共输入/输出/错误、副作用/状态转换、序列化/顺序/时序(若属契约)、包/API/CLI 兼容性、性能要求(若重要);捕获基线测试/夹具/运行时证据,覆盖不足时先补刻画测试。
- 具体识别要移除的复杂度:如重复条件、不必要分支、无用适配器、重复解析、所有权分裂、过时兼容路径,避免“现代化这个模块”这类无边界目标。
- 删除前证明可达性/死代码:搜索调用方及动态注册/插件/反射/生成路径,仅靠“grep 无导入”不足。
- 每次只做一步语义重构:抽取共享纯规则、用显式守卫/决策表替换嵌套分支、折叠契约相同的包装器、在可达性证明后移除死分支,每步后运行窄范围保持检查。
- 警惕意外契约变更:检查异常/错误类型/消息、迭代/顺序、真值/null 语义、急求值 vs 惰性求值、异步时序、事务/清理移动、公共导出/签名/默认值、性能/资源行为。
- 诚实衡量简化:可用证据包括更少的重复规则/分支、更小的公共面、更少状态/间接层、更清晰的不变量归属;行数本身不是质量指标。
- 重新验证与审查:最后一次重构变更后运行受影响的新鲜验证并独立审查 diff,重构前的绿色基线对简化后代码已过期。
决策规则与反模式 对行为丰富的遗留代码,无刻画/证明先补再重构;移除死代码需运行时可达性信心,含动态注册表/插件;若简化暴露期望的行为变更,拆分为独立的 TDD/执行任务;偏好少量可逆变换而非从零重写;抽象代表真实领域/所有权边界时即使增加行数也不折叠;两块相似代码编码不同未来不变量时避免 DRY;测试失败时判断是行为变更还是测试耦合内部结构,不要盲目回退或改断言。反模式包括:为“简化”而从零重写模块、以行数作为主要成功指标、因无静态导入就删代码、跨语义不同规则做 DRY 抽取、清理中改 API 签名、未核对契约就更新测试、功能后捆绑无关清理、用聪明泛型抽象替换显式领域逻辑。
简化记录包与完成标准 技能要求输出简化包:保持契约、基线证据、目标复杂度、可达性/死代码证据、变换、已检查的风险语义差异、新鲜验证、审查结果、衡量的简化、推迟的行为变更。完成标准为:复杂度减少具体且有边界;行为/公共契约已刻画并保持;删除/重构的可达性假设有依据;最终证据新鲜;独立审查未发现隐藏行为漂移;未夹带无关行为变更。
渐进资源 深度指南:references/behavior-preserving-refactor-strategy.md;现有模式:references/refactoring-patterns.md;示例:examples/flatten-nested-logic.md。该技能定位为重构与代码质量辅助,使用前需先有可运行的行为证据与明确的保持契约。