重构最大的风险是「改了新的,坏了旧的」。 Claude Code 能帮你在重构前搭好安全网,在重构中识别风险,在重构后验证正确。
黄金原则:先搭安全网
在任何重构前,必须确保有测试覆盖。Claude Code 帮你快速补测试:
你:这个模块没有测试,我需要重构它但不能破坏现有行为。
先帮我写「特征测试」记录它当前的行为(不管对不对),
让我有信心做后续修改。
[粘贴目标模块代码]
Claude 会分析代码的实际执行路径,生成覆盖每个分支的「快照测试」。 这些测试记录的是现状而非理想状态——后续重构只要不破坏这些测试,就是安全的。
渐进式重构:不要一次大改
❌ 危险做法:
"帮我重构整个 src/services/ 目录,改成 Clean Architecture"
(一次改动几十个文件,测试全红,不知道哪里出问题)
✅ 安全做法:
第 1 轮:"分析 UserService,识别所有坏味道,不改代码"
第 2 轮:"只提取 validateEmail 方法,其他不动"
第 3 轮:"只把数据库调用迁移到 Repository,其他不动"
(每轮改动小,测试可以快速定位问题)
让 Claude 识别坏味道
你:分析 src/services/order.service.ts,识别所有代码坏味道,
按重构优先级排序(影响最大的先改),
对每个问题给出:名称、影响、重构方向
Claude:
1. God Object(上帝类)— OrderService 有 847 行
影响:任何改动都可能影响其他功能,测试难写
方向:拆分为 OrderCreationService / OrderPaymentService / OrderShippingService
2. Long Method — processOrder() 有 156 行
影响:逻辑混乱,难以理解和测试
方向:提取 validateOrder()、chargePayment()、updateInventory() 三个方法
3. Primitive Obsession — 用 string 表示订单状态
影响:类型不安全,容易传错值
方向:用枚举 OrderStatus 替代
4. Shotgun Surgery — 修改折扣逻辑需要改 5 个地方
影响:容易遗漏,导致不一致
方向:提取 DiscountCalculator 类集中处理
提取函数/方法标准流程
你:把 processOrder 方法中验证逻辑(第 15-45 行)提取为独立的 validateOrder 方法。
要求:
1. 提取前先确认这段代码的所有输入/输出/副作用
2. 新方法名清楚描述功能
3. 提取后 processOrder 的行为必须完全不变
4. 更新相关测试
Claude 的执行步骤:
Step 1: 分析第 15-45 行,识别:
- 输入:order 对象、userId 字段
- 输出:boolean(是否有效)
- 副作用:向 logger 写入验证失败日志
Step 2: 提取为 validateOrder(order, userId): boolean
Step 3: 在 processOrder 中用方法调用替换原代码
Step 4: 验证行为等价(通过现有特征测试)
依赖注入重构(让代码可测试)
遗留代码常见问题:直接实例化依赖,无法 Mock 测试:
你:OrderService 直接 new PaymentGateway() 和 new EmailService(),
导致测试必须真实调用支付接口和发邮件。
帮我重构为依赖注入,让测试可以传入 Mock 对象。
Claude:
// 重构前
class OrderService {
private payment = new PaymentGateway(); // 硬编码
private email = new EmailService(); // 硬编码
}
// 重构后
class OrderService {
constructor(
private payment: IPaymentGateway, // 接口,可注入
private email: IEmailService // 接口,可注入
) {}
}
// 测试中可以这样用
const service = new OrderService(
new MockPaymentGateway(),
new MockEmailService()
);
Repository 模式迁移
把散落各处的 SQL/ORM 调用集中到 Repository 层:
你:项目里数据库操作散落在 controllers、services、helper 各处,
维护困难。帮我规划迁移到 Repository 模式的步骤:
当前状况:约 200 处数据库调用分散在 30 个文件
目标:所有 DB 操作只在 repositories/ 目录中
Claude:
迁移路线图(12 步,每步可独立提交):
阶段 1:建立接口(不改现有代码)
Step 1: 创建 IUserRepository、IOrderRepository 接口
Step 2: 实现 SqlUserRepository(把现有 users 表的查询迁移进来)
Step 3: 注入到 UserService,保持接口不变
阶段 2:逐模块迁移
Step 4-8: 依次迁移 Order/Product/Payment/Inventory/Notification
每步都包括:迁移代码、更新测试、删除旧查询
阶段 3:清理
Step 9-12: 删除直接 DB 调用的残余代码,更新 CLAUDE.md 规范
重构进度追踪:CLAUDE.md 标记技术债
markdown
# CLAUDE.md
## 重构进行中(请勿绕过)
### 已完成
- [x] UserService 拆分为 UserCreationService + UserAuthService
### 进行中(本 Sprint)
- [ ] OrderService 提取 validateOrder 方法
- [ ] 数据库层迁移到 Repository 模式(进度:3/8 个模块)
### 待规划
- [ ] 引入 CQRS 分离读写模型
- [ ] PaymentService 重构(等 Q2 支付升级后一起做)
## 当前限制
重构期间,所有新功能必须遵循新架构(Repository 模式),
不允许新增直接 DB 查询代码。来源:Claude Code 官方文档 - docs.anthropic.com/en/docs/claude-code