Начиная карьеру разработчика ПО, я считал, что буду просто читать и обновлять собственный код. Сегодня просмотр и модификация чужого кода занимает около 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