用 Cursor + Claude API 实现遗留代码自动重构:从单体到模块化
接手一个没有单元测试、没有文档、超过 5000 行的单体文件,几乎是每个开发者的噩梦。手动拆分不仅耗时,还极易引入新 Bug。本文将演示如何用 Cursor Agent 和 Claude API 自动化完成这一过程——AI 分析代码结构、生成拆分方案、执行重构、运行测试并自我修复。全程无需手工编写复杂脚本,你只需提供自然语言指令。

一、为什么自动化重构是刚需
| 传统方式 | 问题 | AI 辅助方式 |
|---|---|---|
| 人工阅读代码理解逻辑 | 耗时数天,容易遗漏 | AI 秒级扫描,生成模块依赖图 |
| 手动拆分文件 | 容易产生循环导入、命名冲突 | AI 自动调整 import,保持功能一致 |
| 手工补充单元测试 | 覆盖率低,边界情况缺失 | AI 生成测试用例,覆盖正常/异常路径 |
| 人工验证重构结果 | 回归测试繁琐 | AI 运行测试并自动修复失败用例 |
对于 5000 行的遗留代码,传统重构需要 3-5 人天,而 AI 辅助可以将时间压缩到 2-4 小时,且错误率更低。
二、准备工作
2.1 获取 Claude API Key
Anthropic API Key 可通过官方申请(需境外信用卡)。若无法自行办理,可参考 gpt108.com(仅作信息分享)。
2.2 环境要求
- Node.js 18+(用于 Claude Code CLI 或直接使用 Cursor Agent)
- Cursor 编辑器(建议 Pro 版,以使用 Agent 模式)
- Python 3.10+(示例项目使用 Python)
三、实战案例:拆分一个 5000 行的 Flask 单体文件
假设我们有一个 app.py,包含以下混乱的结构:
- 30+ 个路由(用户、产品、订单、支付混在一起)
- 数据库操作硬编码在路由函数中
- 重复的验证逻辑散落各处
- 没有类型注解,没有单元测试
3.1 让 Cursor Agent 分析项目结构
在 Cursor 中打开项目,按 Cmd+Shift+P → AI: New Chat → 选择 Agent 模式,输入:
@Codebase 请分析 app.py 的整体结构,输出:
1. 所有路由及其对应的功能(如 /user/login 属于用户模块)
2. 重复代码块(相似度 > 70% 的片段)
3. 建议的模块拆分方案(推荐目录结构)
4. 数据库操作分布统计
Agent 会输出类似:
## 路由分类
- 用户模块: /login, /register, /profile, /logout (共 8 个路由)
- 产品模块: /products, /product/<id>, /search (共 6 个路由)
- 订单模块: /cart, /checkout, /orders (共 5 个路由)
- 支付模块: /pay, /callback (共 2 个路由)
## 重复代码
- 数据库连接代码重复 15 次
- 参数校验逻辑(检查 email 格式)重复 8 次
- 错误返回格式重复 12 次
## 建议目录结构
app/
├── models/
│ ├── user.py
│ ├── product.py
│ └── order.py
├── routes/
│ ├── user.py
│ ├── product.py
│ ├── order.py
│ └── payment.py
├── utils/
│ ├── db.py
│ ├── validators.py
│ └── response.py
└── main.py
3.2 执行自动化重构
继续在 Agent 中输入:
请按照上述方案执行重构,要求:
1. 将所有路由拆分到 app/routes/ 下的对应模块,使用 Flask Blueprint
2. 将数据库连接逻辑抽取到 app/utils/db.py,所有引用改为 import
3. 将参数校验逻辑抽取到 app/utils/validators.py
4. 为拆分后的每个模块生成基础的 pytest 测试文件(放在 tests/ 目录)
5. 运行 pytest,如果测试失败,请自动修复
6. 重构完成后,输出一份变更摘要,列出新增/修改的文件
Agent 会逐步执行:
- 创建目录结构:
mkdir -p app/routes app/utils tests - 拆分路由文件:将原
app.py中的路由函数按模块剪切到对应 Blueprint 文件 - 重写导入:修复所有跨模块引用(避免循环导入)
- 抽取公共逻辑:创建
db.py和validators.py,并替换原代码中的重复片段 - 生成测试:为每个新模块生成
test_*.py,包含基本的请求测试 - 运行验证:
pytest tests/,如果失败则自动分析错误并修改
3.3 关键代码示例(AI 生成)
路由模块示例(app/routes/user.py):
from flask import Blueprint, request, jsonify
from app.utils.db import get_db
from app.utils.validators import validate_email
user_bp = Blueprint('user', __name__, url_prefix='/user')
@user_bp.route('/login', methods=['POST'])
def login():
data = request.get_json()
email = data.get('email')
password = data.get('password')
if not validate_email(email):
return jsonify({'error': 'Invalid email format'}), 400
db = get_db()
user = db.users.find_one({'email': email})
if user and user['password'] == password:
return jsonify({'token': generate_token(user)})
return jsonify({'error': 'Invalid credentials'}), 401
工具模块示例(app/utils/validators.py):
import re
def validate_email(email: str) -> bool:
pattern = r'^[\w\.-]+@[\w\.-]+\.\w+$'
return bool(re.match(pattern, email))
def validate_phone(phone: str) -> bool:
# 简单校验,可根据需要增强
return phone.isdigit() and len(phone) >= 10
3.4 自动化测试生成
Agent 会为 user.py 生成 tests/test_user.py:
import pytest
from app import create_app
@pytest.fixture
def client():
app = create_app()
app.config['TESTING'] = True
return app.test_client()
def test_login_success(client, mocker):
mocker.patch('app.utils.db.get_db', return_value=MagicMock(
users=MagicMock(find_one=lambda x: {'email': 'test@example.com', 'password': '123'})
))
response = client.post('/user/login', json={
'email': 'test@example.com',
'password': '123'
})
assert response.status_code == 200
assert 'token' in response.json
def test_login_invalid_email(client):
response = client.post('/user/login', json={
'email': 'invalid',
'password': '123'
})
assert response.status_code == 400
assert 'Invalid email format' in response.json['error']
四、重构结果对比
| 指标 | 重构前 | 重构后 |
|---|---|---|
| 单文件最大行数 | 5000+ | < 300 |
| 重复代码行数 | 约 800 行 | 0 |
| 类型注解覆盖率 | 0% | 85% |
| 单元测试数量 | 0 | 24 |
| 新增模块数 | 1 | 11 |
| 平均理解时间 | 4 小时 | 30 分钟 |
五、成本与效率
| 项目规模 | 传统重构耗时 | AI 辅助耗时 | 节省比例 |
|---|---|---|---|
| 1000 行单体 | 4 小时 | 30 分钟 | 87.5% |
| 5000 行单体 | 3 天 | 3 小时 | 87.5% |
| 10000 行单体 | 7 天 | 8 小时 | 85.7% |
成本:以 5000 行项目为例,Claude API 调用约 50k token(含分析、生成、调试),成本约 $0.25。
六、常见问题与解决方案
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 循环导入 | 模块间相互引用 | 让 Agent 重新组织导入顺序,或合并某些模块 |
| 测试失败 | 依赖未 mock 或路径错误 | 将错误信息贴回对话框,Agent 会自动修复 |
| API 限流 | 单次请求 token 过多 | 使用 claude-3-haiku 处理简单任务,降低 80% 成本 |
| Cursor Agent 无法执行命令 | 权限不足 | 在终端手动执行 chmod +x 或切换到 Pro 版 |
七、让 Cursor 生成完整重构脚本
如果你希望将整个流程保存为可复用的脚本,可以在 Cursor 中输入:
请将上述重构逻辑封装成一个 Python 脚本 refactor_legacy.py,支持:
- 命令行参数:--input 指定原文件路径
- --output-dir 指定输出目录
- --dry-run 预览拆分方案但不实际修改文件
- 自动调用 Claude API,并将所有中间步骤写入日志
Cursor 会生成一个完整的 CLI 工具,方便后续应用到其他项目。
八、总结
通过 Cursor Agent + Claude API,你可以在不深入了解遗留代码细节的情况下,安全、快速地完成大规模重构。关键在于:
- 让 AI 先分析:不要急着动手,先让 Agent 生成拆分方案
- 分步执行:从抽取公共工具开始,再拆分路由
- 测试驱动:要求 AI 同时生成测试,并用测试验证重构结果
- 迭代修复:遇到错误时,直接把错误信息喂给 AI 让它自己修
这套方法不仅适用于 Flask,也可以推广到 Express、Spring Boot 等其他框架。随着 AI 能力的增强,代码重构正在从“高风险的体力活”变成“安全的自动化任务”。
九、参考来源
本文所需的 Claude API Key 可通过文章中 2.1 小节中的gpt108 获取(支持支付宝/微信,自助充值,无需提供密码),仅作技术方案参考。
完整重构示例代码已上传至 GitHub Gist,评论区获取链接。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)