Почему Active Record считается антипаттерном
Что проверяют
Умеете ли вы обсуждать компромисс, а не повторять ярлык. Хороший ответ показывает, что вы понимаете, чем Active Record отличается от Data Mapper, где проходит граница применимости и почему в PHP оба подхода живут рядом.
Как отвечать
Начните с того, что это не антипаттерн, а паттерн с известной ценой, и в исходной классификации он описан именно как рабочий вариант. Цена в том, что объект сам умеет сохраняться, то есть в одном классе сходятся данные предметной области, знание схемы таблицы и доступ к соединению. Отсюда претензии:
- нарушен принцип единственной ответственности: модель приходится менять и когда меняется бизнес-правило, и когда меняется колонка;
- модель наследует базовый класс библиотеки, привязанный к соединению, поэтому юнит-тест без базы почти невозможен, тесты тянут за собой схему и становятся медленными;
- предметная модель повторяет форму таблицы: агрегат из нескольких сущностей или правило, не выражаемое строкой, выглядят неуклюже;
- ленивая подгрузка связей спрятана внутри модели, и запрос в цикле появляется незаметно, прямо в шаблоне.
Обязательно назовите, где он уместен: административные панели, CRUD-сервисы, прототипы, небольшие проекты. Там скорость разработки важнее чистоты, и Data Mapper с отдельными сущностями и репозиториями обходится дороже, чем приносит.
Где спотыкаются
Выучили ярлык, но не могут назвать альтернативу. Репозиторий, который возвращает ту же активную запись, ничего не разделяет: сохранение по-прежнему живёт в модели, а слой сверху только создаёт видимость развязки.
Второе: главной бедой называют привязку к конкретной СУБД и сложность переезда. Диалект как раз абстрагирован библиотекой, и переезд ломается обычно на другом. Настоящая привязка это привязка домена к схеме таблиц и к базовому классу ORM.
Третье: записывают в минусы медленные соединения таблиц. Проблема ровно обратная: вместо одного запроса с соединением получается сто отдельных запросов из цикла по коллекции, и лечится это жадной загрузкой связей, а не отказом от паттерна.