PHP ООП: Предоставление доменных сущностей с «идентичностью» - PullRequest
3 голосов
/ 21 апреля 2010

Немного абстрактной проблемы здесь. Я экспериментирую с шаблоном модели предметной области и запрещаю другим обсуждениям зависимости - мне нужен совет по созданию идентификатора для использования в карте идентификаторов.

В большинстве примеров для шаблона Data Mapper, который я видел (включая тот, который описан в этой книге: http://apress.com/book/view/9781590599099) - пользователь, кажется, вручную устанавливает идентичность для данного Доменного объекта с помощью установщика:

$UserMapper = new UserMapper;

//returns a fully formed user object from record sets
$User = $UserMapper->find(1);

//returns an empty object with appropriate properties for completion
$UserBlank = $UserMapper->get();
$UserBlank->setId();
$UserBlank->setOtherProperties();

Теперь я не знаю, правильно ли я читаю примеры - но в первом объекте $ User свойство $ id извлекается из хранилища данных (я предполагаю, что $ id представляет идентификатор строки). В последнем случае, однако, как вы можете установить $ id для объекта, если он еще не получил его из хранилища данных? Проблема заключается в создании действительного «удостоверения» для объекта, чтобы его можно было поддерживать с помощью Identity Map - поэтому создание произвольного целого числа не решает его.

В настоящее время я думаю о том, чтобы назначить разные поля для идентификации (например, адрес электронной почты) и требовать их присутствия при создании пустых доменных объектов. В качестве альтернативы, требование, чтобы все объекты были полностью сформированы, и использование всех свойств в качестве их идентичности ... вряд ли эффективно.

(Или, в качестве альтернативы, сбросьте концепцию доменной модели и вернитесь к DBAL / DAO / Transaction Scripts ... что выглядит все более элегантно по сравнению с реализациями ORM, которые я видел ...)

1 Ответ

0 голосов
/ 21 апреля 2010

Вы бы использовали функцию setId, если вы управляете идентификаторами, если хотите переопределить идентификатор хранилища данных, или если вы хотите обновить / удалить данные без необходимости их предварительного извлечения (т. Е. Уже есть идентификатор изСООБЩЕНИЕ).Другой альтернативой может быть вызов метода setId () для резервирования идентификатора путем «запроса» (вставки записи) хранилища данных для следующего доступного идентификатора.

Не имеет значения, какой идентификатор установлен, до тех пор, пока вам действительно не понадобитсяиспользовать это для ссылки на что-то.Вызов setId без параметра ничего бы не сделал, кроме как пометить объект как новые данные.Как только вы действительно попытаетесь «получить» идентификатор, он будет создан.Сортировать ленивый ID поколения.

...