simplify 技能 —— 代码优化

Claude Code 内置技能 · 自动审查代码复用性、质量与执行效率并修复问题

一、概述

simplify 是 Claude Code 中一个专注于代码优化的内置技能(Slash Command)。当开发者输入 /simplify 时,该技能会自动扫描当前工作区中已被修改(unstaged changed)的代码文件,逐一检查是否存在复用性不足、代码质量缺陷以及执行效率偏低的问题,并在发现后直接给出修改建议或执行修复。

该技能的设计目标是在不改变原有功能逻辑的前提下,让代码变得更简洁、更健壮、更高效。与传统的 Linter 不同,simplify 不只关注语法层面的规范,而是深入语义层面 —— 识别出可复用的模式、潜在的性能陷阱以及可能降低可维护性的坏味道。

核心原则:只改代码结构,不改代码行为。每一次变更都必须保持原有功能完全不变。

二、技能触发与工作流程

simplify 的触发方式非常简洁:在 Claude Code 对话中输入 /simplify 即可。触发后,技能会依次执行以下步骤:

  1. 扫描变更文件 — 通过 git diffgit diff --cached 获取当前工作区中所有已修改但尚未提交的代码文件列表。
  2. 分类审查 — 对每个变更文件执行三个维度的审查:复用性(Reuse)、代码质量(Quality)、执行效率(Efficiency)。
  3. 输出发现 — 列出每一项被发现的问题及其所在的文件和行号,并附带为何这是一个问题的解释。
  4. 应用修复 — 在确认后直接修改代码以消除发现的问题。
  5. 验证 — 确保修改后的代码没有引入新的语法错误或破坏原有功能。

注意:simplify 仅处理已修改但未提交的代码文件。如果希望它对整个项目做全面审查,需要先确保所有文件都已纳入 git 跟踪且有变更记录。

三、检查维度一:复用性(Reuse)

复用性检查的目标是消除重复代码(DRY 原则),提取公共逻辑,减少维护负担。simplify 会在以下几个层面进行检测:

3.1 重复代码块

当多段代码在结构上高度相似甚至完全相同时,simplify 会建议将其提取为函数、循环或配置映射表。例如,多个 if-else 分支中执行了类似的逻辑。

// 优化前:重复代码 if (status === 'active') { sendEmail(user.email, 'welcome', 'zh'); logEvent('signup', user.id); } if (status === 'pending') { sendEmail(user.email, 'pending', 'zh'); logEvent('pending', user.id); } // 优化后:统一函数 function handleUserStatus(user, status) { const templateMap = { active: 'welcome', pending: 'pending' }; sendEmail(user.email, templateMap[status], 'zh'); logEvent(status, user.id); }

3.2 硬编码值

散落在代码各处的魔数(Magic Number)和字符串常量会被建议提取为具名常量或配置文件,提升可读性和可维护性。

3.3 重复的工具函数

当多个文件中出现了相同或相似的工具函数时,simplify 会建议将其合并到一个公共模块中统一引用。

四、检查维度二:代码质量(Quality)

代码质量维度的覆盖范围最广,从命名规范到错误处理均在审查之列。主要包含以下子项:

典型案例:深层嵌套的 if 金字塔可以通过"提前返回"模式大幅简化,既降低了圈复杂度,又使主逻辑路径更清晰。

五、检查维度三:执行效率(Efficiency)

效率检查关注代码在运行时对计算资源和内存的利用是否合理。simplify 会识别以下常见的性能反模式:

反模式 问题描述 优化建议
循环内重复计算 在 for 循环的条件中反复调用 .length 或执行耗时计算 将不变量提到循环外部缓存
不必要的数组/对象拷贝 使用 Array.map() 后再 .filter() 产生两次遍历 合并为一次遍历或使用 flatMap/reduce
低效的数据结构 高频查找场景下使用数组而非 Set/Map 替换为更适合查找的数据结构
重复 DOM 查询 在同一个函数内多次调用 document.querySelector 将查询结果缓存到变量中
冗余计算 多次调用同一纯函数且参数不变 使用记忆化(memoization)

特别提醒:simplify 不会做激进的性能优化 —— 它只解决那些"明显得不偿失"的低效写法,避免引入不必要的复杂度。

六、simplify 的工作机制

simplify 的底层依赖 Claude Code 的代码理解能力,而非传统的静态分析规则集。这意味着它具有以下几项独特优势:

当 simplify 发现一个问题时,它会以结构化的方式呈现:首先是问题描述与影响评估,然后是问题代码的具体位置,最后是建议的优化代码。在用户确认后,它会直接编辑文件完成修改。

七、典型使用场景

simplify 在以下场景中特别有用:

推荐工作流:git add 之前先执行 /simplify,让代码在进入暂存区前就完成一轮自动优化。

八、常见优化改进案例

以下列出 simplify 在实际项目中最常发现的几类改进,并附上前后对比:

8.1 条件表达式简化

// 优化前 let result; if (condition) { result = 'yes'; } else { result = 'no'; } // 优化后 const result = condition ? 'yes' : 'no';

8.2 逻辑合并

// 优化前 if (user) { if (user.isActive) { sendNotification(user); } } // 优化后 if (user?.isActive) { sendNotification(user); }

8.3 冗余变量消除

// 优化前 const fullName = firstName + ' ' + lastName; return fullName; // 优化后 return `${firstName} ${lastName}`;

8.4 使用现代语法

// 优化前 const arr = list.map(function(item) { return item.value; }); // 优化后 const arr = list.map(item => item.value);

提示:以上是简单示例。实际项目中 simplify 发现的优化往往涉及跨多行的复杂重构,但始终遵循"语义不变"的原则。

九、使用 simplify 的最佳实践

为了最大化 simplify 的价值,建议遵循以下实践:

  1. 增量使用 — 每次修改代码后立即运行 /simplify,而不是积攒大量变更后一次性处理。增量使用可以让每次优化更聚焦、风险更可控。
  2. 结合测试 — 在 simplify 完成优化后,运行相关的单元测试和集成测试,确保重构没有破坏功能。
  3. 审阅改动 — 使用 git diff 查看 simplify 所做的每项修改,理解其变更逻辑。这不仅有助于学习,也能在必要时回退特定改动。
  4. 配合 Linter 使用 — simplify 和 ESLint / Prettier 等工具是互补关系:Linter 负责语法和格式规范,simplify 负责语义层面的代码质量。
  5. 分步提交 — 如果 simplify 改动了多个不相关的模块,建议分开提交,保持每个 commit 的职责单一。

十、与其他工具的对比

特性 simplify ESLint Prettier SonarQube
定位 语义级代码优化 语法与规则检查 代码格式化 代码质量平台
自动修复 部分支持 仅建议
理解重复语义 有限 有限
跨文件分析
集成方式 Slash Command CLI / 插件 CLI / 插件 CI / IDE

十一、核心总结

simplify 的核心理念:

好的代码不是写出来的,是改出来的。simplify 让"改"这个环节变得更智能、更高效。它不只是一个检查工具,更是一个编码伙伴 —— 在开发者专注于功能逻辑时,帮忙守住代码质量和架构一致性的底线。

在日常开发中养成使用 /simplify 的习惯,就能以极小的成本持续保持代码库的健康度,避免技术债务的累积。

总结来说,simplify 的价值体现在三个层面:

十二、延伸阅读

以下技能与 simplify 有相似的优化理念,可配合使用:

此外,建议定期使用 /simplify 对核心模块进行代码健康检查,将代码优化融入日常开发循环,而不是留到重构周集中处理。