Принципы Clean Code
Clean Code не самоцель, а фундамент ПО, которое можно поддерживать и развивать на протяжении многих лет. В этой статье разберём ключевые принципы с примерами из практики.
Материал дополняет статью clean-code-solid-принципы.mdx.
Суть в двух словах
Clean Code значит писать код так, чтобы другие разработчики быстро поняли его, переработали и расширили. Основные идеи: выразительные имена, компактные функции, DRY, KISS, YAGNI.
Краткое описание
Clean Code — подход к разработке ПО, который ставит читаемость, поддерживаемость и расширяемость на первое место. Концепция, сформулированная Robert C. Martin, охватывает принципы вроде понятного именования, коротких функций с одной зоной ответственности, избегания дублирования, простоты и постоянного рефакторинга.
Основные принципы
1. Выразительные имена
// Плохо
const d = 2;
const arr = getUsers();
// Хорошо
const DAYS_IN_WEEK = 7;
const activeUsers = users.filter(u => u.isActive);
2. Компактные функции
Функции должны быть маленькими и делать ровно одно.
// Плохо: делает слишком много
function processUser(user) {
user.email = user.email.toLowerCase();
user.name = user.name.trim();
saveToDatabase(user);
sendWelcomeEmail(user);
}
// Хорошо: разбито по задачам
function normalizeUser(user) {
return { ...user, email: user.email.toLowerCase(), name: user.name.trim() };
}
async function registerUser(user) {
const normalized = normalizeUser(user);
await saveToDatabase(normalized);
await sendWelcomeEmail(normalized);
}
3. DRY (Don’t Repeat Yourself)
// Плохо: НДС продублирован
function calculateTotal(items) {
return items.reduce((s, i) => s + i.price * i.qty * 1.19, 0);
}
// Хорошо: центральная константа
const VAT_RATE = 1.19;
function calculateTotal(items) {
return items.reduce((s, i) => s + i.price * i.qty * VAT_RATE, 0);
}
4. KISS (Keep It Simple)
// Плохо: чрезмерная абстракция
class UserProcessor {
constructor(strategy) { this.strategy = strategy; }
process(user) { return this.strategy.execute(user); }
}
// Хорошо: просто
function normalizeEmail(user) {
return { ...user, email: user.email.toLowerCase() };
}
5. YAGNI (You Aren’t Gonna Need It)
Реализуй только то, что нужно прямо сейчас.
Дополнительные принципы
Boy Scout Rule
Оставляй код чище, чем ты его нашёл.
Command-Query Separation
Функция либо выполняет действие (Command), либо возвращает значение (Query), но не оба сразу.
Обработка ошибок
// Плохо: ошибка скрыта
function getData() {
try { return fetchFromAPI(); }
catch (e) { return null; }
}
// Хорошо: ошибка залогирована и переброшена
async function getData() {
try { return await fetchFromAPI(); }
catch (error) {
logger.error('API fetch failed', error);
throw new Error('Дані не вдалося завантажити');
}
}
Clean Code - Refactoring, Patterns, Testen und Techniken für sauberen Code: Deutsche Ausgabe
39,99 €
Bei Amazon ansehenAffiliate-Link: Bei einem Kauf erhalten wir möglicherweise eine Provision.
Clean Code für Dummies: Besser programmieren. Professionelle Softwareentwicklung.
24,99 €
Bei Amazon ansehenAffiliate-Link: Bei einem Kauf erhalten wir möglicherweise eine Provision.
Besser coden: Best Practices für Clean Code. Das ideale Buch für die professionelle Softwareentwicklung
34,99 €
Bei Amazon ansehenAffiliate-Link: Bei einem Kauf erhalten wir möglicherweise eine Provision.
Запахи кода
| Запах | Описание | Решение |
|---|---|---|
| Long Method | Функция более 30 строк | Разбить на части |
| Large Class | Класс более 200 строк | Разделить ответственность |
| Duplicate Code | Одинаковая логика в разных местах | Извлечь в общий метод |
| Long Parameter List | Более 4 параметров | Параметр-объект |
| Deep Nesting | Более 3 уровней вложенности | Early Return, Guard Clauses |
| Dead Code | Код, который никогда не выполняется | Удалить |
| Magic Numbers | Неименованные константы | Назвать константы |
Практический пример: рефакторинг
// Было: неразборчиво, делает слишком много
function calc(o, c, d) {
let r = 0;
for (let i = 0; i < o.length; i++) {
if (o[i].t == 'premium') r += o[i].p * 0.8;
else if (o[i].t == 'vip') r += o[i].p * 0.7;
else r += o[i].p;
}
if (d) r = r * 0.9;
return r * 1.19;
}
// Стало: Clean Code
const VAT_RATE = 1.19;
const DISCOUNT_MAP = { premium: 0.8, vip: 0.7, standard: 1.0 };
function applyDiscount(price, customerType) {
const factor = DISCOUNT_MAP[customerType] ?? 1.0;
return price * factor;
}
function calculateOrderTotal(orders, hasCoupon = false) {
const subtotal = orders.reduce(
(sum, order) => sum + applyDiscount(order.price, order.type), 0
);
const afterCoupon = hasCoupon ? subtotal * 0.9 : subtotal;
return afterCoupon * VAT_RATE;
}
Ключевые тезисы для подготовки
- DRY, KISS, YAGNI как основные принципы
- Выразительное именование как главная документация
- Функции: одна зона ответственности, максимум 20-30 строк
- Boy Scout Rule: оставлять код чище, чем ты его нашёл
- Command-Query Separation
- Распознавать запахи кода и их устранять
- Рефакторинг как непрерывный процесс
FAQ
1. Что означает DRY?
2. Что означает KISS?
3. Что означает YAGNI?
4. Какой должна быть длина функции?
5. Что такое Boy Scout Rule?
6. Что такое Command-Query Separation?
7. Что такое Magic Numbers?
8. Что такое Code Smell?
9. Кто сформулировал концепцию Clean Code?
10. Что такое Deep Nesting?
11. Нужны ли комментарии в коде?
12. Что такое Dead Code?
13. Что такое Long Parameter List?
14. Что такое рефакторинг?
15. Почему Clean Code важен?
Если ещё остались вопросы, посмотри clean-code-solid-принципы.mdx.
Далее в учебном плане “Качество ПО”
Следующая статья в этом маршруте — Основы SOLID принципов, в которой разберём пять принципов объектно-ориентированного проектирования: SRP, OCP, LSP, ISP и DIP.
Источники
- https://www.oreilly.com/library/view/clean-code/9780134661742/
- https://clean-code-developer.com/
- https://refactoring.com/
Рекомендуемые книги по качеству ПО
Если хочешь глубже разобраться в Clean Code, качестве ПО и рефакторинге, рекомендуем эти книги:
Keine Bücher für Kategorie "software-engineering" gefunden.






