Через год я внесу свои два цента
Я не эксперт ORM, и совсем недавно начал что-то использовать Data Mapper, но, как давний пользователь Core Data, могу сказать, что нет. Основная цель этого шаблона - получить четкое представление об объекте домена из всех операций, связанных с базой данных.
Как только я начинаю писать модульные тесты, первое, что я замечаю, это то, что я должен загрузить базу данных, даже если она хранится в памяти, но я должен ее загрузить. Также нет картографов для каждого класса, я не могу контролировать, как хранится каждое отношение.
Базовые данные загружают много метаинформации о вашем графе объектов и навязывают им некоторую структуру. Хотя вы можете изменить постоянное хранилище и испечь что-то свое, у вас будет множество ограничений на то, как это сделать, с явным «реляционным» чувством к этому.
Идея хорошая, мы можем сказать, что это ее разновидность. Мне нравится то, что операция сохранения выполняется контекстом, а не самим объектом. Так что есть какой-то тип разделения.
Однако посмотрите на такие функции, как «awakeFromFetch» или «didSave», обе операции связаны с хранилищем данных, а не с простым объектом домена. Правильный шаблон Data Mapper позволит вам определять эти операции для каждого постоянного хранилища, а не объединять его в один объект.
UPDATE:
Достаточно забавно, что однажды после моего ответа мне пришлось иметь дело со старым проектом на основе CoreData, и я должен вернуться, чтобы улучшить этот ответ. Чтобы прояснить ситуацию, я считаю, что «похоже на шаблон» недостаточно. Например, реализация шаблонов фасадов и адаптеров очень похожа, но вы называете их по-разному в зависимости от того, как вы их используете.
Core Data реализует преобразователь данных?
Я должен сказать, что мое "не совсем" должно было быть "определенно нет!"
Я просто очень разозлился, потому что мне нужно было переименовать некоторые поля, а потом добавить новые. Хотя я достаточно хорошо знаю, как работают автоматические миграции с базовыми данными, я забыл, насколько они раздражают.
Сколько раз вам нужно какое-то новое поле, что-то переименовывать, экспериментировать, пока вы не сделаете все правильно ... и каждое крошечное изменение требует полной миграции базы данных? С Data Mappers это никогда не происходит, потому что доменные объекты идеально отделены. Вы только касаетесь базы данных, чтобы догнать доменные объекты после того, как закончите какую-то новую функцию. Базовые данные заставляют вас в каждый момент связывать каждую деталь ваших доменных объектов.
Мальчик, как сладка была жизнь, пока я не забыл, что "крошечное" раздражение Core Data является полной противоположностью того, что вы можете достичь с помощью картографов данных.