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, и вы увидите,