Начиная карьеру разработчика ПО, я считал, что буду просто читать и обновлять собственный код. Сегодня просмотр и модификация чужого кода занимает около 80% моей работы.
И именно здесь встает вопрос о чистом коде.
Читабельность — один из основополагающих критериев чистого кода. Представьте, как тяжело поддерживать ПО с хаотичным кодом. Поэтому у меня — разработчика, которому еще многому предстоит научиться, — есть несколько стандартов для поддержания чистоты кода. Один из них заключается в том, чтобы всегда использовать const вместо let в TypeScript.
Почему const, а не let?
Представьте, что вам нужно поддерживать функцию бэкенд-сервиса express.js.
⬇️ Пример сервисной функции
const getUsers = async (): Promise<User[]> => {
let users = await db.findAll...
return users?.data || []
}
Основным назначением сервиса является взаимодействие с базой данных, а также мапирование и фильтрация данных в надлежащую структуру ответа.
❌ Расширение с применением фильтра и средства преобразования с переопределением
const getUsers = async (): Promise<User[]> => {
let users = await db.findAllInDB...
users = users?.data || []
users = users.filter(user => user?.data?.name && user?.data?.id)
users = users.map(user => {
id: user.id,
firstName: user.name.split(' ')[0],
loyaltyPoints: await getUserLoyaltyPoints(user.id)
})
return users
}
На мой взгляд, приведенный выше код совсем не чист. После первоначального определения переменной users происходят 3 обновления. По мере расширения проекта все труднее воспринимается его код. Приходится постоянно читать всю строку и запоминать изменения: users становится users.data, после этого используется filter, затем map и так далее.
Оптимальный способ создания более читабельного кода — всегда переопределять переменные с помощью const и использовать понятные имена.
🚀 Переопределение с помощью const считается хорошей практикой
const getUsers = async (): Promise<User[]> => {
const users = await db.findAllInDB...
const existingUsers = (users?.data || []).filter(
user => user?.data?.name && user?.data?.id
)
const formattedUsers = existingUsers.map(user => {
id: user.id,
firstName: user.name.split(' ')[0],
loyaltyPoints: await getUserLoyaltyPoints(user.id)
})
return formattedUsers
}
Такие шаги делают код более понятным. После извлечения users из базы данных мы определяем existingUsers (то есть существующих пользователей с id и name), а затем возвращаем formattedUsers с firstName и loyaltyPoints.
Еще раз отмечу: чем больше функция или проект, тем сложнее разобраться в коде, если одна переменная многократно перезаписывается.
Читайте также:
- TypeScript: продвинутые типы и их скрытые возможности
- Обзор ReacType
- Самые популярные фреймворки React
Читайте нас в Telegram, VK и Дзен
Перевод статьи Daniel Babinszky: Always choose ‘const’ over ‘let’ in TypeScript





