// статья

Чистые функции: принципы написания читаемого кода

Практические правила написания функций, которые легко читать, тестировать и поддерживать. Примеры на JavaScript и TypeScript.

Принцип единственной ответственности

Каждая функция должна делать одну вещь и делать её хорошо:

// Плохо: функция делает слишком много
function processUser(userData: unknown) {
  // валидация
  // сохранение в БД
  // отправка email
  // логирование
}

// Хорошо: разделение ответственности
function validateUser(data: unknown): User { /* ... */ }
function saveUser(user: User): Promise<void> { /* ... */ }
function sendWelcomeEmail(user: User): Promise<void> { /* ... */ }

Чистые функции

Функция считается чистой, если:

  1. При одинаковых аргументах всегда возвращает одинаковый результат
  2. Не имеет побочных эффектов
// Чистая функция
function calculateTotal(prices: number[]): number {
  return prices.reduce((sum, price) => sum + price, 0);
}

// Нечистая функция (зависит от внешнего состояния)
let taxRate = 0.2;
function calculateWithTax(price: number): number {
  return price * (1 + taxRate);
}

Именование

Имя функции должно описывать что она делает:

// Плохо
function process(data: string[]): string[] { /* ... */ }

// Хорошо
function removeDuplicates(items: string[]): string[] { /* ... */ }

Количество аргументов

Идеально — 0-2 аргумента. Если нужно больше — используйте объект:

// Вместо этого
function createUser(name: string, email: string, age: number, role: string) {}

// Лучше так
interface CreateUserOptions {
  name: string;
  email: string;
  age: number;
  role: string;
}
function createUser(options: CreateUserOptions) {}