
import-linter: пусть границы слоёв сторожит машина, а не человек
andy-takker 8 минут назад import-linter: пусть границы слоёв сторожит машина, а не человек Средний 9 мин 45 Python * Проектирование и рефакторинг * Программирование * Туториал Дисклеймер. Это не «единственно верный...
Anthropic — What company has the best second artificial intelligence model at the end of June?
В сфере искусственного интеллекта произошло заметное событие. andy-takker 8 минут назад import-linter: пусть границы слоёв сторожит машина, а не человек Средний 9 мин 45 Python * Проектирование и рефакторинг * Программирование * Туториал Дисклеймер. Это не «единственно верный путь», а конкретный приём на слоистом бэкенде. Структура в примере такая: domain с бизнес-правилами, adapters для БД, Redis и внешних API, application с общими прикладными интерфейсами и типами, presentors для REST и брокера на входе (слой назван так исторически; в новом коде я бы назвал его presentation или entrypoints).
Стек - Litestar + SQLAlchemy + Postgres. Все примеры - из моего публичного репозитория-образца example-web-service. Если вы считаете, что ваша архитектура более чистая или более гексагональная, то пожалуйста, не претендую на идеал.
Технические детали
Здесь больше про сам подход как следить за слоями. Обычный летний день на проекте: ruff зелёный, mypy зелёный, тесты проходят. А domain при этом тихо импортирует adapters.
Слоистая архитектура, которую рисовали на старте, теперь осталась только на схеме. Линтер ловит неиспользуемый импорт и кривой отступ. Типизатор - что вместо int передали str.
А то, что бизнес-логика потащила в себя SQLAlchemy или Redis, не видит никто. У которого в пятницу вечером открыто восемь PR. Ниже - как отдать эту проверку машине.
Отраслевые последствия
Инструмент называется import-linter, ставится за пять минут и встаёт в один ряд с ruff и mypy. История из жизни: пять импортов и полдня работыСамый частый способ размыть слой - поймать инфраструктурное исключение там, где его быть не должно. У меня в сервисе на FastAPI в domain/services однажды появилась строчка:from sqlalchemy.
exc import IntegrityErrorВ PR разработчику было проще обработать ошибку уникального индекса прямо в бизнес-логике: поймал IntegrityError, кинул через raise ... доменное исключение, поехали дальше. Логика работает, тесты прошли, на ревью пропустили - выглядит безобидно.
Через два месяца таких импортов в домене было уже пять: DataError, IntegrityError, DBAPIError, UniqueViolationError (из asyncpg) и т. SQLAlchemy протекла в самое ядро: домен теперь знал про конкретную ORM, про имена constraint’ов, про то, что хранилище вообще на SQL (и в частности postgresql). Поменять ORM стало дорого.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





