чистая архитектура
Чистая архитектура (Clean Architecture) — это принцип организации кода, предложенный Робертом Мартином (Uncle Bob) в 2012 году. Суть: деловая логика приложения должна быть полностью независима от технических деталей — фреймворков, баз данных, UI, внешних сервисов. Эти детали — сменяемые «плагины», бизнес-правила — стабильное ядро системы.
Проблема, которую решает чистая архитектура
В типичном «спагетти-коде» бизнес-логика разбросана по контроллерам, SQL-запросам, обработчикам HTTP. Когда нужно сменить базу данных — переписывают половину приложения. Когда нужно протестировать бизнес-правило — поднимают весь стек с БД, HTTP-сервером, внешними API.
Чистая архитектура решает это строгим правилом зависимостей: зависимости направлены только внутрь. Внешние слои зависят от внутренних, никогда наоборот. Бизнес-логика не знает о существовании HTTP, SQL или конкретного фреймворка.
Концентрические слои
Entities (сущности)
Самое ядро. Объекты бизнес-домена с ключевыми бизнес-правилами. Не зависят ни от чего — ни от фреймворка, ни от БД, ни от UI. Могут использоваться в любом приложении, где нужна эта бизнес-логика.
Use Cases (сценарии использования)
Бизнес-логика конкретного приложения. Оркестрируют сущности, реализуют пользовательские сценарии: «Создать заказ», «Обработать платёж», «Зарегистрировать пользователя». Не зависят от фреймворка и БД, зависят только от сущностей.
Interface Adapters (интерфейсные адаптеры)
Конвертируют данные между форматом use cases и форматом внешнего мира. Контроллеры HTTP, презентеры, репозитории (интерфейс — здесь, реализация с SQL — снаружи). Знают о фреймворке и деталях представления, но не о деталях БД.
Frameworks & Drivers (фреймворки и драйверы)
Самый внешний слой: веб-фреймворк, ORM, UI, база данных, внешние API. Детали реализации. Этот слой максимально «грязный» — здесь пишут минимум кода, делегируя всё внутренним слоям.
Правило зависимостей
Ключевое правило чистой архитектуры: исходный код может зависеть только от того, что находится в более внутреннем круге. Entity ни о чём внешнем не знает. Use case знает о сущностях. Адаптер знает о use cases. Фреймворк знает обо всём — но на него никто не ссылается изнутри.
Для соблюдения правила при необходимости «обратной» зависимости используют Dependency Inversion: use case определяет интерфейс репозитория (OrderRepository), конкретная реализация на SQL — во внешнем слое, инъектируется через DI-контейнер.
Связь с другими архитектурными подходами
Чистая архитектура — синтез и формализация нескольких родственных идей: Hexagonal Architecture (Ports and Adapters) Алистера Кокберна, Onion Architecture Джеффри Палермо. Все они выражают одну идею — ядро не знает о периферии — разными словами и схемами.
На практике: как выглядит структура проекта
Типичная структура директорий: domain/ (entities, value objects, domain services), application/ (use cases, application services, port interfaces), infrastructure/ (repository implementations, HTTP clients, email adapters), interfaces/ (HTTP controllers, CLI handlers, message consumers).
Тест бизнес-логики не требует базы данных: репозитории заменяются in-memory реализациями. Use case тестируется с mock-адаптерами за секунды.
Критика и ограничения
Чистая архитектура добавляет слои абстракции и бойлерплейт. Для простых CRUD-приложений это избыточно: DTO на каждом слое, интерфейсы репозиториев, маппинг между объектами разных слоёв — всё это увеличивает объём кода без видимой пользы.
Подход оправдан для систем со сложной, изменчивой бизнес-логикой, долгим жизненным циклом и большой командой. Для MVP или простых сервисов — прагматичный подход с меньшим числом слоёв предпочтительнее.
Чистая архитектура и микросервисы
Принципы чистой архитектуры применяются внутри каждого микросервиса независимо. Маленький микросервис может применять упрощённую версию — только use cases и адаптеры без полного набора слоёв. Главное — бизнес-логика не знает об HTTP и SQL.
Частые вопросы
Clean Architecture и MVC — одно и то же?
Нет. MVC (Model-View-Controller) — паттерн пользовательского интерфейса, не затрагивающий организацию бизнес-логики. Clean Architecture — система организации всего приложения. MVC может быть реализацией интерфейсного слоя в чистой архитектуре.
Как внедрить чистую архитектуру в существующий проект?
Постепенно, без переписывания с нуля. Начните с выделения use cases в отдельные классы. Затем определите интерфейсы репозиториев и перенесите SQL в конкретные реализации. Постепенно выделите доменные объекты. Это iterative refactoring, а не big bang rewrite.
Обязательно ли соблюдать все 4 слоя?
Нет строгого требования. Принцип важнее структуры: бизнес-логика не должна зависеть от технических деталей. Для небольших сервисов достаточно двух слоёв: domain + infrastructure. Добавляйте слои по мере роста сложности.
Другие термины в теме «Архитектура ПО»
Не хватает деталей?
Напишите, что уточнить по теме «чистая архитектура» — это помогает улучшать материал и подсказывает, какие термины добавить дальше. Email необязателен: укажите, если хотите ответ только для вас (мы не шлём рассылки).