intermediate
Active Record vs Data Mapper
Сравнивайте models, которые владеют persistence methods, с mappers, где domain objects отделены от storage concerns.
Active Record размещает методы персистентности на доменном объекте: `user.save()`, `order.delete()`. Data Mapper оставляет сущности «чистыми» и направляет сохранение через отдельный mapper или repository.
| Паттерн | Персистентность | Когда уместен | |---------|-----------------|---------------| | Active Record | На классе модели | CRUD-сервисы, прототипы, простые агрегаты | | Data Mapper | Mapper / repository | Богатые доменные правила, тестовые швы, сложные транзакции |
// Active Record (концептуально)
class Order {
async save() { /* INSERT или UPDATE */ }
}
// Data Mapper (концептуально)
class Order { /* только доменное поведение */ }
class OrderMapper {
async insert(order: Order) { /* SQL */ }
}
На интервью: объясните связность, тестируемость и границы транзакций. Богатое доменное поведение часто уводит от моделей, которые сами умеют сохраняться.
Типовые ошибки: утверждать, что один паттерн всегда лучше; Data Mapper-церемонии на чистом CRUD; Active Record со скрытыми побочными эффектами в хуках `save()`.
Компромисс — скорость разработки и привычность против явных границ, когда важны бизнес-правила и тесты.
Чеклист:
- Назовите, где живёт код персистентности.
- Свяжите выбор паттерна со сложностью домена.
- Обсудите тестовые швы и scope транзакции.
- Признайте, когда CRUD-прагматизм важнее чистоты.