Chapter 07

多文件重构实战

Cascade 最能体现价值的场景就是多文件重构——一个需要同步修改十几个文件、手工完成极易出错的任务,AI 几分钟内完成。

跨文件重命名与符号重构

传统 IDE 的"重命名"只能处理语法层面的引用。Cascade 能处理更复杂的情况:字符串中的命名、动态引用、注释里的引用,甚至需要同步修改 API 文档的情况。

我需要将整个项目中的服务层命名从 "Service" 后缀改为 "Repository" 后缀。
例如:UserService → UserRepository,AuthService → AuthRepository。

请:
1. 找出所有 Service 类/接口/文件
2. 制定重命名计划(包括文件名、类名、接口名、import 语句)
3. 检查是否有字符串中包含 "Service"(如路由路径、日志消息)需要单独处理
4. 执行重命名(保持所有功能不变)
5. 运行 tsc --noEmit 确认类型正确

注意:只重命名服务层,不要动控制器层(Controller)

在现有架构中添加新功能

添加新功能的难点在于"融入"——要遵循现有的代码风格、目录结构、错误处理模式。Cascade 会先理解现有架构,再生成符合风格的新代码:

在现有的 Express + PostgreSQL + Prisma 项目中,
添加"文件上传"功能,要求:

1. 仿照 @src/controllers/posts.controller.ts 的写法
2. 支持:图片(jpg/png/gif/webp)+ PDF,最大 10MB
3. 存储:本地存储(路径:uploads/),生产环境换 S3(已在 @src/lib/storage.ts 中有接口)
4. 文件 URL 存入数据库(posts 表新增 attachment_url 字段,需要 Prisma migration)
5. API:POST /api/posts/:id/attachment

不要引入 multer 以外的新库(multer 已在 package.json)

实战案例 1:REST API 改造为 WebSocket

这是一个典型的重构任务:聊天室功能从轮询改为 WebSocket 实时推送,需要同时修改后端和前端。

我的聊天室目前使用 REST API 轮询(每2秒 GET /api/messages),
需要改造为 WebSocket 实时推送。

现有代码:
- 后端:@server/routes/messages.ts(GET/POST 消息接口)
- 前端:@client/hooks/useMessages.ts(轮询逻辑)
- 前端:@client/components/ChatRoom.tsx(消息展示)

目标架构:
- 后端:ws 库(已安装),复用现有 Express server
- 事件:connect、send_message、receive_message、disconnect
- 前端:原生 WebSocket API(不用 socket.io-client)
- 保留原有 REST API(移动端仍在用)

执行前请先画出新的数据流图,确认我理解正确。

Cascade 会先给出数据流图(ASCII 格式),确认方案后执行多文件修改:

Cascade 生成的数据流图(改造后): 客户端(浏览器) 服务器 │ │ │── WebSocket 握手 ──────────→ │ ws.Server 升级 │ (ws://localhost:3000/ws) │ │ │ │── send_message { │ │ text: "Hello", │ 保存到数据库 │ roomId: "room-1" │ 广播给同房间所有客户端 │ } ─────────────────────→ │ │ │ │ ←─── receive_message { │ │ id, text, │ │ userId, timestamp │ │ } ────────────────── │ │ │ │── (断线) ─────────────────→ │ 清理连接状态 │ (自动重连3次) │

实战案例 2:给 Express 项目添加 TypeScript

将 JavaScript Express 项目迁移到 TypeScript 是最常见的重构任务之一,也是 Cascade 最擅长的场景:

将 @server/ 目录下的 Express 项目从 JavaScript 迁移到 TypeScript。

当前状态:
- 所有文件是 .js,使用 CommonJS(require/module.exports)
- Node.js 18,没有构建步骤(直接 node server.js)

目标:
- TypeScript 5.3,ES modules(import/export)
- tsconfig.json 配置(strict 模式,输出到 dist/)
- 所有函数参数和返回值有类型
- Express Request/Response 类型正确
- 构建命令:npm run build(tsc),运行:npm start(node dist/server.js)

迁移策略(按此顺序):
1. 先配置 tsconfig.json 和 package.json 的 scripts
2. 从 types/ 共享类型定义开始
3. 再迁移 models/ → services/ → routes/ → server.js
4. 每迁移一批文件就运行 tsc --noEmit 确认

请开始执行,遇到难以确定类型的地方先用 unknown,
后续我会逐步细化。

依赖升级:处理破坏性 API 变更

依赖升级(特别是主版本升级)是最令人头疼的重构任务,因为 API 可能大量变更。Cascade 能结合网络搜索最新迁移指南来处理:

请帮我将项目从 React Query v4 升级到 TanStack Query v5。

@Web 搜索 TanStack Query v5 migration guide,
然后:
1. 列出本项目受影响的 API 变更(只列出我实际用到的)
2. 搜索 @src/ 目录中所有使用了 useQuery/useMutation 的文件
3. 按照 v5 的新 API 逐文件修改
4. 特别注意:v5 中 isLoading/isError 行为变更

在修改每个文件之前,先显示该文件需要改动的摘要。

AI 代码审查

Cascade 可以像人工 Code Review 一样审查你的 PR 差异,提出针对性改进建议:

请审查以下代码变更(这是我要提交的 PR diff),
重点关注:
1. 安全问题(SQL注入、XSS、权限控制漏洞)
2. 性能问题(N+1 查询、不必要的重渲染、大对象拷贝)
3. 错误处理遗漏(边界情况、异步错误)
4. 代码规范(与 .windsurfrules 不符的地方)

对于每个问题,给出:严重程度(阻塞/建议/可选)+ 具体建议

[粘贴 git diff 内容]
重构安全原则 执行大规模重构前,务必确保:① 有完整的测试覆盖(没有测试等于没有安全网)② 在独立分支上操作,不直接修改 main ③ 重构时只改结构,不改功能(结构重构和功能开发分开提 PR)。Cascade 会帮你执行,但不会帮你决策"这个改动是否安全上线"——这需要你自己判断。
本章小结 多文件重构是 Windsurf 最能体现 ROI 的场景。关键方法:先分析影响范围再执行、分步验证(每批修改后运行类型检查/测试)、对复杂迁移先给出方案图确认。代码审查功能让 Cascade 成为"不知疲倦的 Reviewer",补充人工 Review 的盲点。