intermediate
Repository pattern
Открывайте collection-like persistence operations, скрывая query details и сохраняя service code testable.
Repository предоставляет collection-like операции персистентности для агрегата: `findById`, `save`, `listActiveForUser`. Он скрывает детали ORM или SQL от сервисов, если контракты ориентированы на use case.
interface OrderRepository {
findOpenForCustomer(customerId: string): Promise<Order[]>;
save(order: Order): Promise<void>;
}
Хорошие repository моделируют бизнес-запросы, а не любой возможный фильтр по столбцу. Это граница — не магический слой, снимающий необходимость думать о SQL.
На интервью: упомяните владение агрегатом, пагинацию, фильтрацию, транзакции и когда query builder яснее, чем раздувание методов repository.
Типовые ошибки: generic `findByAnyField`, протекающий в схему БД; repository как тонкая обёртка ORM без ценности; размытые имена методов, скрывающие нужную семантику запроса.
Компромисс — более чистый сервисный код и тестовые заглушки против лишней абстракции на чистом CRUD.
Чеклист:
- Моделируйте методы под use case.
- Не скрывайте нужную семантику запроса.
- Держите транзакции явными на правильном слое.
- Используйте query builder для join и блокировок.