⚡ Чистый Код

Основы написания понятного и поддерживаемого кода

"Чистый код всегда выглядит так, будто его написал человек, которому не всё равно." — Роберт Мартин

Принципы Чистого Кода

🎯 1. Осмысленные Имена

Имена переменных, функций и классов должны отвечать на три важных вопроса: зачем существует, что делает и как используется.

❌ Плохо
function calc(a, b) {
    return a + b * 0.2;
}

let d = new Date();
let x = calc(1000, 5);
✅ Хорошо
function calculateTotalWithTax(price, quantity) {
    const TAX_RATE = 0.2;
    return price + quantity * TAX_RATE;
}

let currentDate = new Date();
let totalPrice = calculateTotalWithTax(1000, 5);

📏 2. Функции Должны Быть Маленькими

Функция должна делать одну вещь, делать её хорошо и делать только её. Идеальная функция — 5-15 строк кода.

❌ Плохо
function processUser(user) {
    // Validation
    if (!user.email) return false;
    if (!user.name) return false;
    
    // Save to database
    db.save(user);
    
    // Send email
    sendEmail(user.email, "Welcome!");
    
    // Log
    console.log(`User ${user.name} created`);
    
    return true;
}
✅ Хорошо
function validateUser(user) {
    return user.email && user.name;
}

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

function sendWelcomeEmail(email) {
    sendEmail(email, "Welcome!");
}

function logUserCreation(userName) {
    console.log(`User ${userName} created`);
}

function processUser(user) {
    if (!validateUser(user)) return false;
    
    saveUser(user);
    sendWelcomeEmail(user.email);
    logUserCreation(user.name);
    
    return true;
}

💬 3. Комментарии — Признак Неудачи

Хороший код должен быть самодокументированным. Используй комментарии только для объяснения "почему", а не "что".

❌ Плохо
// Проверяем, является ли пользователь администратором
if (user.role === 'admin' && user.permissions.includes('write')) {
    // Разрешаем редактирование
    allowEdit = true;
}
✅ Хорошо
function isAdminWithWriteAccess(user) {
    return user.role === 'admin' && 
           user.permissions.includes('write');
}

if (isAdminWithWriteAccess(user)) {
    allowEdit = true;
}

🔄 4. DRY — Don't Repeat Yourself

Каждая часть знания должна иметь единственное, недвусмысленное, авторитетное представление в системе.

❌ Плохо
function getUserFullName(user) {
    return user.firstName + ' ' + user.lastName;
}

function displayUserName(user) {
    console.log(user.firstName + ' ' + user.lastName);
}

function saveUserName(user) {
    db.save(user.firstName + ' ' + user.lastName);
}
✅ Хорошо
function formatFullName(firstName, lastName) {
    return `${firstName} ${lastName}`;
}

function getUserFullName(user) {
    return formatFullName(user.firstName, user.lastName);
}

function displayUserName(user) {
    console.log(getUserFullName(user));
}

function saveUserName(user) {
    db.save(getUserFullName(user));
}

⚠️ 5. Обработка Ошибок

Обрабатывай ошибки явно. Не игнорируй исключения и не возвращай null без необходимости.

❌ Плохо
function getUser(id) {
    try {
        return db.findUser(id);
    } catch (e) {
        return null;
    }
}

const user = getUser(123);
console.log(user.name); // Может упасть!
✅ Хорошо
class UserNotFoundError extends Error {
    constructor(userId) {
        super(`User with id ${userId} not found`);
    }
}

function getUser(id) {
    const user = db.findUser(id);
    if (!user) {
        throw new UserNotFoundError(id);
    }
    return user;
}

try {
    const user = getUser(123);
    console.log(user.name);
} catch (error) {
    if (error instanceof UserNotFoundError) {
        console.error('User not found');
    }
}

💎 Золотые Правила Чистого Кода

  • Код пишется один раз, а читается сотни раз
  • Если код требует комментария, значит его нужно переписать
  • Функция должна быть видна целиком на одном экране
  • Избегай вложенности глубже трёх уровней
  • Используй раннее возвращение (early return)
  • Константы лучше магических чисел
  • Избегай глобальных переменных
  • Код должен быть предсказуемым