第24章:重构

第24章:重构:从“重构等于重写”推进到“每一步结构改善且行为不变”,以目录节点、专属机制实验和故障复位验收。

学习目标

  • 能解释重构如何在保持外部行为不变的前提下改善代码结构,并指出可观察的接受条件。
  • 能为一次重构建立行为基线,只改变一个结构因素,比较正常值、恰好边界和故障输入。
  • 能依据首个偏离、测试结果和复位后的重放证据接受、拆分或回退一次重构。

为什么需要这一机制

第24章:重构 解决的不是一个可背诵口号,而是从 重构等于重写每一步结构改善且行为不变 的可观察变化。它的核心机制是:重构在外部可观察行为被测试冻结后,以小步可逆变换改善命名、数据、条件、子程序、类和接口结构。

学习 第24章:重构 时先预测 坏味道、行为基线、小步变换、测试确认、结构复盘 的输入与输出,再改变一个直接条件。最终结果即使看似正确,只要中间状态违反合同、故障不能隔离或重置不能回到同一基线,本页结论就不通过。

核心合同

behavior(before,input)=behavior(after,input)behavior(before,input)=behavior(after,input)

第24章:重构 的合同变量必须绑定到同一版本、同一输入、同一单位和同一观察窗口。先由合同推出预期,再观察 小步变换 与 结构复盘;如果只是修改阈值来迎合结果,实验失去裁决能力。

把可观察的结构问题记为 ,把重构前可重复的外部结果记为 。每次只做一个可回退的 ,再用 判定是否通过,最后以 收束证据。

目录节点到四级证据

以下节点逐项给出“出现—解释—视觉/实验—练习验证”证据。第24章:重构 不把目录词频当作覆盖率;每一项都必须能在专属机制链中指出状态变化,并在章末练习清单中被复核。

第24章 重构

第24章:重构 中,目录节点 第24章 重构 落在“坏味道”检查点。这里的技术含义是:以行为测试冻结外部合同,再做小步可逆结构变换;它影响“进化类型”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 第24章 重构 时,每一步前后重放同一输入并比较可观察结果。先写预期,再运行正常值、恰好边界和一个故障;若出现“没有行为基线便大范围改写,功能变化混入结构变化”,就在 第24章:重构 的 坏味道 保存首个偏离、拒绝结果和复位后的重放证据。

24.1 软件进化的类型

第24章:重构 中,目录节点 24.1 软件进化的类型 落在“行为基线”检查点。这里的技术含义是:用构造和公开操作守住对象不变量,优先组合稳定职责;它影响“重构理由”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 24.1 软件进化的类型 时,尝试绕过接口制造半有效对象,确认不变量不可被外部破坏。先写预期,再运行正常值、恰好边界和一个故障;若出现“没有行为基线便大范围改写,功能变化混入结构变化”,就在 第24章:重构 的 行为基线 保存首个偏离、拒绝结果和复位后的重放证据。

软件进化的哲学

第24章:重构 中,目录节点 软件进化的哲学 落在“小步变换”检查点。这里的技术含义是:把“软件进化的哲学”放回 重构在外部可观察行为被测试冻结后,以小步可逆变换改善命名、数据、条件、子程序、类和接口结构;它影响“数据语句子程序”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 软件进化的哲学 时,固定其余条件,只改变与“软件进化的哲学”直接相连的一个输入或决定。先写预期,再运行正常值、恰好边界和一个故障;若出现“没有行为基线便大范围改写,功能变化混入结构变化”,就在 第24章:重构 的 小步变换 保存首个偏离、拒绝结果和复位后的重放证据。

24.2 重构简介

第24章:重构 中,目录节点 24.2 重构简介 落在“测试确认”检查点。这里的技术含义是:以行为测试冻结外部合同,再做小步可逆结构变换;它影响“类系统”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 24.2 重构简介 时,每一步前后重放同一输入并比较可观察结果。先写预期,再运行正常值、恰好边界和一个故障;若出现“没有行为基线便大范围改写,功能变化混入结构变化”,就在 第24章:重构 的 测试确认 保存首个偏离、拒绝结果和复位后的重放证据。

重构的理由

第24章:重构 中,目录节点 重构的理由 落在“结构复盘”检查点。这里的技术含义是:以行为测试冻结外部合同,再做小步可逆结构变换;它影响“安全策略”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 重构的理由 时,每一步前后重放同一输入并比较可观察结果。先写预期,再运行正常值、恰好边界和一个故障;若出现“没有行为基线便大范围改写,功能变化混入结构变化”,就在 第24章:重构 的 结构复盘 保存首个偏离、拒绝结果和复位后的重放证据。

拒绝重构的理由

第24章:重构 中,目录节点 拒绝重构的理由 落在“坏味道”检查点。这里的技术含义是:以行为测试冻结外部合同,再做小步可逆结构变换;它影响“进化类型”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 拒绝重构的理由 时,每一步前后重放同一输入并比较可观察结果。先写预期,再运行正常值、恰好边界和一个故障;若出现“没有行为基线便大范围改写,功能变化混入结构变化”,就在 第24章:重构 的 坏味道 保存首个偏离、拒绝结果和复位后的重放证据。

24.3 特定的重构

第24章:重构 中,目录节点 24.3 特定的重构 落在“行为基线”检查点。这里的技术含义是:以行为测试冻结外部合同,再做小步可逆结构变换;它影响“重构理由”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 24.3 特定的重构 时,每一步前后重放同一输入并比较可观察结果。先写预期,再运行正常值、恰好边界和一个故障;若出现“没有行为基线便大范围改写,功能变化混入结构变化”,就在 第24章:重构 的 行为基线 保存首个偏离、拒绝结果和复位后的重放证据。

数据级的重构

第24章:重构 中,目录节点 数据级的重构 落在“小步变换”检查点。这里的技术含义是:以行为测试冻结外部合同,再做小步可逆结构变换;它影响“数据语句子程序”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 数据级的重构 时,每一步前后重放同一输入并比较可观察结果。先写预期,再运行正常值、恰好边界和一个故障;若出现“没有行为基线便大范围改写,功能变化混入结构变化”,就在 第24章:重构 的 小步变换 保存首个偏离、拒绝结果和复位后的重放证据。

语句级的重构

第24章:重构 中,目录节点 语句级的重构 落在“测试确认”检查点。这里的技术含义是:以行为测试冻结外部合同,再做小步可逆结构变换;它影响“类系统”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 语句级的重构 时,每一步前后重放同一输入并比较可观察结果。先写预期,再运行正常值、恰好边界和一个故障;若出现“没有行为基线便大范围改写,功能变化混入结构变化”,就在 第24章:重构 的 测试确认 保存首个偏离、拒绝结果和复位后的重放证据。

子程序级重构

第24章:重构 中,目录节点 子程序级重构 落在“结构复盘”检查点。这里的技术含义是:把单一职责、前置条件、后置条件和错误语义放在调用边界;它影响“安全策略”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 子程序级重构 时,给最小、最大和非法参数各运行一次,并检查返回与状态副作用。先写预期,再运行正常值、恰好边界和一个故障;若出现“没有行为基线便大范围改写,功能变化混入结构变化”,就在 第24章:重构 的 结构复盘 保存首个偏离、拒绝结果和复位后的重放证据。

类实现的重构

第24章:重构 中,目录节点 类实现的重构 落在“坏味道”检查点。这里的技术含义是:用构造和公开操作守住对象不变量,优先组合稳定职责;它影响“进化类型”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 类实现的重构 时,尝试绕过接口制造半有效对象,确认不变量不可被外部破坏。先写预期,再运行正常值、恰好边界和一个故障;若出现“没有行为基线便大范围改写,功能变化混入结构变化”,就在 第24章:重构 的 坏味道 保存首个偏离、拒绝结果和复位后的重放证据。

类接口的重构

第24章:重构 中,目录节点 类接口的重构 落在“行为基线”检查点。这里的技术含义是:用构造和公开操作守住对象不变量,优先组合稳定职责;它影响“重构理由”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 类接口的重构 时,尝试绕过接口制造半有效对象,确认不变量不可被外部破坏。先写预期,再运行正常值、恰好边界和一个故障;若出现“没有行为基线便大范围改写,功能变化混入结构变化”,就在 第24章:重构 的 行为基线 保存首个偏离、拒绝结果和复位后的重放证据。

系统级重构

第24章:重构 中,目录节点 系统级重构 落在“小步变换”检查点。这里的技术含义是:以行为测试冻结外部合同,再做小步可逆结构变换;它影响“数据语句子程序”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 系统级重构 时,每一步前后重放同一输入并比较可观察结果。先写预期,再运行正常值、恰好边界和一个故障;若出现“没有行为基线便大范围改写,功能变化混入结构变化”,就在 第24章:重构 的 小步变换 保存首个偏离、拒绝结果和复位后的重放证据。

24.4 安全的重构

第24章:重构 中,目录节点 24.4 安全的重构 落在“测试确认”检查点。这里的技术含义是:以行为测试冻结外部合同,再做小步可逆结构变换;它影响“类系统”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 24.4 安全的重构 时,每一步前后重放同一输入并比较可观察结果。先写预期,再运行正常值、恰好边界和一个故障;若出现“没有行为基线便大范围改写,功能变化混入结构变化”,就在 第24章:重构 的 测试确认 保存首个偏离、拒绝结果和复位后的重放证据。

不宜重构的情况

第24章:重构 中,目录节点 不宜重构的情况 落在“结构复盘”检查点。这里的技术含义是:以行为测试冻结外部合同,再做小步可逆结构变换;它影响“安全策略”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 不宜重构的情况 时,每一步前后重放同一输入并比较可观察结果。先写预期,再运行正常值、恰好边界和一个故障;若出现“没有行为基线便大范围改写,功能变化混入结构变化”,就在 第24章:重构 的 结构复盘 保存首个偏离、拒绝结果和复位后的重放证据。

24.5 重构策略

第24章:重构 中,目录节点 24.5 重构策略 落在“坏味道”检查点。这里的技术含义是:以行为测试冻结外部合同,再做小步可逆结构变换;它影响“进化类型”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 24.5 重构策略 时,每一步前后重放同一输入并比较可观察结果。先写预期,再运行正常值、恰好边界和一个故障;若出现“没有行为基线便大范围改写,功能变化混入结构变化”,就在 第24章:重构 的 坏味道 保存首个偏离、拒绝结果和复位后的重放证据。

推荐读物

第24章:重构 中,目录节点 推荐读物 落在“行为基线”检查点。这里的技术含义是:把“推荐读物”放回 重构在外部可观察行为被测试冻结后,以小步可逆变换改善命名、数据、条件、子程序、类和接口结构;它影响“重构理由”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 推荐读物 时,固定其余条件,只改变与“推荐读物”直接相连的一个输入或决定。先写预期,再运行正常值、恰好边界和一个故障;若出现“没有行为基线便大范围改写,功能变化混入结构变化”,就在 第24章:重构 的 行为基线 保存首个偏离、拒绝结果和复位后的重放证据。

关键点

第24章:重构 中,目录节点 关键点 落在“小步变换”检查点。这里的技术含义是:把本单元结论改写为带前提、反例和证据位置的决策规则;它影响“数据语句子程序”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 关键点 时,构造规则不适用的最小反例并说明退出条件。先写预期,再运行正常值、恰好边界和一个故障;若出现“没有行为基线便大范围改写,功能变化混入结构变化”,就在 第24章:重构 的 小步变换 保存首个偏离、拒绝结果和复位后的重放证据。

最小可重放实现

// 第24章:重构:同一输入验证基线、故障和复位
const baseline = run_cc2e_24_refactoring(fixedCase());
assertContract(baseline);
assertRejected(run_cc2e_24_refactoring(faultCase()));
assert.deepEqual(resetAndRun(fixedCase()), baseline);

这段 第24章:重构 验证草图表达独立教学合同,不复制原书代码。真实执行应保存输入、环境、节点轨迹、最终结果、拒绝理由和复位结果,使第二位读者能从干净状态重放。

专属因果实验

先预测改变“进化类型”或“重构理由”后,第24章:重构 的哪一个节点最先变化。切换基线、边界和注入故障,运行并保存证据;最后点击“重置实验”,确认滑块、场景、节点、压力和结果文字全部恢复。

第24章 · 五步重构证据链

结构改善必须和行为不变同时成立

切换一个场景,观察首个偏离落在哪个节点;最后用同一输入重放并决定接受或回退。

坏味道 → 行为基线 → 小步变换 → 测试确认 → 结构复盘重构改变结构,不改变同一输入下的外部可观察行为1坏味道可观察的改进理由第 1 步2行为基线冻结外部合同当前观察点3小步变换一次只动一个结构第 3 步4测试确认正常 / 边界 / 故障第 4 步5结构复盘接受或回退第 5 步基线:先记录输入、版本、环境和可观察输出,再开始重构。记录:输入 · 版本 · 首个偏离 · 行为输出 · 复位后的同一轨迹接受条件行为合同不变,结构更清晰,正常 / 边界 / 故障证据都可重放

基线:先记录输入、版本、环境和可观察输出,再开始重构。 没有行为基线,就无法证明结构变好而功能没有悄悄改变。

故障诊断与误区

术语与边界

第24章:重构 的五个操作术语是 坏味道、行为基线、小步变换、测试确认、结构复盘。每个术语都能指向实验中的节点或状态文本;若只能指向目录标题,说明解释和验证仍未完成。

名词解释

本章出现的专业名词,用大白话再讲一遍。

坏味道

足以提出结构改善理由、但不能单独证明可以修改的代码症状。

行为基线

由固定输入、版本和环境产生的可比较行为记录。

小步变换

保持合同不变、范围足够小且能单独验证的结构修改。

测试确认

用正常、边界和故障样本核对外部合同的验证动作。

结构复盘

比较结构收益、兼容性和回退成本的复盘决定。

本页小结

第24章:重构 的完成标准是能解释“重构在外部可观察行为被测试冻结后,以小步可逆变换改善命名、数据、条件、子程序、类和接口结构”,用核心合同推出预期,沿五个专属节点观察实际,诊断“没有行为基线便大范围改写,功能变化混入结构变化”,并证明复位后同一输入重建基线轨迹。

练习

问题 1:建立行为基线 一个计算折扣的子程序准备从嵌套条件改成提前返回。请写出必须固定的输入、状态和观察结果,并分别选择正常值、恰好边界和一个故障样本。

问题 2:定位首个偏离 重构数据结构后,正常样本通过但边界样本返回了不同结果。如何判断是数据级变换、语句级变换还是测试样本本身的问题?

问题 3:决定接受还是回退 一次重构让代码更短、正常用例通过,但故障路径的错误类型和接口兼容性发生变化。请给出结构复盘的结论及证据清单。

资料与边界

本章目录范围以公开中文试读目录Microsoft Press《Code Complete, 2nd Edition》页面核对;重构的接口不变量与小步修改边界,再参考C++ Core Guidelines。链接用于核对章节范围与工程边界,本章实验、示例、机制图和练习均为独立重写。

讨论

评论区加载中…