Найти тему
it - это просто

Как написать качественный и чистый код?

Оглавление

Как сделать так, чтобы наш код понимали другие разработчики и мы сами? Поговорим об этом далее, поехали.

Качество кода – понятие растяжимое и может по-разному интерпретироваться в зависимости от проекта и команды. Но сформулировать его можно следующим способом:

Качество кода — это совокупность характеристик, которые определяют, насколько хорошо написан код и насколько он соответствует определенным стандартам и ожиданиям.

Всегда есть особенности, которые необходимо учитывать при разработке того или иного продукта, но сегодня мы рассмотрим общие принципы, которые позволят его легче читать, понимать и модифицировать.

Качество кода включает в себя следующие понятия:

  • работоспособность
  • читаемость
  • поддерживаемость
  • расширяемость
  • тестируемость.

Качественный код позволяет быстро и безболезненно вносить изменения, исправлять ошибки и добавлять новые возможности.

-2

Работоспособный код должен быть корректным, надежным и эффективным. Для проверки работоспособности кода используются различные методы тестирования, которые позволяют выявить и исправить дефекты, улучшить производительность и безопасность.

Читаемым кодом можно назвать тот, который оформлен в соответствии с общепринятыми стилями и соглашениями, иметь хорошую структуру, логику и комментарии. Для повышения читаемости используются различные инструменты, которые помогают его форматировать, проверять и документировать. Читаемость кода влияет на его понятность, поддерживаемость и расширяемость.

Поддерживаемость — это способность кода быть легко изменяемым и адаптируемым к новым требованиям или условиям. Поддерживаемый код должен быть модульным, гибким и совместимым с другими компонентами системы. Что позволяет не только вносить изменения, но и дополнять его и расширять. Это означает, что код должен позволять добавлять новые функции без изменения существующего кода. Для обеспечения расширяемости кода используются различные концепции, такие как наследование, полиморфизм, абстракция и другие.

Помимо этого код должен быть независимым от внешних факторов, иметь возможность контролировать свое состояние и входные/выходные данные. Это позволяет его протестировать, что влияет на качество, надежность и безопасность.

Принципы SOLID

-3

SOLID – это аббревиатура, обозначающая пять основных принципов объектно-ориентированного программирования, которые способствуют созданию качественного кода. Эти принципы таковы:

  • Single responsibility principle (Принцип единственной ответственности) – каждый класс или модуль должен иметь одну и только одну причину для изменения. Это означает, что каждый класс или модуль должен выполнять одну конкретную задачу и не зависеть от деталей реализации других классов или модулей.
  • Open/closed principle (Принцип открытости/закрытости) – программные сущности (классы, модули, функции и т.д.) должны быть открыты для расширения, но закрыты для изменения. Это означает, что можно добавлять новую функциональность к существующему коду без изменения его исходного кода, используя наследование, ассоциацию или полиморфизм (подробнее об основах ООП для тех кто с ним не знаком, можно почитать здесь).
  • Liskov substitution principle (Принцип подстановки Барбары Лисков) – объекты в программе должны быть заменяемыми на экземпляры их подтипов без изменения правильности выполнения программы. Это означает, что подкласс или реализация интерфейса должны соответствовать контракту базового класса или интерфейса и не нарушать его поведение.
  • Interface segregation principle (Принцип разделения интерфейса) – много специализированных интерфейсов лучше, чем один универсальный. Это означает, что клиенты не должны зависеть от методов, которые они не используют, и интерфейсы должны быть атомарными и целевыми.
  • Dependency inversion principle (Принцип инверсии зависимостей) – зависимости внутри системы должны строиться относительно абстракций, а не конкретных реализаций. Это означает, что высокоуровневые модули не должны зависеть от низкоуровневых модулей, а оба типа модулей должны зависеть от абстракций. Абстракции не должны зависеть от деталей, а детали должны зависеть от абстракций.

Более подробно каждый принцип мы рассмотрим в отдельной статье, так как эта тема довольно глубокая и затрагивает вопросы архитектуры проекта. Но если обобщить, то данные принципы предназначены для того, чтобы мы могли поддерживать код на постоянной основе без необходимости внесения изменений в уже существующую кодовую базу.

Изначально когда мы формируем какую-то сущность, например, класс, объект, метод или функцию, то должны убедиться, что у нее определена зона ответственности, все необходимые параметры от нее наследуются, а дополнительные сущности расширяют ее, а не изменяют напрямую.

При это отмечу, что данные принципы можно применять и в функциональном программировании. Когда мы разрабатываем функцию, то должны убедиться что она выполняет только то, ради чего была создана. То есть если она создана для получения конкретного списка сущностей, например, списка товаров в магазине, то она не должна никак работать с ними: изменять, удалять, сохранять и т.д. Для этого должны быть отдельные функции.

Как видим здесь прямо реализуется принцип единственной ответственности. Это неудивительно, что данные принципы можно применять в разных парадигмах, так как они являются довольно универсальными в части распределения ответственности за то, что делает каждая из сущностей в том или ином языке программирования.

Соблюдение принципов SOLID поможет вам создавать код, который легко читать, понимать, изменять и тестировать.

Стиль написания кода

Помимо принципов SOLID, существуют также правила стиля кодирования, которые определяют общие соглашения по оформлению кода. Эти правила могут варьироваться в зависимости от языка программирования, среды разработки, личных предпочтений программиста или стиля написания кода, принятого в компании, но в целом они включают в себя следующие аспекты:

  • Форматирование кода – это правила, которые определяют, как располагать код на странице, как использовать отступы, пробелы, переносы строк, скобки и т.д. Форматирование кода помогает сделать код более читаемым и единообразным. Его применение зависит от рассматриваемого языка программирования, потому что многое из этого регламентируется спецификациями и стандартами языков.
  • Именование переменных, функций, классов и т.д. – это правила, которые определяют, как выбирать имена для различных сущностей в коде. Имена должны быть понятными, однозначными, согласованными и соответствовать общепринятым соглашениям. Например, в Python принято использовать snake_case для переменных и функций, CamelCase для классов и UPPER_CASE для констант. Но никто не мешает придти к собственному соглашению между разработчиками внутри компании, главное, чтобы все его понимали и соблюдали.
  • Комментирование кода – это правила, которые определяют, как и когда писать комментарии к коду. Комментарии должны быть краткими, актуальными, информативными и не повторять код. Комментарии могут быть однострочными или многострочными, а также могут использоваться для создания документации с помощью специальных инструментов, таких как Doxygen, Sphinx или JSDoc. Необходимо также отдельно обсудить при формировании документации к коду, каким образом оформлять комментарии, как описывать входные параметры, возвращаемый результат, функциональность, размер комментария.
  • Структурирование кода – это правила, которые определяют, как организовывать код в файлы, модули, пакеты, классы и т.д. Структурирование кода помогает сделать код более модульным, переиспользуемым и легко поддерживаемым. Важной частью структурирования кода является декомпозиция там, где она применима. Ведь тщательное разбиение сущностей на отдельные компоненты позволяет ускорять разработку.

Данные правила позволяют формировать единый стиль написания кода по направлениям разработки, что существенно упрощает внутри команд и межкомандное взаимодействие. Это влияет на эффективность управления проектами, скорость разработки и банально упрощает жизнь самим разработчикам. Зачастую когда одному разработчику необходимо прочитать код другого, возникает проблема понимания происходящего. А единый стиль как минимум нивелирует часть таких вопросов, освобождая время для более продуктивной деятельности.

Писать качественный код – это не только умение решать задачи с помощью программирования, но и умение оформлять свое решение в виде чистого, понятного и поддерживаемого кода. Это поможет вам создавать код, который будет работать эффективно, а также будет легко читать, изменять и тестировать.

Мы рассмотрели лишь общие принципы и правила, которые в дальнейшем разберем более детально на конкретных примерах кода. А пока пишите в комментариях как у вас применяются данные принципы и с какими трудностями столкнулись на пути их применения.

Надеюсь вам понравилась данная статья) Не забывайте ставить лайки, если это так, подписывайтесь на канал и следите за новыми материалами. До встречи👋