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)