Обновлено: 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());
Опять же, тривиально, но этот пример упрощен. По-прежнему применяется дублирование кода.
На мой взгляд, это имеет смысл, чтобы иметь какой-то центральный объект, который может позаботиться о:
- Извлечение сайт (или сайты) и все nessessary ассоциированными сущностями
- Создание новых объектов сайта с помощью нового связанные с ней организации
- Принимая сайт (или сайты) и сохранение его и все связанные с ним объекты (если они изменились)
Итак, вернемся к моему вопросу, что должно быть этот объект ?
- Существующий объект карты?
- что-то на основе репозитория шаблона? *
- что-то на основе единицы работы Паттен? *
- Что-то еще?
* Я не полностью понимаю любой из них, как вы, вероятно, можете догадаться.
Есть ли стандартный способ решения этой проблемы, и может ли кто-нибудь дать краткое описание того, как они будут его реализовывать? Я не ищу, чтобы кто-то обеспечивал полностью работоспособную реализацию, только теорию.
Спасибо,
Джек
ОК, это имеет смысл, нужно прочитать на схеме обслуживания. Однако (и я уже столкнулся с этим вопросом), каково различие между репозиторием и картографом. Мои картографы уже предоставляют интерфейс CRUD, так почему дополнительный слой репозитория сверху? –
Также, если у вас есть служба для каждого типа сущности или просто те, где вы хотели сделать что-то на заказ? –
Я думаю, что репозиторий очень похож на ваших карточек, и вы, возможно, просто сохранили это. Новый компонент - это уровень обслуживания. – Misko