Как устроены слои в чистой архитектуре?
Что проверяют
Понимаете ли вы правило зависимостей, а не только названия кругов на картинке. Для Python-разработчика вопрос почти всегда сводится к тому, где живут модели SQLAlchemy или Django и как бизнес-логика тестируется без базы. Следом спрашивают, чем чистая архитектура отличается от обычной слоистой.
Как отвечать
У Роберта Мартина четыре круга, от центра наружу:
- Entities: доменные объекты и правила, верные независимо от приложения. В Python это обычные
dataclassили классы без импортов фреймворков; - Use Cases: сценарии приложения, «оформить заказ», «перевести деньги». Получают зависимости через конструктор и работают с портами, а не с конкретной базой;
- Interface Adapters: роутеры FastAPI или вьюхи Django, Pydantic-схемы, репозитории на SQLAlchemy. Переводят данные между внешним миром и use case;
- Frameworks & Drivers: сам веб-фреймворк, драйвер БД, брокер, внешние API.
Ключевое правило: зависимости в исходном коде направлены только внутрь. Внутренний круг объявляет интерфейс (порт), внешний его реализует. В Python порт удобно описать через typing.Protocol или abc.ABC, например class OrderRepository(Protocol) с методами get и add, а SqlAlchemyOrderRepository лежит снаружи. Собирается всё в composition root: main.py, Depends в FastAPI или контейнер вроде dependency-injector. Транзакции обычно выносят в Unit of Work, чтобы use case не знал про session.commit().
Отличие от классической слоистой архитектуры именно здесь: там бизнес-слой зависит от слоя данных, в чистой наоборот. Границы можно проверять автоматически через import-linter, который валит CI при запрещённом импорте.
Где спотыкаются
Описывают правило задом наперёд: «внешние слои не зависят от внутренних». Правильно обратное: домен ничего не знает о FastAPI и базе, а адаптеры знают о домене.
Используют модели SQLAlchemy или Django ORM как доменные сущности и при этом называют это чистой архитектурой. Как компромисс это допустимо, но тогда его стоит назвать компромиссом.
Тащат полный набор слоёв в маленький CRUD-сервис. Хороший ответ называет цену: больше файлов и мапперов, а окупается это только при заметной бизнес-логике.