Обновлено: 09.02.2009 - Пересмотрен вопрос, предоставлены лучшие примеры, добавлена награда.
Привет
Я строю приложение PHP, используя шаблон отображения данных между базой данных и объектами (объектами домена). Мой вопрос:
Каков наилучший способ инкапсуляции часто выполняемой задачи?
Например, одной из распространенных задач является получение одного или нескольких объектов сайта из преобразователя сайтов и связанных с ними (домашних) объектов страницы из преобразователя страниц. В настоящее время я бы сделал это так:
$siteMapper = new Site_Mapper();
$site = $siteMapper->findByid(1);
$pageMapper = new Page_Mapper();
$site->addPage($pageMapper->findHome($site->getId()));
Теперь это довольно тривиальный пример, но в действительности он усложняется, поскольку каждый сайт также имеет связанный языковой стандарт, а страница фактически имеет несколько ревизий (хотя для целей этой задачи меня интересовали бы только самый последний).
Мне нужно будет сделать это (получить сайт и связанную домашнюю страницу, локаль и т. Д.) В нескольких местах в моем приложении, и я не могу придумать лучший способ / место для инкапсуляции этой задачи, чтобы я мог не нужно повторять это повсюду. В идеале я бы хотел получить что-то вроде этого:
$someObject = new SomeClass();
$site = $someObject->someMethod(1); // or
$sites = $someObject->someOtherMethod();
Там, где полученным объектам сайта уже созданы и готовы к использованию связанные объекты.
Та же проблема возникает при сохранении этих объектов обратно. Скажем, у меня есть объект сайта и связанный объект домашней страницы, и они оба были изменены, я должен сделать что-то вроде этого:
$siteMapper->save($site);
$pageMapper->save($site->getHomePage());
Опять тривиально, но этот пример упрощен. Дублирование кода все еще применяется.
На мой взгляд, имеет смысл иметь какой-то центральный объект, который мог бы позаботиться о:
- Получение сайта (или сайтов) и всех связанных с ним объектов
- Создание новых сущностей сайта с новыми связанными сущностями
- Взятие сайта (или сайтов) и сохранение его и всех связанных объектов (если они изменились)
Итак, вернемся к моему вопросу, каким должен быть этот объект?
- Существующий объект сопоставления?
- Что-то основано на шаблоне хранилища? *
- Что-то основано на единице работы патента? *
- Что-то еще?
* Я не полностью не понимаю ни одного из них, как вы, вероятно, можете догадаться.
Существует ли стандартный способ решения этой проблемы, и может ли кто-нибудь дать краткое описание того, как они это реализовали? Я не ищу никого, кто бы предоставил полностью работающую реализацию, просто теорию.
Спасибо
Jack