← 返回
AI智能

Clean Code

Pragmatic coding standards for writing clean, maintainable code — naming, functions, structure, anti-patterns, and pre-edit safety checks. Use when writing new code, refactoring existing code, reviewing code quality, or establishing coding standards.
务实的编码规范,编写简洁、可维护的代码——命名、函数、结构、反模式及编辑前安全检查。适用于编写新代码、重构现有代码、审查代码质量或制定编码规范。
wpank
AI智能 clawhub v1.0.0 1 版本 97735.7 Key: 无需
★ 8
Stars
📥 6,142
下载
💾 690
安装
1
版本
#latest

概述

Clean Code

> Be concise, direct, and solution-focused. Clean code reads like well-written prose — every name reveals intent, every function does one thing, and every abstraction earns its place.

Installation

OpenClaw / Moltbot / Clawbot

npx clawhub@latest install clean-code

Core Principles

PrincipleRulePractical Test
---------------------------------
SRPSingle Responsibility — each function/class does ONE thing"Can I describe what this does without using 'and'?"
DRYDon't Repeat Yourself — extract duplicates, reuse"Have I written this logic before?"
KISSKeep It Simple — simplest solution that works"Is there a simpler way to achieve this?"
YAGNIYou Aren't Gonna Need It — don't build unused features"Does anyone need this right now?"
Boy ScoutLeave code cleaner than you found it"Is this file better after my change?"

Naming Rules

Names are the most important documentation. A good name eliminates the need for a comment.

ElementConventionBadGood
--------------------------------
VariablesReveal intentn, d, tmpuserCount, elapsed, activeUsers
FunctionsVerb + nounuser(), calc()getUserById(), calculateTotal()
BooleansQuestion formactive, flagisActive, hasPermission, canEdit
ConstantsSCREAMING_SNAKEmax, timeoutMAX_RETRY_COUNT, REQUEST_TIMEOUT_MS
ClassesNoun, singularManager, DataUserRepository, OrderService
EnumsPascalCase values'pending' stringStatus.Pending

> Rule: If you need a comment to explain a name, rename it.

Naming Anti-Patterns

Anti-PatternProblemFix
----------------------------
Cryptic abbreviations (usrMgr, cfg)Unreadable in 6 monthsSpell it out — IDE autocomplete makes long names free
Generic names (data, info, item, handler)Says nothing about purposeUse domain-specific names that reveal intent
Misleading names (getUserList returns one user)Actively deceives readersMatch name to behavior, or change the behavior
Hungarian notation (strName, nCount, IUser)Redundant with type systemLet TypeScript/IDE show types; names describe purpose

Function Rules

RuleGuidelineWhy
----------------------
SmallMax 20 lines, ideally 5-10Fits in your head
One ThingDoes one thing, does it wellTestable and nameable
One LevelOne level of abstraction per functionReadable top to bottom
Few ArgsMax 3 arguments, prefer 0-2Easy to call correctly
No Side EffectsDon't mutate inputs unexpectedlyPredictable behavior

Guard Clauses

Flatten nested conditionals with early returns. Never nest deeper than 2 levels.

// BAD — 5 levels deep
function processOrder(order: Order) {
  if (order) {
    if (order.items.length > 0) {
      if (order.customer) {
        if (order.customer.isVerified) {
          return submitOrder(order);
        }
      }
    }
  }
  throw new Error('Invalid order');
}

// GOOD — guard clauses flatten the structure
function processOrder(order: Order) {
  if (!order) throw new Error('No order');
  if (!order.items.length) throw new Error('No items');
  if (!order.customer) throw new Error('No customer');
  if (!order.customer.isVerified) throw new Error('Customer not verified');

  return submitOrder(order);
}

Parameter Objects

When a function needs more than 3 arguments, use an options object.

// BAD — too many parameters, order matters
createUser('John', 'Doe', 'john@example.com', 'secret', 'admin', 'Engineering');

// GOOD — self-documenting options object
createUser({
  firstName: 'John',
  lastName: 'Doe',
  email: 'john@example.com',
  password: 'secret',
  role: 'admin',
  department: 'Engineering',
});

Code Structure Patterns

PatternWhen to ApplyBenefit
--------------------------------
Guard ClausesEdge cases at function startFlat, readable flow
Flat > NestedAny nesting beyond 2 levelsReduced cognitive load
CompositionComplex operationsSmall, testable pieces
ColocationRelated code across filesEasier to find and change
Extract FunctionComments separating "sections"Self-documenting code

Composition Over God Functions

// BAD — god function doing everything
async function processOrder(order: Order) {
  // Validate... (15 lines)
  // Calculate totals... (15 lines)
  // Process payment... (10 lines)
  // Send notifications... (10 lines)
  // Update inventory... (10 lines)
  return { success: true };
}

// GOOD — composed of small, focused functions
async function processOrder(order: Order) {
  validateOrder(order);
  const totals = calculateOrderTotals(order);
  const payment = await processPayment(order.customer, totals);
  await sendOrderConfirmation(order, payment);
  await updateInventory(order.items);
  return { success: true, orderId: payment.orderId };
}

Return Type Consistency

Functions should return consistent types. Use discriminated unions for multiple outcomes.

// BAD — returns different types
function getUser(id: string) {
  const user = database.find(id);
  if (!user) return false;     // boolean
  if (user.isDeleted) return null; // null
  return user;                 // User
}

// GOOD — discriminated union
type GetUserResult =
  | { status: 'found'; user: User }
  | { status: 'not_found' }
  | { status: 'deleted' };

function getUser(id: string): GetUserResult {
  const user = database.find(id);
  if (!user) return { status: 'not_found' };
  if (user.isDeleted) return { status: 'deleted' };
  return { status: 'found', user };
}

Anti-Patterns

Anti-PatternProblemFix
----------------------------
Comment every lineNoise obscures signalDelete obvious comments; comment why, not what
Helper for one-linerUnnecessary indirectionInline the code
Factory for 2 objectsOver-engineeringDirect instantiation
utils.ts with 1 functionJunk drawer filePut code where it's used
Deep nestingUnreadable flowGuard clauses and early returns
Magic numbersUnclear intentNamed constants
God functionsUntestable, unreadableSplit by responsibility
Commented-out codeDead code confusionDelete it; git remembers
TODO sprawlNever gets doneTrack in issue tracker, not code
Premature abstractionWrong abstraction is worse than noneWait for 3+ duplicates before abstracting
Copy-paste programmingDuplicated bugsExtract shared logic
Exception-driven control flowSlow and confusingUse explicit conditionals
Stringly-typed codeTypos and missed casesUse enums or union types
Callback hellPyramid of doomUse async/await

Pre-Edit Safety Check

Before changing any file, answer these questions to avoid cascading breakage:

QuestionWhy
---------------
What imports this file?Dependents might break on interface changes
What does this file import?You might need to update the contract
What tests cover this?Tests might fail — update them alongside code
Is this a shared component?Multiple consumers means wider blast radius
File to edit: UserService.ts
├── Who imports this? → UserController.ts, AuthController.ts
├── Do they need changes too? → Check function signatures
└── What tests cover this? → UserService.test.ts

> Rule: Edit the file + all dependent files in the SAME task. Never leave broken imports or missing updates.


Self-Check Before Completing

Before marking any task complete, verify:

CheckQuestion
-----------------
Goal met?Did I do exactly what was asked?
Files edited?Did I modify all necessary files, including dependents?
Code works?Did I verify the change compiles and runs?
No errors?Do lint and type checks pass?
Nothing forgotten?Any edge cases or dependent files missed?

NEVER Do

  1. NEVER add comments that restate the code — if the code needs a comment to explain what it does, rename things until it doesn't
  2. NEVER create abstractions for fewer than 3 use cases — premature abstraction is worse than duplication
  3. NEVER leave commented-out code in the codebase — delete it; version control exists for history
  4. NEVER write functions longer than 20 lines — extract sub-functions until each does one thing
  5. NEVER nest deeper than 2 levels — use guard clauses, early returns, or extract functions
  6. NEVER use magic numbers or strings — define named constants with clear semantics
  7. NEVER edit a file without checking what depends on it — broken imports and missing updates are the most common source of bugs in multi-file changes
  8. NEVER leave a task with failing lint or type checks — fix all errors before marking complete

References

Detailed guides for specific clean code topics:

ReferenceDescription
------------------------
Anti-Patterns21 common mistakes with bad/good code examples across naming, functions, structure, and comments
Code SmellsClassic code smells catalog with detection patterns — Bloaters, OO Abusers, Change Preventers, Dispensables, Couplers
Refactoring CatalogEssential refactoring patterns with before/after examples and step-by-step mechanics

版本历史

共 1 个版本

  • v1.0.0 当前
    2026-03-28 11:05 安全 安全

安全检测

腾讯云安全 (Keen)

安全,无风险
查看报告

腾讯云安全 (Sanbu)

安全,无风险
查看报告

🔗 相关推荐

ai-intelligence

Self-Improving + Proactive Agent

ivangdavila
自我反思+自我批评+自我学习+自组织记忆。智能体评估自身工作、发现错误并持续改进。
★ 1,349 📥 317,693
developer-tools

Code Review

wpank
涵盖安全、性能、可维护性、正确性和测试的系统化代码审查模式,包含严重等级、结构化反馈指南、审查流程及需避免的反模式。适用于审查 PR、建立审查标准或提升审查质量。
★ 31 📥 17,065
ai-intelligence

ontology

oswalpalash
类型化知识图谱,用于结构化智能体记忆与可组合技能。支持创建/查询实体(人员、项目、任务、事件、文档)及关联...
★ 709 📥 243,524