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-прагматизм важнее чистоты.