Clean Code на JavaScript: принципы написания чистого кода

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Clean Code на JavaScript: принципы и примеры

Чистый код (Clean Code) — это не просто модный термин, а фундаментальный подход к разработке, который делает программу понятной, легко поддерживаемой и расширяемой. В мире JavaScript и Node.js, где проекты быстро растут и требуют частых изменений, принципы Clean Code становятся особенно важными. В этой статье мы разберем ключевые практики написания чистого кода на JavaScript с конкретными примерами, которые помогут вам улучшить качество ваших проектов.

1. Правильное именование переменных и функций

Имя переменной или функции должно отвечать на вопросы "что это?" и "что оно делает?". Избегайте однобуквенных имен (кроме счетчиков циклов) и сокращений, которые неочевидны.

Плохой пример:

const d = new Date();
const a = [];
const fn = (x, y) => x + y;

Хороший пример:

const currentDate = new Date();
const userList = [];
const calculateSum = (firstNumber, secondNumber) => firstNumber + secondNumber;

Правила именования:

  • Используйте camelCase для переменных и функций.
  • Для булевых значений применяйте префиксы: is, has, should (например, isActive, hasPermission).
  • Функции называйте глаголами: getUser, sendEmail, validateInput.
  • Избегайте сокращений: usr → user, conf → configuration.

2. Маленькие и однозадачные функции

Каждая функция должна выполнять ровно одну задачу. Если функция делает больше одного действия, ее нужно разбить на несколько. Это улучшает читаемость и тестируемость.

Плохой пример (функция делает 3 дела сразу):

function processUserData(user) {
  // Валидация
  if (!user.email || !user.password) {
    throw new Error('Invalid data');
  }
  // Форматирование
  const formattedUser = {
    email: user.email.toLowerCase(),
    password: hashPassword(user.password)
  };
  // Сохранение в БД
  db.save(formattedUser);
  return formattedUser;
}

Хороший пример (разделение на отдельные функции):

function validateUserInput(user) {
  if (!user.email || !user.password) {
    throw new Error('Email and password are required');
  }
}

function formatUserData(user) {
  return {
    email: user.email.toLowerCase(),
    password: hashPassword(user.password)
  };
}

function saveUserToDatabase(user) {
  return db.save(user);
}

function processUserData(user) {
  validateUserInput(user);
  const formattedUser = formatUserData(user);
  return saveUserToDatabase(formattedUser);
}

Такой подход делает код самодокументируемым и упрощает поиск ошибок.

3. Обработка ошибок и граничные случаи

Чистый код обязательно включает обработку ошибок и предусматривает граничные случаи. Не оставляйте места для неожиданных сбоев.

Плохой пример (нет обработки ошибок):

function getUserAge(user) {
  return user.age; // Если user или user.age undefined — ошибка
}

Хороший пример (с защитой):

function getUserAge(user) {
  if (!user || typeof user.age !== 'number') {
    return null; // или throw new Error('Invalid user data')
  }
  return user.age;
}

Принципы обработки ошибок:

  • Используйте try/catch для асинхронных операций (особенно в Node.js).
  • Создавайте собственные классы ошибок для разных ситуаций.
  • Не глотайте ошибки молча — логируйте их или пробрасывайте дальше.
class ValidationError extends Error {
  constructor(message) {
    super(message);
    this.name = 'ValidationError';
  }
}

async function fetchUserData(userId) {
  try {
    const response = await api.get(`/users/${userId}`);
    if (!response.data) {
      throw new ValidationError('User not found');
    }
    return response.data;
  } catch (error) {
    if (error instanceof ValidationError) {
      console.warn('Validation failed:', error.message);
    } else {
      console.error('API error:', error);
      throw error; // Пробрасываем дальше
    }
  }
}

4. Избегайте дублирования и магических чисел

Дублирование кода — главный враг чистоты. Каждый раз, когда вы копируете код, вы увеличиваете риск ошибок и усложняете поддержку. Используйте константы и утилитарные функции.

Плохой пример (магические числа и дублирование):

function calculateDiscount(price) {
  if (price > 100) {
    return price * 0.9; // 10% скидка
  }
  return price;
}

function applyPromotion(price) {
  if (price > 100) {
    return price * 0.9; // То же самое условие и формула
  }
  return price - 5;
}

Хороший пример (константы и DRY):

const DISCOUNT_THRESHOLD = 100;
const DISCOUNT_RATE = 0.9; // 10% скидка

function calculateDiscount(price) {
  return price > DISCOUNT_THRESHOLD ? price * DISCOUNT_RATE : price;
}

function applyPromotion(price) {
  const discountedPrice = calculateDiscount(price);
  return price > DISCOUNT_THRESHOLD ? discountedPrice : price - 5;
}

Дополнительный совет: Выносите повторяющиеся логические блоки в отдельные функции или модули. Например, если вы часто проверяете, является ли значение числом, создайте функцию isValidNumber.

Заключение

Clean Code на JavaScript — это не набор строгих правил, а философия, которая делает вашу работу проще и эффективнее. Начните с малого: улучшайте именование, разбивайте большие функции, обрабатывайте ошибки и избегайте дублирования. Со временем эти принципы войдут в привычку, и вы заметите, как код становится более читаемым, а отладка — менее болезненной.

Помните, что чистый код пишется для людей, а не для машин. Инвестируйте время в качество кода сейчас, чтобы сэкономить его в будущем. Применяйте описанные практики в своих проектах на Node.js, и вы увидите,

Блоги

Рекомендаций по книгам