name: 重构 description: 重构代码以提高质量、减少技术债务和改善可维护性。用于清理任务和代码改进。
代码重构
在不改变行为的情况下提高代码质量。
何时使用
- 代码难以理解或修改
- 跨文件的重复逻辑
- 函数/类过大
- 减少技术债务
- 在添加新功能之前
重构过程
- 确保测试存在 - 在重构前添加测试
- 小步骤 - 进行增量更改
- 运行测试 - 每次更改后验证
- 频繁提交 - 保持更改可逆
常见重构方法
提取函数
// 之前
function processOrder(order) {
// 50行验证代码
// 30行计算代码
// 20行通知代码
}
// 之后
function processOrder(order) {
validateOrder(order);
const total = calculateTotal(order);
notifyCustomer(order, total);
}
用多态替换条件
// 之前
function getPrice(type) {
if (type === "regular") return basePrice;
if (type === "premium") return basePrice * 1.5;
if (type === "vip") return basePrice * 0.8;
}
// 之后
const pricingStrategies = {
regular: (base) => base,
premium: (base) => base * 1.5,
vip: (base) => base * 0.8,
};
const getPrice = (type) => pricingStrategies[type](basePrice);
移除重复
// 之前
function getUserName(user) {
return user?.profile?.name ?? "Unknown";
}
function getOrderName(order) {
return order?.customer?.name ?? "Unknown";
}
// 之后
const getName = (obj, path) => path.reduce((o, k) => o?.[k], obj) ?? "Unknown";
const getUserName = (user) => getName(user, ["profile", "name"]);
const getOrderName = (order) => getName(order, ["customer", "name"]);
代码味道
| 味道 | 症状 | 重构方法 |
|---|---|---|
| 长函数 | >20行 | 提取函数 |
| 大类 | >200行 | 提取类 |
| 重复代码 | 相同逻辑重复 | 提取和重用 |
| 长参数 | >3个参数 | 使用对象/构建器 |
| 特性嫉妒 | 使用其他类的数据 | 移动方法 |
| 原始痴迷 | 一切使用字符串 | 创建值对象 |
质量指标
- 圈复杂度 - 每个函数保持在10以下
- 嵌套深度 - 最多3层
- 函数长度 - 最好在20行以下
- 文件长度 - 最好在300行以下
安全检查表
- [ ] 测试存在并通过
- [ ] 无预期行为改变
- [ ] 更改是增量的
- [ ] 每一步都提交
- [ ] 请求代码审查
示例
输入: “这个函数太长了” 操作: 识别逻辑部分,提取为专注的函数,验证测试通过
输入: “减少这些文件中的重复” 操作: 找到常见模式,提取共享工具,更新调用点