重构与代码质量
Refactoring and Code Quality
📖这门课到底讲什么
重构与代码质量关注代码长期可维护性:以坏味道(重复代码、过长函数、过大类、长参数列表、发散式变化、霰弹式修改、依恋情结、数据泥团、switch 语句、临时字段、异曲同工的类等)为切入点,讲授重构手法(提炼函数与变量、内联、搬移特性、重新组织数据、简化条件表达式、简化函数调用、处理概括关系)与安全重构的前提(测试先行、小步快跑、频繁提交),并覆盖代码规范与风格(命名、注释、函数长度、圈复杂度)、代码评审实践、静态分析与度量工具、技术债务管理。学完你应能在不改变外部行为的前提下持续改进既有代码,写出可读可测可演进的代码,并把质量要求落到团队流程中。
🎯为什么必须学好
面试中会考察代码可读性与重构能力:给你一段烂代码让你指出问题并现场改写,或问你如何保证长周期项目的代码质量;入职后维护祖传代码的能力直接决定你的产出速度。掌握重构的人能在需求变更时不推倒重写,而是小步演进,这是团队最需要的能力。它也是代码评审、结对编程、测试驱动开发等实践的技术前提,读研做工程型项目同样受益。
📌核心知识清单
- 代码坏味道识别:重复代码、过长函数与过大类、长参数列表、发散式变化与霰弹式修改、依恋情结与数据泥团、基本类型偏执、switch 语句、平行继承体系
- 重构基础:重构的定义与不改变可观察行为的前提、何时重构与何时不该重构(重写与重构的取舍)、测试驱动的安全重构循环
- 函数级重构:提炼函数与内联函数、以查询取代临时变量、引入参数对象与保持对象完整、以命令取代函数、分解条件表达式与合并条件
- 类与结构重构:搬移函数与字段、提炼类与内联类、隐藏委托与移除中间人、以委托取代继承与以继承取代委托、提炼超类与下移方法
- 数据重构:以对象取代数据值、以对象取代数组、复制被监视数据、将引用对象改为值对象、封装字段与集合、以多态取代条件表达式
- 简化条件与调用:卫语句取代嵌套条件、以多态取代 switch、以工厂函数取代构造函数、参数对象与移除标记参数、以异常取代错误码
- 代码质量与规范:命名与注释原则、函数与类的规模度量、圈复杂度与认知复杂度、静态分析工具(SonarQube、ESLint、Checkstyle、SpotBugs)与格式化统一
- 质量保障流程:代码评审清单与礼貌文化、持续重构与技术债记账、自动化测试与回归保障、质量门禁与 CI 集成、重构与性能优化的关系
✍️怎么学(可执行步骤)
- 主线精读《重构:改善既有代码的设计》(第2版)第1至6章并完成第1章的示例重构练习,第6至12章的手法按需查阅练习
- 选一个自己的旧项目(大一时写的代码最佳)做重构实战:先补测试再重构,记录每次重构前后代码行数、圈复杂度与测试通过情况
- 用工具量化质量:接入 ESLint 或 SonarQube,查看坏味道与复杂度报告,逐个修复高危问题并对比报告分数变化
- 读《代码大全》第2至7章关于变量、语句与控制结构的建议,逐条对照自己的代码做一次自查清单并修正
📚推荐教材与书籍
重构领域唯一必读书,第1章示例与第6至12章手法目录需反复使用,宜作为案头书
软件构建百科全书,变量命名、控制结构与代码改进章节非常实用,适合长期翻阅
讲命名、函数、注释与格式的具体规范,配合案例前后对比,容易上手
专讲在缺少测试的遗留系统中如何安全修改代码,接手烂项目时极有价值
🎬视频课程 / 公开课
国内高校或企业讲师课程,聚焦坏味道识别与重构手法实操
选择带真实项目演示的课程,跟着同一段代码逐步重构并观察测试是否保持通过
🌐网站与文档
中文坏味道与对应重构手法对照表,实战中最实用的速查工具
工业级静态检查规则说明,理解每条规则背后的质量风险
Google 的代码评审标准与实践,学习评审该怎么写、怎么给意见
🐙GitHub 开源资料
重构的目标常是更清晰的结构,此仓库提供可参考的成熟结构范式
代码评审与提交规范,团队落地质量流程时可直接借鉴
代码格式化工具,用工具消灭风格争论,让评审聚焦逻辑而非空格
🧪动手实践任务
实践 1
选取一个不少于三百行的旧模块,先补齐单元测试达到八成覆盖,再执行至少十次小步重构(提炼函数、消除重复、以多态取代 switch),每次提交后测试全绿
实践 2
建立代码坏味道清单并审计一个项目:逐条标注问题位置与严重程度,输出整改优先级表与预估工作量
实践 3
为自己的项目接入静态分析并让质量门禁在 CI 生效:圈复杂度或重复率超标即失败,记录整改过程与指标变化
实践 4
完成一次性能相关的重构:先用性能分析工具定位热点,再在保持测试通过的前提下优化算法与数据结构,对比优化前后耗时
🧾考试与面试
💼 面试会怎么考
常见:给你一段烂代码让你现场指出三到五个问题并改写;什么是坏味道、如何识别;重构与重写的区别与选择;如何在没有测试的情况下安全重构;你如何保证代码可读性(命名、函数长度、注释);代码评审时你会关注什么;技术债如何管理、什么时候应该偿还;重构会影响性能吗、如何处理。面试中常要求在纸上或共享编辑器里现场改代码。
📝 期末与考研怎么过
考核多为大作业与项目实践:提交重构前后的代码与说明文档、给出质量指标对比、附测试用例。若为笔试,题型是代码坏味道识别与改写、重构手法名称与适用场景、代码评审意见撰写。备考方式是把常见坏味道与对应手法做成对照表并练手改写。目标八十五分以上,实操表现与文档质量是得分关键。
⚠️ 常见坑
- 把重构当作推倒重写,一次改动几百行且无测试保护,引入大量回归缺陷
- 重构与需求开发混在同一次提交里,出问题时无法回滚,评审也看不出意图
- 只改格式不改结构,重复与耦合依旧,质量指标没有改善
- 追求极端短函数与统一风格,把代码切碎到难以阅读,忽略可读性才是最终目标
- 不做度量与记录,无法说明重构带来的收益,也难以说服团队投入