Полиморфные доменные объекты на основе Data Mapper - PullRequest
0 голосов
/ 28 января 2009

У меня есть базовый объект домена, скажем, как Персона или Кампания или Событие, которое представлено одной таблицей в базе данных. Однако у меня также есть более сложные версии этих объектов, например, PersonCampaign или PersonEvent или даже CampaignEvent, которые теоретически могут расширять один из базовых объектов.

Однако по ряду причин это усложняется, поскольку PHP не поддерживает множественное наследование (например, PersonEvent расширяет Person или Event). А также потому, что некоторые доменные объекты на самом деле являются фабричными объектами с различными свойствами и функциональностью (например, событие фактически разделено на подклассы по типу события, например, электронная почта, вызов, факс)

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

Есть ли у кого-нибудь предложения по лучшему способу справиться с этим? Или правильно создавать унифицированные доменные объекты, которые могут изменять свойства и поведение в зависимости от того, что в данный момент доступно для него на уровне доступа к данным?

Ответы [ 3 ]

2 голосов
/ 01 февраля 2009

Решением является инкапсуляция других объектов:

Класс PersonEvent содержит Person и Событие.

Доступен либо функцией $ PersonEvent-> get_event (), либо свойством $ PersonEvent-> Event;

1 голос
/ 01 февраля 2009

С точки зрения ООП PersonEvent на самом деле не объект, это отношение.

Класс Person может получить такие функции, как:

get_events()
add_event($Event)
remove_event($Event)

и Класс события

get_person()
set_person($Person)
unset_person() // set person_id to NULL

(Предполагая отношение 1: N между человеком и событием)

Плохая часть в том, что это усложнит отображение данных или вообще не будет использовать отображение данных.

0 голосов
/ 28 января 2009

Как насчет установки типа:

Таблица: лицо, продавец, клиент, и т. Д. Таблица лиц хранит общую информацию обо всех подтипах людей. Тогда есть другие таблицы FK'd к столу человека. Он хранит дополнительную уникальную информацию об этом подтипе.

Ваши объекты будут либо расширяться, либо вызывать универсальный объект person для доступа к первичным данным, а затем вызывать его объект уникального типа для получения доступа к уникальным данным для этого подтипа?

...