GRASP и паттерн ADR для веб-бэкенда
SOLID описывает свойства классов. GRASP (General Responsibility Assignment Software Patterns) отвечает на вопрос: кому поручить эту обязанность? — полезно при проектировании слоёв API, сервисов и домена.
Дополнение к паттернам проектирования и SOLID.
Ключевые принципы GRASP
| Принцип | Вопрос | Пример в бэкенде |
|---|---|---|
| Information Expert | Кто владеет данными для решения? | Order.calculateTotal() — не контроллер |
| Creator | Кто создаёт B, зная A? | OrderFactory создаёт OrderLine при известном Order |
| Controller | Кто принимает системное событие? | HTTP-контроллер, consumer очереди — не домен |
| Low Coupling | Как уменьшить связность? | Интерфейс PaymentGateway, не прямой SDK в домене |
| High Cohesion | Логика одной темы вместе? | BillingService, не «God service» |
| Polymorphism | Вариативность через типы? | NotificationSender → email / push |
| Indirection | Посредник для гибкости? | Репозиторий между сервисом и ORM |
| Protected Variations | Стабильный интерфейс при смене реализации? | Адаптер внешнего API |
GRASP не противоречит SOLID: Controller ↔ SRP на границе, Indirection ↔ DIP.
Где применять на практике
- Controller тонкий: парсинг HTTP, код ответа, вызов одного use-case.
- Expert в домене: скидки, статусы заказа, инварианты.
- Creator не размазан: фабрики для сложных агрегатов.
Антипример: контроллер на 400 строк с SQL — нарушены Controller, Expert, Low Coupling.
ADR — Action–Domain–Responder
Эволюция MVC для HTTP (не путать с Architecture Decision Record — в контексте веба ниже именно Action–Domain–Responder).
| Роль | Ответственность |
|---|---|
| Action | Один вход: метод + путь → вызывает use-case |
| Domain | Бизнес-логика и сущности |
| Responder | Формирует HTTP-ответ (JSON, статус, заголовки) |
Сравнение с классическим MVC:
| MVC | ADR |
|---|---|
| Controller «толстеет» | Action остаётся тонким |
| View для HTML | Responder для API (JSON) |
| Model смешивает персистентность | Domain отделён от инфраструктуры |
Когда уместен ADR: JSON API, PHP (Aura, Slim-подобные), Node, где не нужен тяжёлый View.
Когда достаточно MVC + слоёв: Spring @RestController + @Service + repository — по сути те же роли, другие имена.
Связь с другими паттернами
- Hexagonal / Ports-Adapters — Domain в центре, Action на driving side, Responder — адаптер вывода.
- CQRS — разные Action/Responder для command и query.
- Проектирование API — контракт Responder’а = OpenAPI-схема.
Чек-лист ревью
- Есть ли бизнес-правило в контроллере? → перенести в Domain (Expert).
- Создаёт ли контроллер десятки типов? → Creator / Factory.
- Меняется ли формат ответа независимо от логики? → Responder / DTO mapper.
- Тестируется ли домен без HTTP? → да, иначе связность высокая.
Связанные темы
См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). Каждая система имеет свою архитектуру построения; систему нужно разворачивать под нагрузку; нужно понимать обновления и исправление ошибок; рано или поздно — интеграция, безопасность, расширение и поддержка. Подход к проектированию — это стратегия, которая определяет, откуда начинается работа над системой и в каком порядке формируются её компоненты. Принципы проектирования - критерии оценки решений и ориентиры для поддерживаемого и безопасно изменяемого кода. Проектирование сервисов - от микросервисов до доменных сервисов в DDD и как не путать уровни ответственности. Любое действие пользователя — это запрос на изменение состояния, а не прямая команда. Как формулировать измеримые NFR и переводить их в архитектурные решения: масштабирование, отказоустойчивость, безопасность, observability. Традиционный подход: 1. Команда проектирует систему, 2. Пишет код, 3. По завершении — создаёт документацию для сдачи заказчику или архивирования. Проектирование баз данных — это системная инженерная дисциплина, направленная на создание структуры хранения данных, которая обеспечивает корректность, целостность, производительность, расширяемость. Современные программные системы редко существуют изолированно. Декомпозиция, API Gateway, database per service, Saga, observability и антипаттерны — практика микросервисов. Переходите к изучению этой статьи только после того, как изучите микросервисы. Распределённые системы представляют собой совокупность независимых вычислительных узлов, которые взаимодействуют между собой через сеть для достижения общей цели.Проектирование программных систем
Подходы к проектированию
Принципы проектирования
Проектирование сервисов и методов
Проектирование функциональных UI
Проектирование под нефункциональные требования
Документация как инструмент проектирования
Проектирование баз данных
Проектирование API и интеграций
Паттерны микросервисной архитектуры
Проектирование веб-разработки
Проектирование распределенных систем