代码重构建议:让 AI 提出改善代码结构的方案
javascript function calc(orders) { let t = 0; for (let i = 0; i < orders.length; i++) { let o = orders[i]; if (o.type === 'food') { t = t + o.price * o.quantity; } else if (o.type === 'drink') { t = t + o.price * o.quantity; } else if (o.type === 'book') { t = t + o.price * o.quantity; } } if (t > 100) { t = t * 0.9; } else if (t > 50) { t = t * 0.95; } return t; }
**问题总结**:魔法数字、重复逻辑、变量命名模糊、多个 `if` 判断可以合并、折扣逻辑与计算耦合。
### 向 AI 提问并获得重构方案
将这段代码贴给 ChatGPT(或其他工具),并附上下面的提示词:
请重构下面的 JavaScript 函数,提升可读性、消除重复,并解释每一步改动的原因。 要求:
- 使用有意义的变量名
- 将折扣逻辑提取为单独的函数
- 保持原有行为不变
- 输出重构后的完整代码及分步说明
**AI 返回的典型回答**(精简示例):
**分步说明**:
- 重命名函数为 `calculateOrderTotal`,参数 `orders` 改为 `orderItems`。
- 变量 `t` 改名为 `subtotal`。
- 由于所有 `o.type` 分支都执行相同计算,直接移除条件判断,统一累加。
- 将折扣策略提取为 `applyDiscount` 函数,根据 `subtotal` 返回折扣系数。
- 使用 `reduce` 简化累加过程,或保留 for…of 循环。
**重构后的代码**:
```javascript
function calculateOrderTotal(orderItems) {
const subtotal = orderItems.reduce(
(sum, item) => sum + item.price * item.quantity,
0
);
const discount = applyDiscount(subtotal);
return subtotal * discount;
}
function applyDiscount(amount) {
if (amount > 100) return 0.9;
if (amount > 50) return 0.95;
return 1;
}
行为完全相同,但代码一目了然。applyDiscount 甚至可以独立测试。
如何向 AI 提出高质量的重构问题
要让 AI 输出精准实用的建议,提示词的质量至关重要。遵循以下框架:
明确指令与上下文
不要只说“帮我重构”,而应具体说明:
- 语言和框架:告诉 AI 这是 JavaScript、Python 还是 Java,以及是否有框架约束。
- 目标:可读性、性能、设计模式还是去重?可以多选。
- 约束条件:“保持函数签名不变”、“不能使用 ES6 以上的特性”等。
要求解释“为什么”
好的重构需要理解原理。请求 AI “解释每次改动的原因”,你可以学习到重构背后的思维模型,而不仅仅是复制代码。
指定重构手法
如果你已经能识别出“这段代码太长,我想拆分成小函数”,可以直接说:“用提取函数手法重构此代码,将验证逻辑和计算逻辑分开”,这样 AI 的建议会更贴合你的预期。
分步骤迭代
大型代码不适合一次性提交。先让 AI 分析代码异味,再针对某一异味给出重构方案,逐步改造。
示例优质提示词:
你是一名资深前端开发。请分析下面 React 组件代码的坏味道,并重点重新组织条件渲染部分。要求使用提前返回(early return)减少嵌套,并提取一个独立的
UserAvatar子组件。保留所有现有功能。给出修改后的完整代码以及重构步骤列表。
常见重构手法与 AI 提示词示例
以下是几种日常极高频率的重构场景,附带可直接套用的提示词模板。
1. 提取函数(Extract Function)
将一段可独立描述的逻辑抽离成新函数,改善主函数的长度和复杂度。
请将下面函数中处理日期格式化的代码块提取为一个独立函数 `formatDate`,
并保持主函数的控制流不变。请输出修改后的全部代码,并解释为何提取这部分逻辑。
2. 简化条件表达式
多层 if/else 或复杂的布尔逻辑常常可以被重组为更清晰的形态。
重构以下条件判断,使用卫语句(guard clauses)或策略模式简化逻辑。
避免嵌套深度超过两层,使阅读顺序符合正常思维流程。
3. 用多态替换条件
当代码根据类型执行不同行为时,可以用类多态取代冗长的 switch。
下面的代码根据 `paymentMethod` 执行不同计算逻辑。
请用策略模式重构,为每种支付方式创建独立的类,并提供一个统一的上下文调用。
使用 TypeScript 编写,保持类型安全。
4. 变量与函数命名优化
名字是代码的“地图”,AI 可以快速识别出暧昧不清的命名。
重新命名下面代码中的变量和函数,使它们的意图一目了然。
遵循 [语言] 命名规范,并避免缩写。
列出所有重命名映射表,并给出修改后的代码。