Хорошим кодом можно назвать такой, который работает без ошибок. Но как определить, что код не просто хороший, а действительно классный? Для этого можно пройти по нашему чек-листу характеристик. Он подходит для любого языка программирования и для кода любой сложности.
Его легко отлаживать
Отлаживаемый код — это понятный и последовательный код. Он легко читается и имеет логичную структуру, его легко понимать, менять и масштабировать.
Вот как это можно сделать:
- Используйте осмысленные имена для переменных, функций, классов и файлов. Например, вместо х назовите функцию как-то более понятно, например userAge или productPrice. Это поможет вам и другим понять, что именно делает код и как он работает. А ещё это облегчает поиск и исправление ошибок.
- Следуйте стандартам, принятым в вашем языке программирования. Эти рекомендации определяют, как писать, форматировать и организовывать код, например как ставить отступы и интервалы. Они помогают поддерживать согласованность, читаемость и качество кода, а также облегчают работу в команде, поскольку все участники используют общий стиль и структуру.
- Используйте контроль версий. Это система, которая отслеживает изменения и историю вашего кода и управляет ими. Она помогает создавать резервные копии, восстанавливать и сравнивать код.
В нём есть логгер
Вы можете подключить отладчик и пошагово выполнять код, но на практике чаще всего всё будет работать по-другому. Код может выполняться где-то ещё, быть бессерверным, многопоточным или распределённым или вообще работать в облаке. И тогда поведение кода может отличаться от того, что вы видите на своём компьютере.
Чтобы выявлять, что пошло не так, нужно регистрировать ошибки. Для этого понадобится вести лог, а это значит, что вам нужна структура логирования. Нужно настроить ведение лога таким образом, чтобы он был читабельным сам по себе или с помощью какой-то программы для чтения логов. Если не сделать этого заранее, придётся добавлять логирование к боевой версии кода, а это та ещё задача.
Код легко протестировать
Тестируемый код разбит на понятные функции, которые выполняют простые проверяемые действия. Протестированный код работает лучше и более стабильно. Если у вас есть устаревший код, в котором нет тестов, пишите их по мере изменения этого кода.
Всё предсказуемо
Предсказуемый код — это такой код, который после многократного выполнения одной и той же операции даёт один и тот же результат. Например, если пользователь обновляет страницу товара, который уже добавлен в корзину, это не должно приводить к тому, что в корзине оказывается два заказа этого товара.
Создание такого кода обеспечивает предсказуемое поведение веб-страницы, приложения или программы. Вот как можно этого добиться:
- Используйте переменные для хранения результатов вычислений или операций. Это позволит избежать повторных вычислений и улучшит производительность кода.
- Если возможно, используйте циклы для многократного выполнения операций. Так не будет дублирования кода, и он будет более читаемым.
- Избегайте использования рекурсии для выполнения повторяющихся операций, чтобы не столкнуться с переполнением стека.
- Старайтесь использовать встроенные функции и методы, которые уже реализованы в библиотеках или фреймворках. Это поможет сэкономить время и избежать ошибок.
- Тестируйте свой код, чтобы убедиться, что всё работает как нужно.
Легко понять, что делает код, не запуская программу
По-настоящему классный код таков, что его может прочитать и человек, не запуская при этом сам код. Вот как этого добиться:
- используйте комментарии. Они должны быть подробными и объяснять, что делает каждая строка кода;
- называйте переменные и функции понятно. Используйте осмысленные имена, которые отражают их назначение;
- разбивайте код на логические блоки. Это поможет упростить его понимание и улучшить читаемость;
- используйте отступы и форматирование.
Есть документация
Хороший код сопровождается понятной и актуальной документацией, которая описывает все функции, методы и классы, а также их параметры и возвращаемые значения. По мере изменения кода документация к нему тоже должна обновляться.
В идеальном случае код должен самодокументироваться. Для этого можно использовать инструменты автоматического создания документации:
- Python: Sphinx, Pydoc;
- JavaScript: JSDoc, Dox;
- Java: Javadoc, Doxygen;
- C++: Doxygen, Sphinx.
Всё состоит из отдельных модулей
Если код модульный, его легко разбивать на логические части, которые можно запускать и изменять независимо от других фрагментов.
Чтобы у вас получался модульный код, попробуйте делать так:
- Используйте принцип разделения ответственности. Каждый логический фрагмент кода должен выполнять одну конкретную функцию и не зависеть от других фрагментов.
- Разделяйте данные и логику. Данные должны храниться в одном месте, а логика должна быть реализована в другом.
- Используйте абстракции. Это позволит скрыть детали реализации и предоставить пользователю только необходимую информацию.
- Тестируйте каждый логический фрагмент кода отдельно, чтобы убедиться, что все фрагменты работают корректно.
- Проводите рефакторинг по мере необходимости — это улучшит структуру кода и сделает его более понятным.
Его можно собрать и запустить :-)
Если ваш код запускается без ошибок из готовой сборки, выложенной, например, на GitHub или в другом репозитории, то он великолепен. Если же для запуска вашего кода требуется время, то сборка требует доработки. Представьте, что в команду пришёл новый разработчик, ему выдали компьютер, и теперь ему нужно запустить ваш код у себя. Если же вам кажется, что немного повозиться со сборкой — не проблема, представьте, что это происходит во время релиза или исправлений кода. Или в пятницу вечером перед деплоем :-)