68 lines
2.9 KiB
Markdown
68 lines
2.9 KiB
Markdown
---
|
|
name: clean-code
|
|
description: Apply clean code principles, SOLID, and DRY practices. Use when writing, reviewing, or refactoring application code.
|
|
---
|
|
|
|
# Clean Code Guidelines
|
|
|
|
## 🎯 Purpose
|
|
Provide strict boundaries for coding style ensuring clean, maintainable, single-responsibility, and readable architecture.
|
|
|
|
**🚨 CRITICAL: If the task involves deep refactoring, architectural reviews, or you need to understand the 'Newspaper Readability', 'Declarative Layers' or formatting nuances, YOU MUST use the `read_file` tool to read `.ai/skills/clean-code/REFERENCE.md` BEFORE generating any code.**
|
|
|
|
## 🚨 Prohibitions (Thou Shalt Not)
|
|
|
|
- **NEVER write functions that do more than one thing.** If you can extract a meaningful function, do it.
|
|
- **NEVER mix levels of abstraction in one function.** High-level orchestration and low-level math/DB calls do not belong together (SLAB principle).
|
|
- **NEVER use flag arguments** (e.g., `delete(file, true)`). Split into two functions.
|
|
- **NEVER write functions with side effects** that don't match the name.
|
|
- **NEVER leave commented-out code or TODOs.** Delete them.
|
|
- **NEVER write comments that explain "what" the code does.** Comments are ONLY for explaining "why" (bugs, quirks, external constraints).
|
|
- **NEVER use unbraced `if`, `for`, or `while` statements.** Always use `{}` even for single lines.
|
|
|
|
## Workflows (Quality Checklist)
|
|
|
|
When returning code, actively verify:
|
|
1. **Naming:** Does the name reveal intent (`daysSinceLastPayment` vs `d`), is it searchable, and does it use a consistent vocabulary?
|
|
2. **Abstractions (SLAB):** Does the top-level function read declaratively (describing intent without loops or string parsing)? Are the mechanics hidden in bottom-layer imperative functions?
|
|
3. **Guard Clauses:** Are error cases and edge conditions returned early at the top of the function to avoid deep nesting?
|
|
4. **Formatting:** Are related declarations close together? Is there no "optical illusion" (like an unbraced `if` followed by misleading indentation)?
|
|
|
|
## ✅ / ❌ Examples
|
|
|
|
### Single Level of Abstraction (SLAB)
|
|
```typescript
|
|
// ❌ FORBIDDEN: Mixed levels of high-level policy and low-level mutation
|
|
function processOrder(order: Order): void {
|
|
if (order.total < 100) { // high-level policy
|
|
const discount = order.total * 0.1; // low-level calc
|
|
order.total -= discount; // mutation
|
|
}
|
|
}
|
|
|
|
// ✅ REQUIRED: One level of abstraction per function
|
|
function processOrder(order: Order): void {
|
|
const validated = validateOrder(order);
|
|
const discounted = applyDiscount(validated);
|
|
saveOrder(discounted);
|
|
}
|
|
```
|
|
|
|
### Guard Clauses
|
|
```typescript
|
|
// ❌ FORBIDDEN: Deeply nested happy path
|
|
function handleUser(user: User): void {
|
|
if (user != null) {
|
|
if (user.isActive) {
|
|
process(user);
|
|
}
|
|
}
|
|
}
|
|
|
|
// ✅ REQUIRED: Return early
|
|
function handleUser(user: User): void {
|
|
if (user == null || !user.isActive) return;
|
|
process(user);
|
|
}
|
|
```
|