目录
重构的核心是什么?
从最基本的角度看,重构是改进代码的一种系统化方法。它的核心思想是:在不改变代码外部行为(即功能)的情况下,改进代码的内部结构、 readability(可读性)、 maintainability(可维护性)和 extensibility(可扩展性)。简单来说,重构就是"让代码更好看、更易用,但功能不变"。
通俗来说,想象你有一栋老房子,外观和功能都还行(代码能正常运行),但内部布局混乱、线路老化、房间浪费空间(代码结构复杂、重复、难以维护)。重构就像是请设计师重新规划内部结构,优化空间、更新设施,但房子外面的门窗和功能(用户能看到的成果)还是原来的样子。
重构的定义
重构(Refactoring)是指对现有代码进行结构调整和优化的过程,其目标是:
-
提高代码质量:让代码更干净、更简洁、更易于理解。
-
减少技术债务:避免代码随着时间推移变得越来越难以维护。
-
便于未来扩展:让代码更容易添加新功能或修改现有功能。
重构的过程
重构不是随意改代码,而是一个有步骤、有原则的过程。以下是典型的重构步骤:
-
确保有测试:
在重构前,确保现有功能有足够的自动化测试(比如单元测试)。测试可以帮助你确认重构后功能没有变。
-
小步前进:
不要一次性大改代码。每次只做一个小改动,比如提取一个方法、简化一个条件语句,然后运行测试确保一切正常。
-
识别坏味道:
寻找代码中的问题,比如:
-
过多的条件语句(if-else 嵌套太深)。
-
重复代码(Copy-Paste)。
-
类职责太杂(一个类做了太多不相关的事)。
-
方法太长(超过 10-15 行)。
-
-
应用重构技巧:
有很多标准的重构模式,比如:
-
简化条件表达式(Simplify Conditional Expressions):减少 if-else 的嵌套。
-
移动函数或字段(Move Method/Field):把代码放到更合适的地方。
-
重命名(Rename):给变量、方法、类取更清晰的名字。
-
内联代码(Inline Code):如果一个方法太简单,直接合并到调用处。
-
提取方法(Extract Method):把一段代码抽取成独立的方法。
-
-
验证功能:
每次重构后,运行所有测试,确保功能没有变化。如果发现问题,立刻回滚。
重构的例子(C#)
假设你有以下一段 C# 代码,逻辑是计算折扣,但代码冗长且重复:
cs
public class Order
{
public double CalculateDiscount(double price)
{
double discount = 0;
if (price > 100)
{
discount = price * 0.1; // 10% 折扣
if (price > 500)
{
discount = price * 0.2; // 20% 折扣
}
}
return discount;
}
}
问题:
-
逻辑分散在多个 if 语句中,不易维护。
-
如果折扣规则变化(比如新增 30% 折扣),代码需要大改。
重构后:
cs
public class Order
{
private const double DiscountThreshold1 = 100;
private const double DiscountThreshold2 = 500;
private const double DiscountRate1 = 0.1; // 10%
private const double DiscountRate2 = 0.2; // 20%
public double CalculateDiscount(double price)
{
if (price <= DiscountThreshold1)
return 0;
if (price <= DiscountThreshold2)
return price * DiscountRate1;
return price * DiscountRate2;
}
}
改进:
-
提取了常量(DiscountThreshold1、DiscountRate1 等),便于修改规则。
-
简化了条件逻辑,代码更清晰。
-
功能不变,但可读性和可维护性提高了。