用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/ZeroZ-lab/unified-skills --skill verify-quality-simplify命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | verify-quality-simplify |
| description | 系统性代码简化。当代码变得复杂、重复、过度抽象需要简化,或提到"简化""重构""太复杂""重复代码" |
verify-workflow-review 或继续 build扫描代码,标记以下类型的简化目标:
50 行的函数
3 层缩进
if (false)、throw 后的代码)对每个目标,回答以下问题:
对每个目标进一步判断:
对不确定的目标:先标记,跳过,不要猜。
规则:每次只改一个目标。每次改动后跑测试,全绿才继续。
| 目标类型 | 策略 | 触发条件 |
|---|---|---|
| 重复代码 | 提取函数 | 仅当第 3+ 次出现 |
| 过度抽象 | 内联回调用处,删除抽象层 | 使用场景 < 3 |
| 过长函数 | 按职责拆分,每个函数一个职责 | > 50 行 |
| 过深嵌套 | 提前返回(guard clause)减少缩进 | > 3 层 |
| 死代码 | 确认无引用后用 AskUserQuestion 确认后删除 | 无引用 |
| 冗余注释 | 删除;删除后不够自解释则改善命名 | 代码已自解释 |
// 第 1 次出现:保持内联
// 第 2 次出现:保持内联,标记 TODO
// 第 3 次出现:提取为函数
function formatDateForDisplay(date: Date): string {
// 三个地方都用的逻辑现在集中在一处
}
// 前:过度抽象(只有 1 个实现)
interface DataProcessor { process(data: Raw): Result }
class DefaultDataProcessor implements DataProcessor { ... }
// 后:直接使用
function processData(data: Raw): Result { ... }
// 前:一个函数做 3 件事
function handleRequest(req: Request): Response { /* 80 行 */ }
// 后:每个函数一个职责
function validateRequest(req: Request): Validated { ... }
function transformData(data: Validated): Processed { ... }
function buildResponse(data: Processed): Response { ... }
// 前:4 层嵌套
function process(user: User) {
if (user) {
if (user.isActive) {
if (user.hasPermission) {
// 真正的逻辑
}
}
}
}
// 后:提前返回,1 层
function process(user: User) {
if (!user) return;
if (!user.isActive) return;
if (!user.hasPermission) return;
// 真正的逻辑
}
# 确认无引用
grep -r "<symbol>" --include="*.ts" --include="*.tsx" --include="*.js"
确认无引用后,使用 AskUserQuestion 询问:"是否删除 <symbol>?代码库中无引用。"
// 前:注释多余
// 设置用户名称
user.setName(name);
// 后 A:删除注释
user.setName(name);
// 后 B:如果删注释后不够清晰,改善命名
user.updateDisplayName(name);
简化完成后,依次验证:
如果任何一项不满足 → 回退最后一次改动,重新评估。
过度抽象(只有 1 个实现的 DataProcessor 接口)→ 内联为 processData() 函数。行数减少、调用链缩短、行为不变(全量测试通过)。下次修改不需要跨 3-5 层间接调用。
3 个相似代码行出现时就建抽象工厂 + 策略模式。使用场景 < 3 但抽象层永久存在,每次修改需追踪多层间接调用,理解负担反而增加。YAGNI 被违反。
简化记录(可合并入审查报告或作为独立记录):
# Simplify 记录: <feature-name>
## 简化目标清单
| 目标 | 类型 | 简化策略 | 原始行数 | 简化后行数 | 状态 |
|------|------|---------|---------|----------|------|
| <symbol-1> | 重复代码 | 提取函数 | X | Y | 完成 |
| <symbol-2> | 过度抽象 | 内联+删除 | X | Y | 完成 |
| <symbol-3> | 死代码 | 确认后删除 | X | 0 | 完成 |
## 验证结果
- 全部测试: PASS (列出命令和结果)
- Lint: 无新警告
- 行为验证: 关键路径手动确认无变化
- 行数变化: 总减少 N 行
## 被跳过的目标
| 目标 | 跳过原因 |
|------|---------|
| <symbol-4> | 不确定依赖关系,需要进一步调查 |
## 结论
- 简化完成 / 需继续(如有被跳过的目标)
输出或记录必须包含:
| 说辞 | 现实 | 后果 |
|---|---|---|
| "这样更优雅" | 优雅不是目标,简单才是。可读、可维护比聪明重要。 | "优雅"代码下次修改时无人敢动——看不懂、怕改坏。3 个月后连作者自己也读不懂。 |
| "先重构再说" | 不理解就动手 = 制造 bug。先 Phase 2 理解上下文。 | 不理解就重构引入 bug 的概率 > 50%(行业经验)。每个引入的 bug 又需要一轮调试,总时间 > 先理解再动手。 |
| "以后会用到" | YAGNI。等第三个使用场景出现再抽象。 | 预先建的抽象 80% 永远不会有第二个使用场景,但每个使用者都要理解它的存在和约束。认知负担永久增加。 |
| "这段代码太难看了" | 丑但正确 > 漂亮但有 bug。先理解为什么丑。 | 为了"美化"而改动的代码引入回归,丑代码背后的隐藏约束没有被理解。修复新 bug 的时间 > 忍受丑代码的代价。 |
| "抽象一下更干净" | 抽象有成本。使用场景 < 3 的抽象增加理解负担。 | 过早抽象让后续修改需要追踪 3-5 层间接调用,下次重构时无人敢删这段代码。 |
违反字面规则就是违反精神。 没有灰色地带。
| 失败场景 | 处理方式 |
|---|---|
| 简化后测试失败 | 立即回退最后一次改动,重新评估简化策略,不可继续改其他目标 |
| 简化后行为变化 | 回退改动,Iron Law 违反 — 行为不变是硬门,行为变化 = 简化失败 |
| 不理解的代码被删除 | 回退删除,按 Chesterton's Fence 原则先理解再决定是否删除 |
| 抽象后代码行数增加 | 回退抽象,重新评估是否真的需要这个抽象(使用场景 < 3 = 不需要) |
| 简化引入新依赖 | 回退改动,简化不应引入新依赖,新依赖 = 增加而非减少复杂度 |