从前,有一个叫 Claude 的代码厨师,他开了一家 CLI 餐厅。每天都有很多程序员客人带着 “意大利面代码” (又长又乱、让人头疼的代码)来找他。
客人们只要对着厨房大喊一声 “/simplify” ,Claude 就会戴上魔法手套,念出咒语,几分钟后——一盘 清爽、优雅、像诗歌一样的代码 就端出来了。
但是,这个魔法背后可不是简单的“挥手就变”。Claude 厨房里有一套精密的 魔法流水线:
- 接单员(CLI 解析器)听到
/simplify口令 - 选菜工(上下文收集器)从客人盘子里夹出选中的代码块
- 配方师(Prompt 工程师)写下“简化秘籍”
- 魔法烤箱(Claude API)把代码烤熟、压平、揉成团
- 摆盘师(输出渲染器)展示简化前后的对比,让客人决定要不要替换
下面,我们就走进 Claude 厨房的后台,看看每一道工序的 代码实现 和 最佳用法。
⚙️ 实现原理(附代码)
1. CLI 命令注册与解析
Claude Code CLI 内部使用命令模式。/simplify 会触发一个 SimplifyCommand 类。
// 伪代码:命令注册
export const builtinCommands = {
simplify: {
description: "简化选中的代码,提高可读性,减少冗余",
handler: async (ctx: CommandContext) => {
const selectedCode = ctx.getSelectedText();
if (!selectedCode) {
return ctx.showError("❌ 请先选中要简化的代码块");
}
const simplified = await simplifyWithAI(selectedCode, ctx);
await ctx.showDiffAndConfirm(selectedCode, simplified);
}
}
};
2. 收集上下文:选中的代码 + 周围提示
为了准确简化,CLI 不仅会拿选中代码,还会附带上 文件名、语言类型、前后几行(防止简化时丢失依赖)。
async function collectContext(editor: Editor): Promise<SimplifyContext> {
const selection = editor.getSelection();
const fullText = editor.getDocument().getText();
const language = editor.getLanguage();
return {
language,
selectedCode: selection.text,
// 前后各 5 行作为“环境提示”
surroundingBefore: fullText.slice(Math.max(0, selection.start.line - 5), selection.start.line),
surroundingAfter: fullText.slice(selection.end.line, selection.end.line + 5),
};
}
3. 构建简化 Prompt(配方师的核心魔法)
这里是最关键的一步:告诉 Claude 模型 怎样才算“简化” 。一个典型的系统提示:
const SIMPLIFY_SYSTEM_PROMPT = `
你是一位顶级代码简化专家。你的任务是将用户提供的代码简化,同时**完全保持原有功能**。
简化原则:
1. 合并重复逻辑(提取重复代码为函数/变量)
2. 用更清晰的命名替换模糊的变量名
3. 将复杂的条件表达式拆解或合并为易读的形式
4. 移除无效的注释、死代码、过度嵌套
5. 保持语言的惯用写法(例如使用现代语法特性)
输出要求:
- 只返回简化后的代码,不要加解释
- 保持原有的缩进风格
- 如果无法简化(比如已经是极简形式),返回原代码并在注释中加 // (already simplified)
`;
const userPrompt = `
语言:${context.language}
原始代码:
${context.selectedCode}
请简化。
`;
4. 调用 Claude API(魔法烤箱)
CLI 会发起一个流式请求,因为简化结果可能很长,流式输出可以让用户实时看到变化。
async function simplifyWithAI(code: string, ctx: CommandContext): Promise<string> {
const response = await ctx.anthropic.messages.create({
model: "claude-3-opus-20240229",
max_tokens: 4000,
system: SIMPLIFY_SYSTEM_PROMPT,
messages: [
{ role: "user", content: `简化以下代码:\n${code}` }
],
stream: true, // 流式输出
});
let result = "";
for await (const chunk of response) {
if (chunk.type === "content_block_delta") {
result += chunk.delta.text;
ctx.renderStreamingDiff(code, result); // 实时显示差异
}
}
return result;
}
5. 展示差异并确认替换(摆盘环节)
CLI 使用 diff 算法(比如 diff-match-patch)高亮显示修改的部分,然后询问用户 Y/n 是否接受。
async function showDiffAndConfirm(original: string, simplified: string) {
const diff = createUnifiedDiff(original, simplified);
console.log(chalk.cyan("\n📝 简化后的代码对比:\n"));
console.log(diff);
const answer = await prompt("是否替换原代码?(Y/n) ");
if (answer.toLowerCase() !== 'n') {
editor.replaceSelection(simplified);
console.log(chalk.green("✅ 代码已简化!"));
} else {
console.log(chalk.gray("⏸️ 保持原样"));
}
}
📈 最佳用法(给小白的三条锦囊)
🎯 锦囊1:只选中“一团乱麻”,不要选整个文件
/simplify 最适合处理 一个函数、一个长条件判断、一段重复代码。如果选中 500 行,AI 可能会“晕菜”或者过度修改。
✅ 好例子:
// 选中的代码:一个又长又臭的购物车计价函数
function calc(a,b,c){
let t=0;
for(let i=0;i<a.length;i++){ t=t+a[i].price; }
if(b) t=t*0.9;
if(c) t=t+5;
return t;
}
简化后:
function calculateTotal(cartItems, applyDiscount, applyShipping) {
const subtotal = cartItems.reduce((sum, item) => sum + item.price, 0);
const discounted = applyDiscount ? subtotal * 0.9 : subtotal;
const total = applyShipping ? discounted + 5 : discounted;
return total;
}
🧹 锦囊2:多次简化,像擦玻璃一样迭代
第一次简化可能只做了变量重命名;第二次运行 /simplify 可能会发现重复逻辑;第三次可能引入更现代的语言特性。放心,Claude 不会“过度简化”导致逻辑丢失,每次都会保持等价。
🚫 锦囊3:避开三个雷区
- ❌ 不要简化 算法核心(比如红黑树删除逻辑),AI 可能改变微妙顺序。
- ❌ 不要简化 正则表达式,容易出错。
- ❌ 不要在 没有单元测试 的项目上乱用——虽然 Claude 很强,但建议简化后运行一下测试。
⏱️ 时序图(一次完整的 /simplify 旅程)
🎁 最后一句大实话
/simplify 本质上是一个 精心包装的 AI 代码重构工具。它不比你聪明,但比你 耐心、守规矩、不会累。你给它一团乱麻,它帮你理成线团;你给它一块璞玉,它也能帮你雕得更精致。
每次跟Claude code对话了很多轮,写了几个大的功能更新之后,都顺手跑一遍/simplify。
你输入/simplify之后,Claude Code会同时启动三个平行的Agent,分别从代码复用、代码质量、运行效率三个角度审查你的改动。AI写的代码经常会有一些微妙的冗余,多余的import、重复的逻辑、可以用更简洁写法替代的地方,/simplify基本上都能挑出来。相当于找了三个同事帮你同时review。