接手一个没有单元测试、没有文档、超过 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+PAI: 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 会逐步执行:

  1. 创建目录结构mkdir -p app/routes app/utils tests
  2. 拆分路由文件:将原 app.py 中的路由函数按模块剪切到对应 Blueprint 文件
  3. 重写导入:修复所有跨模块引用(避免循环导入)
  4. 抽取公共逻辑:创建 db.pyvalidators.py,并替换原代码中的重复片段
  5. 生成测试:为每个新模块生成 test_*.py,包含基本的请求测试
  6. 运行验证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,你可以在不深入了解遗留代码细节的情况下,安全、快速地完成大规模重构。关键在于:

  1. 让 AI 先分析:不要急着动手,先让 Agent 生成拆分方案
  2. 分步执行:从抽取公共工具开始,再拆分路由
  3. 测试驱动:要求 AI 同时生成测试,并用测试验证重构结果
  4. 迭代修复:遇到错误时,直接把错误信息喂给 AI 让它自己修

这套方法不仅适用于 Flask,也可以推广到 Express、Spring Boot 等其他框架。随着 AI 能力的增强,代码重构正在从“高风险的体力活”变成“安全的自动化任务”。

九、参考来源

本文所需的 Claude API Key 可通过文章中 2.1 小节中的gpt108 获取(支持支付宝/微信,自助充值,无需提供密码),仅作技术方案参考。

完整重构示例代码已上传至 GitHub Gist,评论区获取链接。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐