用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/tomevault-io/skills-registry --skill clean-code命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
基于 SOC 职业分类
| name | clean-code |
| description | | Use when this capability is needed. |
Principles for transforming "code that works" into "code that is clean" — code that can be read, understood, and enhanced by any developer.
"Code is clean if it can be understood easily — by everyone on the team." — Dave Thomas
Reference these guidelines when:
| Priority | Category | Impact |
|---|---|---|
| 1 | Naming | HIGH — affects every line of code |
| 2 | Functions | HIGH — core unit of abstraction |
| 3 | Code Smells | HIGH — early detection prevents rot |
| 4 | Formatting | MEDIUM — readability at a glance |
| 5 | Error Handling | MEDIUM — robustness and clarity |
| 6 | Comments | MEDIUM — most are avoidable |
| 7 | Object Calisthenics | ASPIRATIONAL — exercises for better OO design |
Good names are the single most impactful thing you can do for readability.
Priority order:
data, info, manager, handler, utils// Bad
const d = new Date();
const arr = users.filter((u) => u.a);
function process(data: any) {}
// Good
const createdAt = new Date();
const activeUsers = users.filter((user) => user.isActive);
function validatePayment(payment: Payment) {}
Conventions:
Customer, OrderRepository). Avoid Manager, Data, Info.createOrder, validateEmail, isEligible)isActive, hasPermission, canWithdraw)users, orderItems)See references/NAMING.md for full guidelines.
// Bad — does too many things, unclear name
function handle(order: Order, sendEmail: boolean, log: boolean) {
// validate, calculate, save, email, log — all in one
}
// Good — small, single-purpose, descriptive
function validateOrder(order: Order): ValidationResult { ... }
function calculateTotal(items: OrderItem[]): Money { ... }
function saveOrder(order: Order): Promise<void> { ... }
Rules:
saveAndNotify, not save)Indicators that code may need refactoring. Not bugs, but design friction.
| Smell | Symptom | Quick Fix |
|---|---|---|
| Long Method | > 20 lines, multiple concerns | Extract methods |
| Large Class | Many responsibilities | Extract class (SRP) |
| Long Parameter List | > 3 parameters | Introduce parameter object |
| Primitive Obsession | Strings/numbers for domain concepts | Wrap in value objects |
| Feature Envy | Method uses another class's data more than its own | Move method |
| Data Clumps | Same group of fields appear together | Extract class |
| Switch Statements | Type-checking switch/if-else across codebase | Replace with polymorphism |
| Divergent Change | One class changed for many reasons | Split by responsibility |
| Shotgun Surgery | One change touches many files | Move related code together |
| Speculative Generality | "Just in case" abstractions | Delete (YAGNI) |
| Dead Code | Unreachable or unused code | Delete |
| Message Chains | a.getB().getC().doSomething() | Hide delegate (Law of Demeter) |
See references/CODE_SMELLS.md for detailed examples and refactoring strategies.
The Newspaper Metaphor — code should read top-to-bottom like a newspaper article. High-level summary at the top, details below.
class OrderProcessor {
// Public API first — the "headline"
process(order: Order): ProcessResult {
this.validate(order);
const total = this.calculateTotal(order);
return this.save(order, total);
}
// Supporting methods below, in order of appearance
private validate(order: Order) { ... }
private calculateTotal(order: Order): Money { ... }
private save(order: Order, total: Money): ProcessResult { ... }
}
Rules:
null — use undefined, Result types, or thrownull — leads to defensive checks everywhereInsufficientFundsError over generic Error// Bad — null checks cascade through codebase
function getUser(id: string): User | null {
return db.find(id);
}
const user = getUser(id);
if (user === null) { ... } // Every caller must check
// Good — throw at boundary, trust within domain
function getUser(id: string): User {
const user = db.find(id);
if (!user) throw new UserNotFoundError(id);
return user;
}
"Don't comment bad code — rewrite it."
Most comments compensate for failure to express intent in code. Prefer self-documenting code over comments.
Good comments:
Bad comments:
// increment counter)// constructor, // getters)// Bad — restates the obvious
// Check if user is active
if (user.isActive) { ... }
// Good — explains a non-obvious business rule
// Users who haven't verified email within 30 days are auto-deactivated
// per compliance requirement GDPR-2024-42
if (user.isAutoDeactivated) { ... }
Nine exercises from Jeff Bay to improve OO design. Treat these as aspirational targets — strict during practice, pragmatic in production.
| # | Rule | Goal |
|---|---|---|
| 1 | One level of indentation per method | Extract methods aggressively |
| 2 | Don't use else | Early returns, guard clauses, polymorphism |
| 3 | Wrap all primitives with domain meaning | Value objects (Email, Money, UserId) |
| 4 | First-class collections | Wrap arrays in domain-specific classes |
| 5 | One dot per line | Law of Demeter — talk to friends only |
| 6 | Don't abbreviate | If the name is too long, the class does too much |
| 7 | Keep entities small | Classes < 50 lines, methods < 10 lines |
| 8 | Limit instance variables | Strive for 2-3; forces focused classes |
| 9 | No getters/setters | Objects have behavior, not just data |
See references/OBJECT_CALISTHENICS.md for examples of each rule.
Before submitting code:
Converted and distributed by TomeVault — claim your Tome and manage your conversions.