Почему SOLID больше не нужен

625
20 Октября 2024

Принципы SOLID, которые были предложены Робертом Мартином (также известным как Uncle Bob), давно служили ориентиром для разработки качественного и поддерживаемого программного обеспечения. Эти пять принципов (Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation и Dependency Inversion) были нацелены на то, чтобы помочь разработчикам создавать системы, которые легче изменять, тестировать и поддерживать. Однако с развитием технологий и появлением новых подходов к программированию многие задаются вопросом: а нужны ли сегодня принципы SOLID в их оригинальной форме? Рассмотрим аргументы, почему они могут уже не соответствовать современным реалиям разработки.

1. Избыточная абстракция и сложность

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

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

2. Принцип единственной ответственности (SRP) может быть не всегда применим

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

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

3. Принцип инверсии зависимостей (DIP) теряет актуальность в условиях новых технологий

Принцип инверсии зависимостей (DIP) поощряет отделение высокоуровневых компонентов от низкоуровневых через абстракции, что позволяет снизить связанность между компонентами системы. Это было особенно важно в монолитных приложениях прошлого. Однако с распространением микросервисной архитектуры и внедрением контейнеризации (например, с использованием Docker) приложения стали гораздо более модульными по своей природе.

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

4. Современные практики тестирования нивелируют необходимость строгого следования принципам

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

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

5. Гибкость современных языков программирования

Многие современные языки программирования, такие как Python, JavaScript или Go, предоставляют более гибкие средства для работы с кодом и архитектурой. Например, динамическая типизация и мощные встроенные библиотеки позволяют создавать легкие и понятные архитектуры без строгого соблюдения всех принципов SOLID.

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

6. ИИ заменит программистов

С быстрым развитием искусственного интеллекта (ИИ) и автоматизированных средств разработки, таких как GitHub Copilot или ChatGPT, программирование как профессия может утратить актуальность в будущем. Уже сейчас ИИ помогает разработчикам генерировать код, анализировать ошибки и тестировать программы. Первые кандидаты на выкрики "свободная касса" в макдональдсе - джуны. В будущем, возможно, эти технологии смогут полностью автоматизировать процесс написания кода и ты мой дорогой сеньёр пойдёшь на завод осваивать сварочный инвентор.

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

Почему принципы SOLID теряют актуальность в современных условиях разработки, таких как микросервисы, контейнеризация и новые практики тестирования.

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

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

поделиться в:
ruenkzzh