# 重构计划模板

使用这个模板来记录和跟踪你的重构工作。

---

## 项目信息

| 字段 | 值 |
|-------|-------|
| **项目 / 模块** | [项目名称] |
| **目标文件** | [要重构的文件列表] |
| **创建日期** | [日期] |
| **作者** | [姓名] |
| **状态** | Draft / In Review / Approved / In Progress / Completed |

---

## 执行摘要

### 目标
- [ ] [主要目标：例如，提升支付流程可读性]
- [ ] [次要目标：例如，减少重复代码]
- [ ] [第三目标：例如，提升可测试性]

### 约束
- [ ] [约束 1：例如，不能改公共 API]
- [ ] [约束 2：例如，必须保持向后兼容]
- [ ] [约束 3：例如，不能改数据库 schema]

### 风险等级
- [ ] Low - 小改动，测试充分
- [ ] Medium - 中等改动，有一定风险
- [ ] High - 大改动，需要特别注意

---

## 重构前检查清单

### 测试覆盖评估

| 指标 | 当前值 | 目标值 | 状态 |
|--------|---------|---------|--------|
| 单元测试覆盖率 | __% | ≥80% | |
| 集成测试 | Yes/No | Yes | |
| 所有测试通过 | Yes/No | Yes | |

### 开始前必须满足
- [ ] 所有测试通过
- [ ] 已读懂并审查代码
- [ ] 已有备份 / 版本控制
- [ ] 已获得用户批准

---

## 已识别的代码异味

### 摘要

| # | 异味 | 位置 | 严重性 | 优先级 |
|---|-------|------|------|------|
| 1 | [例如，Long Method] | [file:line] | High | P1 |
| 2 | [例如，Duplicate Code] | [file:line] | Medium | P2 |
| 3 | [例如，Feature Envy] | [file:line] | Low | P3 |

### 详细分析

#### 异味 #1：[名称]

**位置**：`path/to/file.js:45-120`

**描述**：[对问题的详细描述]

**影响**：
- [影响 1]
- [影响 2]

**建议方案**：[如何修复的简要说明]

---

## 重构阶段

### 阶段 A：快速收益（低风险）

**目标**：快速、低风险的改进，立刻产生价值

**预计改动**：[X 个文件，Y 个方法]

**需要用户批准**：Yes / No

| # | 任务 | 文件 | 重构手法 | 状态 |
|---|------|------|----------|------|
| A1 | 将变量 `x` 重命名为 `userCount` | utils.js:15 | Rename Variable | [ ] |
| A2 | 删除未使用的 `oldHandler()` | api.js:89 | Remove Dead Code | [ ] |
| A3 | 提取重复的验证逻辑 | form.js:23,67 | Extract Method | [ ] |

**回滚方案**：回退 A1-A3 的提交

---

### 阶段 B：结构优化（中风险）

**目标**：改善代码组织和清晰度

**预计改动**：[X 个文件，Y 个方法]

**需要用户批准**：Yes

**依赖**：必须先完成阶段 A

| # | 任务 | 文件 | 重构手法 | 状态 |
|---|------|------|----------|------|
| B1 | 从长函数中提取 `calculatePrice()` | order.js:45 | Extract Method | [ ] |
| B2 | 引入 `OrderDetails` 参数对象 | order.js:12 | Introduce Parameter Object | [ ] |
| B3 | 将 `formatAddress()` 移动到 Address 类 | customer.js:78 | Move Method | [ ] |

**回滚方案**：回滚到阶段 A 完成后的提交

---

### 阶段 C：架构改动（高风险）

**目标**：处理更深层的结构问题

**预计改动**：[X 个文件，Y 个方法]

**需要用户批准**：Yes

**依赖**：必须先完成阶段 A 和 B

| # | 任务 | 文件 | 重构手法 | 状态 |
|---|------|------|----------|------|
| C1 | 用多态替换价格 switch | pricing.js:30 | Replace Conditional with Polymorphism | [ ] |
| C2 | 提取 `NotificationService` 类 | user.js:100 | Extract Class | [ ] |

**回滚方案**：回滚到阶段 B 完成后的提交

---

## 详细重构步骤

### 任务 [ID]：[任务名称]

**对应异味**：[异味名称]

**重构手法**：[手法名称]

**风险等级**：Low / Medium / High

#### 上下文

**重构前**（当前状态）：
```javascript
// 把当前代码贴在这里
```

**重构后**（期望状态）：
```javascript
// 把期望代码贴在这里
```

#### 逐步操作

1. [ ] **步骤 1**：[描述]
   - 测试：完成此步后运行测试
   - 预期：所有测试通过

2. [ ] **步骤 2**：[描述]
   - 测试：完成此步后运行测试
   - 预期：所有测试通过

3. [ ] **步骤 3**：[描述]
   - 测试：完成此步后运行测试
   - 预期：所有测试通过

#### 验证

- [ ] 所有测试通过
- [ ] 行为未改变
- [ ] 代码可编译
- [ ] 没有新的警告

#### 提交信息
```
refactor: [描述这次重构]
```

---

## 进度跟踪

### 阶段状态

| 阶段 | 状态 | 开始时间 | 完成时间 | 测试是否通过 |
|------|------|----------|----------|--------------|
| A | Not Started / In Progress / Done | | | |
| B | Not Started / In Progress / Done | | | |
| C | Not Started / In Progress / Done | | | |

### 遇到的问题

| # | 问题 | 解决方案 | 状态 |
|---|------|----------|------|
| 1 | [描述] | [如何解决] | Open / Resolved |

---

## 指标对比

### 重构前

| 指标 | 文件 1 | 文件 2 | 总计 |
|------|------|------|------|
| 代码行数 | | | |
| 圈复杂度 | | | |
| 可维护性指标 | | | |
| 方法数量 | | | |
| 平均方法长度 | | | |

### 重构后

| 指标 | 文件 1 | 文件 2 | 总计 | 变化 |
|------|------|------|------|------|
| 代码行数 | | | | |
| 圈复杂度 | | | | |
| 可维护性指标 | | | | |
| 方法数量 | | | | |
| 平均方法长度 | | | | |

---

## 重构后检查清单

- [ ] 所有测试通过
- [ ] 没有新的警告或错误
- [ ] 代码成功编译
- [ ] 已完成手工验证
- [ ] 文档已更新（如需要）
- [ ] 已完成代码审查
- [ ] 指标有改善
- [ ] 已获得用户签字确认

---

## 经验总结

### 做得好的地方
- [Item 1]
- [Item 2]

### 可以改进的地方
- [Item 1]
- [Item 2]

### 未来建议
- [Item 1]
- [Item 2]

---

## 批准

| 角色 | 姓名 | 日期 | 签名 |
|------|------|------|------|
| Plan Author | | | |
| Technical Lead | | | |
| Product Owner | | | |

---

## 附录

### A. 相关文档
- [相关文档链接]

### B. 参考资料
- [代码异味目录]
- [重构目录]

### C. 使用的工具
- [测试框架]
- [Lint 工具]
- [复杂度分析工具]
