重构手法族
§1摘要与结论
在不改变可观察行为的前提下,按命名的小步手法持续改善代码内部结构的方法族;以代码坏味道为信号、以测试为安全网,把结构调整为可验证的小步而非大重写。
别名:重构、refactoring、重构目录 | 英文:Refactoring Catalog and Techniques | 类型:方法 / technique-catalog
§2局部关系图
§3原理 · 为什么
重构是对软件内部结构的修改,目的是使其更易理解、更易修改,而不改变其可观察行为——这是重构与重写、加功能的根本区别。重构把「改善设计」从一次性大动作拆解为可逐步验证的小步:每一步都不改变行为,因而可在测试保护下持续进行,使设计随需求演化而不失控,避免技术债持续累积。其前提是承认内部质量影响变更成本:结构一旦腐化,之后每次改动都更慢、更易出错,因此重构不是洁癖,而是对长期交付速度与可理解性的持续投资,也是控制软件熵与架构侵蚀的日常手段。把重构纳入日常开发节奏,比集中式大清理更安全、更可持续。重构与性能优化、功能新增需区分:前者不改变行为,后两者会改变可观察行为,混淆会破坏小步可验证的基本前提;它也不等同于格式化或注释整理,那些属表层整理,未必触及结构。重构能力也是团队技能,需要刻意练习与共同语言。
§4机制 · 如何运作
以代码坏味道为启发式信号(坏味道是深层问题的表层迹象,而非结论);按命名手法(Fowler 重构目录)逐一施加小步变换,每步后运行测试确认行为不变。重构与功能变更交替进行、可分时提交;遗留代码以「先补测试、再重构」处理,因为遗留代码即「没有测试的代码」,其判据在可变更性而非年代或技术栈。常见手法覆盖重命名、抽取/内联方法、搬移特性、以多态取代条件、封装字段等,目录化的命名使团队能用同一套词汇精确沟通结构改动,降低协作摩擦,并让重构过程可被审查与复现。坏味道与手法之间存在成对映射,掌握映射即可把「感觉不好」转化为具体的下一步动作。手法之间存在依赖与组合关系,通常由小到大逐步演进:先做安全的机械化重命名,再逐步抽取或搬移,使每一步都能独立验证并随时停下;目录本身可作教学与评审清单,帮助识别漏掉的结构问题。
§5工程 · 怎么落地
维持稳定的自动化测试作为安全网,最好覆盖所改路径;小步提交、频繁运行测试,使失败可快速定位;用坏味道目录与重构目录建立团队共同语言;机会性重构与预防性重构结合,避免「重构专用冲刺」式的大爆炸;对无测试遗留代码先用特征测试固定现状行为,再逐步重构,使每一步都有回归保护。编写新代码时可用测试驱动开发形成重构节律;评审时区分行为变更与结构变更,让重构改动与功能改动分开提交,便于审查与回滚。把重构与代码评审、结对编程结合,可在低成本下持续改善结构,防止债务无声累积。除了单元测试,类型系统、编译器与静态检查也是有效的安全网,可在重构中快速暴露不一致;对关键路径应分小步、频繁提交,使任何一步失败都能低成本回退;对无人理解的遗留模块,先加日志与特征测试建立观察点,再谈结构调整;重构前应确保工作区干净、变更可独立回退。
§6权衡卡
重构有成本且不直接交付功能:在交付压力下容易被无限推迟,长期积累为技术债、拖慢后续变更。
重构固有的回归风险要求测试保护,缺测试时贸然重构可能悄悄改变行为。
另一个隐性代价是重构改变了代码结构,可能使书签、文档与团队记忆失效,需要同步更新说明与培训;因此重构的时机与幅度应与团队熟悉度、测试覆盖和交付压力一起权衡,不能机械追求「随时重构」。
重构的力度也应与风险相称:低风险区可放手整理,核心区则宜小步慎行。
重构的价值最终应由变更成本的下降来验证,而非由代码行数或提交次数衡量。
反例:把「重构」当作加功能或大重写的借口(改变了可观察行为),或在无测试的遗留代码上大规模重排结构,都会放大缺陷与回归,与重构「不改变行为」的定义相悖。
第二个反例是只做机械美化(格式、改名)而不触及真正结构问题,收益有限;第三个反例是重构范围过大、一次提交过多,使审查与定位失败变得困难。
权衡原文仅按显式标记词归栏引用(收益 / 代价 / 反例),其余句子按原序列为「原文要点」;内容逐字引用未改写。
§7案例带
网申填写扩展逆向架构
对 Chrome MV3 网申自动填写扩展的逆向架构分析:梳理 popup、content、background、options 四模块职责,解剖 12 个站点适配器、双通道消息协议与隐私脱敏机制,并评估其零依赖零构建选型。
网申 v3 多模块解耦
一套面向高可扩展性的网申信息速查扩展架构:以 schema.js 为唯一数据驱动源,把数据模型、存储、纯函数与渲染组织为严格单向依赖的共享层,供 popup 与页面浮层双容器复用,并先立跨模块接口契约。
网申 v2 深度重构
一次由「改一处漏多处」症状触发的深度重构:定位到接口定义散落 12 个文件、存在 7 种接口形态的根因后,以单一契约源、dispatch 消息表与能力注册中心重建三层契约系统,恢复可审计与可校验性。
preset 通道耦合分析
对 harness「委派工具层→续用管理器→preset 服务→MCP 服务器」这条通道做耦合分析:识别契约、服务定位、数据契约、组合语义、路径与装配一致性六类耦合点,定位「静默丢弃特化」与「装配漂移」两处实质缝隙。
dsh-manager 插件深度分析
以「编译依赖、运行时注入、组合装配」三硬依据加源码行号,对第三方插件做依赖、功能、需求溯源与设计问题裁决,并复用上游 DAG 知识库节点标识,使分析结果可与主图互查。
Hermes 七层架构总览
对八千余文件的工业级 AI Agent 项目做七层架构总览逆向,揭示其「越用越聪明」的自进化闭环如何在层间传导的控制型架构案例。
Open Code Review 图谱
对阿里开源 AI 代码审查 CLI 做源码级解析并构建「知识 + 实践资产 + AI 索引」三合一知识图谱的工程案例。
§8信源与核验
核验结论:重构是对内部结构的修改,不改变可观察行为;加功能或重写会改变行为,二者须与重构分开进行 [BK-021]
核验结论:Feathers:遗留代码即「没有测试的代码」,判据在可变更性/可验证性而非年代或技术栈 [BK-022]
§9原始关系清单
展开:本节点的全部原始关系边(6 条,含边 ID 与方向)
| 关系 | 方向 | 对端节点 | 说明 |
|---|---|---|---|
| 组合 | → MTH-H-02 | 信息隐藏模块化分解 E-212 | 重构手法族用于达成信息隐藏分解边界 |
| 组合 | ← MTH-H-03 | 战略式编程与持续设计投入 E-752 | 持续设计以重构为日常改进手段 |
| 组合 | ← MTH-H-04 | 代码复审与可读性治理 E-753 | 评审发现的坏味道交由重构手法处理 |
| 跨体系对照 | ← MTH-L-01 | 行为保持重构 E-621 | 行为保持纪律与重构手法族分工互补 |
| 依据推导 | → ESS-H-02 | 内聚与耦合 E-206 | 重构以改善内聚耦合、降低变更成本 |
| 促成 | → MTH-H-02 | 信息隐藏模块化分解 E-214 | 重构手法使信息隐藏在既有代码上可逐步落地 |