Ответ 1
Шаблон сопоставления данных сообщает вам, что он должен делать, а не как его реализовать.
Поэтому все ответы в этой теме следует рассматривать как субъективные, поскольку они отражают индивидуальные предпочтения каждого автора.
Я обычно стараюсь максимально упростить интерфейс mapper:
-
fetch()
, извлекает данные в объекте или коллекции домена, -
save()
, сохраняет (обновляет существующие или вставляет новый) объект или коллекцию домена -
remove()
, удаляет объект или коллекцию домена со среды хранения.
Я сохраняю условие в самом объекте домена:
$user = new User;
$user->setName( 'Jedediah' );
$mapper = new UserMapper;
$mapper->fetch( $user );
if ( $user->getFlags() > 5 )
{
$user->setStatus( User::STATUS_LOCKED );
}
$mapper->save( $user );
Таким образом, вы можете иметь несколько условий для извлечения, сохраняя чистоту интерфейса.
Недостатком этого было бы то, что вам нужен публичный метод для извлечения информации из объекта домена, чтобы иметь такой метод fetch()
, но вам все равно понадобится выполнить save()
.
Нет реального способа реализовать правило "Tell Do not Ask" для взаимодействия с картой и доменом.
Что касается "Как убедиться, что вам действительно нужно сохранить объект домена?", который может возникнуть у вас, он был покрыт здесь, с обширными примеры кода и некоторые полезные биты в комментариях.
Update
В случае, если вы ожидаете иметь дело с группами объектов, вы должны иметь дело с разными структурами, а не с простыми объектами домена.
$category = new Category;
$category->setTitle( 'privacy' );
$list = new ArticleCollection;
$list->setCondition( $category );
$list->setDateRange( mktime( 0, 0, 0, 12, 9, 2001) );
// it would make sense, if unset second value for range of dates
// would default to NOW() in mapper
$mapper = new ArticleCollectionMapper;
$mapper->fetch( $list );
foreach ( $list as $article )
{
$article->setFlag( Article::STATUS_REMOVED );
}
$mapper->store( $list );
В этом случае коллекция представляет собой прославленный массив с возможностью принимать разные параметры, которые затем используются в качестве условий для картографа. Он также должен позволить картографу в приобретенный список изменить объекты домена из этой коллекции, когда сборщик пытается сохранить коллекцию.
В этом случае сборщик должен иметь возможность создавать (или использовать запрограммированные) запросы со всеми возможными условиями (как разработчик вы будете знать все эти условия, поэтому вам не нужно работать с бесконечным набором условия), а также обновить или создать новые записи для всего несохраненного объекта домена, в котором содержится коллекция.
Примечание.. В каком-то аспекте вы можете сказать, что обработчик связан с шаблонами builder/ factory. Цель другая, но подход к решению проблем очень схож.