一、重构初探:到底什么是重构?

说实话,我入行头三年,一直以为重构就是「把代码推倒重写」。直到有一次,我花了整整两周把一套支付系统重写了,结果上线当天就出了生产事故……嗯,从那以后我才真正搞明白,重构和重写,压根儿是两码事。

1.1 重构的定义

重构,说白了就是在不改变软件外部行为的前提下,改善内部结构。注意关键词——「不改变外部行为」。也就是说,你改完代码,功能必须和原来一模一样。用户感知不到任何变化,只有你(和你的同事)知道代码变干净了。

重构的核心公式:

外部行为不变 + 内部结构优化 = 重构

1.2 重构 vs 重写

我见过太多团队把这两个概念混为一谈。你想想看,如果每次觉得代码烂就重写,那跟「拆了房子重新盖」有什么区别?成本高、风险大、周期长。

维度 重构 重写
改动范围 小步迭代,每次改一点 推倒重来,一次性替换
风险等级 低,可随时回退 高,容易引入新bug
对业务的影响 零影响,用户无感知 可能中断服务
时间成本 持续投入,细水长流 集中投入,周期长
适用场景 代码结构差但逻辑正确 技术栈过时或架构彻底失效

我个人习惯是:能重构绝不重写。重写是最后的手段,就像医生不会轻易给病人换器官一样。

1.3 重构的收益与风险

收益这块,我直接说干货:

  • 可读性提升——代码像散文一样流畅,而不是像天书
  • 可维护性增强——改一个功能不用翻遍整个文件
  • 缺陷率下降——结构清晰了,bug自然藏不住
  • 团队效率提高——新成员上手更快,老成员改得更爽

但风险也不能忽视。我曾经在一个核心模块上直接重构,没写测试就上了……结果呢?改完发现三个隐藏bug,回滚花了两个小时。所以这里我要强调:

避坑指南:

  • 没有测试覆盖的代码,不要轻易重构
  • 一次只改一个点,改完就跑测试
  • 重构过程中,随时可以回退到上一个版本

1.4 一个简单的重构案例:提炼函数

光说不练假把式。咱们来看一个最基础的重构手法——提炼函数(Extract Function)

假设你接手了一段代码,功能是计算订单的折扣价。原代码长这样:

function calculatePrice(quantity, price, customerType) {
  let total = quantity * price;
  if (customerType === 'vip') {
    if (total > 1000) {
      total = total * 0.8;
    } else {
      total = total * 0.9;
    }
  } else {
    if (total > 500) {
      total = total * 0.95;
    }
  }
  return total;
}

这段代码有什么问题?逻辑混在一起。折扣规则、客户类型判断、金额计算全塞在一个函数里。你想想看,如果以后要加个「超级VIP」或者「节日折扣」,这个函数会膨胀成什么样?

重构之后:

function calculatePrice(quantity, price, customerType) {
  let total = quantity * price;
  return applyDiscount(total, customerType);
}

function applyDiscount(total, customerType) {
  if (customerType === 'vip') {
    return applyVipDiscount(total);
  }
  return applyNormalDiscount(total);
}

function applyVipDiscount(total) {
  return total > 1000 ? total * 0.8 : total * 0.9;
}

function applyNormalDiscount(total) {
  return total > 500 ? total * 0.95 : total;
}

看到了吗?每个函数只做一件事。名字就是它的说明书。以后要改VIP折扣规则,直接去 applyVipDiscount 里改,不会影响到普通客户的计算逻辑。

我的小技巧:提炼函数时,如果想不到一个好名字,说明这个函数可能不该被提炼出来。好名字 = 好职责。

1.5 本章知识体系

下面这张图,帮你把本章的核心脉络理清楚:

重构初探 什么是重构 不改变外部行为 改善内部结构 重构 vs 重写 小步迭代 vs 推倒重来 低风险 vs 高风险 收益与风险 可读性↑ 维护性↑ 需测试覆盖 提炼函数案例 一个函数只做一件事 好名字 = 好职责 核心原则 小步快跑,随时回退 测试先行 重构是持续改善代码的艺术

这张图把本章的核心知识点串起来了。你从中心开始,往四个方向看:定义、对比、收益风险、案例。最后落到底部——重构是持续改善代码的艺术,不是一次性的大工程。


好了,第一章就聊到这儿。记住一句话:重构不是炫技,是习惯。就像每天刷牙一样,代码也需要日常维护。下一章咱们会深入聊聊「什么时候不该重构」——嗯,你没听错,有些场景下,重构反而是错的。

公众号:蓝海资料掘金营,微信deep3321