⚡ Чистый Код
Основы написания понятного и поддерживаемого кода
"Чистый код всегда выглядит так, будто его написал человек, которому не всё равно."
Принципы Чистого Кода
🎯 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)
- Константы лучше магических чисел
- Избегай глобальных переменных
- Код должен быть предсказуемым