Skip to content
IRC-CodingIRC-Coding
Clean CodeDRYKISSYAGNINamingRefactoringКачество кода

Принципы Clean Code: читаемый и поддерживаемый код

Принципы Clean Code: значащие имена, малые функции, DRY, KISS, YAGNI с примерами на JavaScript и TypeScript.

S

schutzgeist

4 min read
Принципы Clean Code: читаемый и поддерживаемый код

Принципы 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

Clean Code - Refactoring, Patterns, Testen und Techniken für sauberen Code: Deutsche Ausgabe

39,99 €

Bei Amazon ansehen

Affiliate-Link: Bei einem Kauf erhalten wir möglicherweise eine Provision.

Clean Code für Dummies: Besser programmieren. Professionelle Softwareentwicklung.

Clean Code für Dummies: Besser programmieren. Professionelle Softwareentwicklung.

24,99 €

Bei Amazon ansehen

Affiliate-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

Besser coden: Best Practices für Clean Code. Das ideale Buch für die professionelle Softwareentwicklung

34,99 €

Bei Amazon ansehen

Affiliate-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?

Don’t Repeat Yourself. Каждая часть логики должна существовать в единственном месте.

2. Что означает KISS?

Keep It Simple. Простота важнее сложности.

3. Что означает YAGNI?

You Aren’t Gonna Need It. Реализуй только то, что требуется сейчас.

4. Какой должна быть длина функции?

Максимум 20-30 строк, одна зона ответственности.

5. Что такое Boy Scout Rule?

Оставляй код чище, чем ты его нашёл.

6. Что такое Command-Query Separation?

Функция либо выполняет действие, либо возвращает значение, но не оба сразу.

7. Что такое Magic Numbers?

Неименованные числа в коде. Заменяй на именованные константы.

8. Что такое Code Smell?

Признак более глубокой проблемы, например Long Method или Duplication.

9. Кто сформулировал концепцию Clean Code?

Robert C. Martin (Uncle Bob).

10. Что такое Deep Nesting?

Более 3 уровней вложенности. Решение: Early Return и Guard Clauses.

11. Нужны ли комментарии в коде?

Хорошие комментарии объясняют ПОЧЕМУ, а не ЧТО. Код должен быть самообъясняющимся.

12. Что такое Dead Code?

Код, который никогда не выполняется. Удали его.

13. Что такое Long Parameter List?

Более 4 параметров. Решение: используй параметр-объект.

14. Что такое рефакторинг?

Улучшение структуры кода без изменения поведения. Непрерывный процесс.

15. Почему Clean Code важен?

Код читают намного чаще, чем пишут. Clean Code снижает стоимость поддержки и количество ошибок.

Если ещё остались вопросы, посмотри clean-code-solid-принципы.mdx.

Далее в учебном плане “Качество ПО”

Следующая статья в этом маршруте — Основы SOLID принципов, в которой разберём пять принципов объектно-ориентированного проектирования: SRP, OCP, LSP, ISP и DIP.

Источники

  1. https://www.oreilly.com/library/view/clean-code/9780134661742/
  2. https://clean-code-developer.com/
  3. https://refactoring.com/

Рекомендуемые книги по качеству ПО

Если хочешь глубже разобраться в Clean Code, качестве ПО и рефакторинге, рекомендуем эти книги:

Keine Bücher für Kategorie "software-engineering" gefunden.

Назад к блогу
Share:

Nächster Artikel in Качество программного обеспечения

Weiterlesen
SOLID принципы: SRP, OCP, LSP, ISP и DIP

Похожие статьи