Какие шаблоны GRASP стоит знать?
Смежные принципы проектирования
GRASP (Крэг Ларман, «Применение UML и шаблонов проектирования») — девять шаблонов распределения ответственностей: они отвечают на вопрос «какому классу отдать этот метод».
Базовые
- Information Expert — ответственность у того, у кого данные:
Order.total()считает сам заказ, а не сервис, вытаскивающий строки. - Creator — B создаёт A, если содержит или агрегирует A, активно его использует или владеет данными для инициализации:
OrderсоздаётOrderLine. - Controller — первый объект за UI, принимающий системное событие и делегирующий дальше, чтобы в UI не было логики.
- Low Coupling и High Cohesion — оценочные критерии при выборе между вариантами.
Для вариативности
- Polymorphism — варианты поведения по типу через полиморфные операции вместо
switch. - Pure Fabrication — искусственный класс вне предметной области (
OrderRepository), когда Expert дал бы плохое зацепление, например SQL внутриOrder. - Indirection — посредник для развязки: адаптер, шина событий.
- Protected Variations — стабильный интерфейс вокруг точек нестабильности; по сути обобщение OCP и DIP.
Как это спрашивают
Дают ситуацию: «Кто должен считать скидку?» Сильный ответ начинает с Expert, проверяет зацепление и при конфликте выбирает Pure Fabrication, например PricingService.
Коротко для собеседования
GRASP помогает решить, какому классу отдать ответственность: по умолчанию тому, у кого данные, с оглядкой на зацепление и связность. Если Expert тянет инфраструктуру в доменный класс, вводят Pure Fabrication вроде репозитория или сервиса.