← Назад к вопросам

Какие знаешь практики хорошего кода?

2.3 Middle🔥 161 комментариев
#Архитектура и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Практики хорошего кода в JavaScript и Frontend

Хороший код — это не только код, который работает, но и код, который легко читать, поддерживать и масштабировать. Рассмотрим ключевые практики.

1. KISS — Keep It Simple, Stupid

Пишите простой код, избегайте излишней сложности:

// Плохо — переусложнено
const getValue = (obj) => 
  Object.keys(obj).reduce((acc, key) => 
    acc[key] = obj[key] ? obj[key] : null, {});

// Хорошо — просто и понятно
const getValue = (obj) => obj || null;

2. DRY — Don't Repeat Yourself

Не дублируйте код, выносите повторяющуюся логику в функции:

// Плохо — дублирование
const validateEmail = (email) => email.includes('@');
const validateUsername = (username) => username.includes('@'); // копия!

// Хорошо — общая функция
const contains = (str, char) => str.includes(char);
const validateEmail = (email) => contains(email, '@');

3. SOLID принципы

S — Single Responsibility (одна ответственность)

// Плохо — функция делает слишком много
function processUser(data) {
  validate(data);
  transform(data);
  save(data);
  sendEmail(data);
  log(data);
}

// Хорошо — разделяем ответственность
function validateUser(data) { /* ... */ }
function transformUser(data) { /* ... */ }
function saveUser(data) { /* ... */ }

O — Open/Closed (открыта для расширения, закрыта для модификации)

// Плохо — нужно менять функцию при добавлении типа
function process(type, data) {
  if (type === 'json') return JSON.stringify(data);
  if (type === 'csv') return toCSV(data);
  if (type === 'xml') return toXML(data);
}

// Хорошо — расширяемо через стратегии
const formatters = {
  json: (data) => JSON.stringify(data),
  csv: (data) => toCSV(data),
  xml: (data) => toXML(data)
};

function process(type, data) {
  return formatters[type](data);
}

4. Именование

Используйте понятные имена переменных и функций:

// Плохо
const d = new Date();
const arr = data.filter(x => x.status === 'active');
function p(u) { /* ... */ }

// Хорошо
const currentDate = new Date();
const activeUsers = data.filter(user => user.status === 'active');
function processUser(user) { /* ... */ }

5. Чистые функции (Pure Functions)

Функции без побочных эффектов:

// Плохо — побочный эффект (изменяет глобальное состояние)
let total = 0;
function addToTotal(num) {
  total += num; // побочный эффект!
  return total;
}

// Хорошо — чистая функция
function add(a, b) {
  return a + b; // нет побочных эффектов
}

6. Избегайте магических чисел

// Плохо
if (user.age > 18) { /* ... */ }
const discount = price * 0.15;

// Хорошо
const LEGAL_AGE = 18;
const DISCOUNT_RATE = 0.15;

if (user.age > LEGAL_AGE) { /* ... */ }
const discount = price * DISCOUNT_RATE;

7. Обработка ошибок

// Плохо — игнорируем ошибки
function fetchData() {
  return fetch('/api/data').then(r => r.json());
}

// Хорошо — обрабатываем ошибки
async function fetchData() {
  try {
    const response = await fetch('/api/data');
    if (!response.ok) throw new Error(`HTTP ${response.status}`);
    return await response.json();
  } catch (error) {
    console.error('Ошибка загрузки:', error);
    throw error; // пробрасываем выше
  }
}

8. Избегайте callback hell (Pyramid of Doom)

// Плохо — callback hell
function process(data) {
  validate(data, function(err) {
    if (!err) {
      transform(data, function(err, result) {
        if (!err) {
          save(result, function(err) {
            if (!err) console.log('Готово');
          });
        }
      });
    }
  });
}

// Хорошо — async/await
async function process(data) {
  await validate(data);
  const result = await transform(data);
  await save(result);
  console.log('Готово');
}

9. Документирование

// Плохо — нет документации
function calc(a, b, c) {
  return a * b + c;
}

// Хорошо — JSDoc
/**
 * Вычисляет стоимость товара с налогом
 * @param {number} price - Базовая цена
 * @param {number} taxRate - Налоговая ставка (0.1 = 10%)
 * @param {number} discount - Скидка в абсолютных числах
 * @returns {number} Итоговая стоимость
 */
function calculateTotal(price, taxRate, discount) {
  return (price * (1 + taxRate)) - discount;
}

10. Performance

// Плохо — повторяющиеся вычисления
for (let i = 0; i < array.length; i++) {
  const value = expensiveComputation(array[i]);
}

// Хорошо — кэширование
const length = array.length;
for (let i = 0; i < length; i++) {
  const value = expensiveComputation(array[i]);
}

// Для React — useMemo
const memoized = useMemo(() => expensiveComputation(data), [data]);

11. Типизация

// Плохо — без типов
function greet(user) {
  return `Hello, ${user.name}`;
}

// Хорошо — TypeScript
interface User {
  name: string;
  age: number;
}

function greet(user: User): string {
  return `Hello, ${user.name}`;
}

12. Тестирование

// Хороший код тестируется
function add(a, b) {
  if (typeof a !== 'number' || typeof b !== 'number') {
    throw new Error('Arguments must be numbers');
  }
  return a + b;
}

// Тесты
describe('add', () => {
  test('should add two numbers', () => {
    expect(add(2, 3)).toBe(5);
  });
  
  test('should throw for non-numbers', () => {
    expect(() => add('a', 'b')).toThrow();
  });
});

Итоговый набор практик

  • Пишите просто и понятно (KISS)
  • Не повторяйте код (DRY)
  • Следуйте SOLID принципам
  • Используйте понятные имена
  • Пишите чистые функции
  • Обрабатывайте ошибки
  • Избегайте callback hell
  • Документируйте код
  • Оптимизируйте производительность
  • Используйте TypeScript
  • Тестируйте код

Хороший код — это долгосрочная инвестиция в качество проекта!

Какие знаешь практики хорошего кода? | PrepBro