第24章:重构
第24章:重构:从“重构等于重写”推进到“每一步结构改善且行为不变”,以目录节点、专属机制实验和故障复位验收。
学习目标
- 能解释重构如何在保持外部行为不变的前提下改善代码结构,并指出可观察的接受条件。
- 能为一次重构建立行为基线,只改变一个结构因素,比较正常值、恰好边界和故障输入。
- 能依据首个偏离、测试结果和复位后的重放证据接受、拆分或回退一次重构。
为什么需要这一机制
第24章:重构 解决的不是一个可背诵口号,而是从 重构等于重写 到 每一步结构改善且行为不变 的可观察变化。它的核心机制是:重构在外部可观察行为被测试冻结后,以小步可逆变换改善命名、数据、条件、子程序、类和接口结构。
学习 第24章:重构 时先预测 坏味道、行为基线、小步变换、测试确认、结构复盘 的输入与输出,再改变一个直接条件。最终结果即使看似正确,只要中间状态违反合同、故障不能隔离或重置不能回到同一基线,本页结论就不通过。
核心合同
第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章 · 五步重构证据链
结构改善必须和行为不变同时成立
切换一个场景,观察首个偏离落在哪个节点;最后用同一输入重放并决定接受或回退。
基线:先记录输入、版本、环境和可观察输出,再开始重构。 没有行为基线,就无法证明结构变好而功能没有悄悄改变。
故障诊断与误区
术语与边界
第24章:重构 的五个操作术语是 坏味道、行为基线、小步变换、测试确认、结构复盘。每个术语都能指向实验中的节点或状态文本;若只能指向目录标题,说明解释和验证仍未完成。
名词解释
本章出现的专业名词,用大白话再讲一遍。
- 坏味道
足以提出结构改善理由、但不能单独证明可以修改的代码症状。
- 行为基线
由固定输入、版本和环境产生的可比较行为记录。
- 小步变换
保持合同不变、范围足够小且能单独验证的结构修改。
- 测试确认
用正常、边界和故障样本核对外部合同的验证动作。
- 结构复盘
比较结构收益、兼容性和回退成本的复盘决定。
本页小结
第24章:重构 的完成标准是能解释“重构在外部可观察行为被测试冻结后,以小步可逆变换改善命名、数据、条件、子程序、类和接口结构”,用核心合同推出预期,沿五个专属节点观察实际,诊断“没有行为基线便大范围改写,功能变化混入结构变化”,并证明复位后同一输入重建基线轨迹。
练习
问题 1:建立行为基线 一个计算折扣的子程序准备从嵌套条件改成提前返回。请写出必须固定的输入、状态和观察结果,并分别选择正常值、恰好边界和一个故障样本。
问题 2:定位首个偏离 重构数据结构后,正常样本通过但边界样本返回了不同结果。如何判断是数据级变换、语句级变换还是测试样本本身的问题?
问题 3:决定接受还是回退 一次重构让代码更短、正常用例通过,但故障路径的错误类型和接口兼容性发生变化。请给出结构复盘的结论及证据清单。
资料与边界
本章目录范围以公开中文试读目录和Microsoft Press《Code Complete, 2nd Edition》页面核对;重构的接口不变量与小步修改边界,再参考C++ Core Guidelines。链接用于核对章节范围与工程边界,本章实验、示例、机制图和练习均为独立重写。