2011-01-12 3 views
3

У меня есть я обсуждение с партнером мы имеем такой сценарий:DDD - Domain Model Проблема

**Publishers root entity 
Advertiser root entity** 

Каждый из этих субъектов разделяют общие данные: Email, BillingAddress, NormalAddress, секс, ПЛА и т.д.

У меня есть выбор: Объект-объект с объектом Value Адрес и остальные свойства. Таким образом, если я хочу получить доступ к конкретной информации о Лице (электронная почта, секс, дата-птица), я не должен проходить через корневые объекты издателя или рекламодателя, чтобы получить его (обработать Person как совокупный корень).

Sample: **Person.BillingAddress.Address1 : 
     Person.BillingAddress.Address2 : 
     Person.BillingAddress.POBOX : 
     Person.Email : 
     Person.Sex** 

Мой товарищ по команде предлагают сделать это с помощью абстрактного класса, рекламодатель и издатель наследует от абстрактного класса Person, чтобы иметь все общие свойства.

Каков наилучший способ для этого ?. Если у вас есть, пожалуйста, направляйте нас.

Спасибо, Педро-де-ла-Крус

+1

Не стесняйтесь проголосовать или принять любой (много) вопросов, которые у вас есть, которые вам подходят. – cherouvim

ответ

2

Я думаю, что вы правы. Наследование просто имеет смысл, когда поведение является обычным (что-то другое), тогда Person не является чем-то ДРУГОЙ ТОГО, потому что свойства являются подобными. Это не повторное использование кода.

1

Вы должны favour composition over inheritance.

Ваш дизайн лучше, потому что в противном случае вам нужно представить что-то еще в этой иерархии (например, сделать свои корневые объекты AuditableEntity), вы не сможете этого сделать (если ваш язык не поддерживает множественное наследование - Плохо).

1

В этом случае я не забочусь о наследовании - я думаю, что он хрупкий.

Я предпочел бы подход, основанный на составе и ролях. Роль администратора может обернуть объект Person и иметь все специальные атрибуты и поведения, связанные с ролью.

1

Я бы подумал, что Рекламодатель и Издатель должны наследовать от Компании, а Компания должна иметь коллекцию контактов (или лиц в вашем случае).

Технически компания может иметь коллекцию филиалов.

Тогда каждый филиал может иметь адрес, и каждый Контакт (Лицо) может иметь адрес.

0

(предупреждение - слишком упрощенно)

Наследование в данном случае выходит из строя «является» тест ..

обычно вы бы спросить «это» мой класс «а» <whatever> или делает это «есть» a <whatever>

1

@ Скотт, в чем проблема в наследовании от человека?

@ Как узнать, как наследование здесь не работает?

Позвольте Человеку быть абстрактным классом и Рекламодателем и Издателем в качестве конкретного класса.Таким образом, у рекламодателя будут общие свойства, то же самое для издателя, теперь мы можем передать человека.

Рекламодатель - это человек. Издатель - Человек. Я предпочитаю уделом

+0

Компании также имеют адреса, но они не являются лицами. Будет ли ОП дублировать определение адреса в качестве специального случая для Компании? Или компания продлит личность, чтобы включить этот объект? – cherouvim

+0

@cherouvim Нет понятия компании, он спросил о трех правах, Person, Advertiser, Publisher. – kamal

+0

@kamal: проекты действительно развиваются в реальном мире, и это целая концепция DDD. – cherouvim

1

Мои 2 цента ...

Как я читаю ваш вопрос, кажется, физическое лицо не является частью вашей модели. Ваша модель касается издателей и рекламодателей.

Первый. Я думаю, что физическое лицо (или компания) должно жить в отделенном домене «Ссылочный уровень», который может превратиться в «репозиторий уровней или партнеров».

Второй. Поскольку вашей модели нужны издатели и рекламодатели, я считаю, что ответственность за создание и создание этих объектов лежит на DAL (и в репозитории, но в меньшей степени). DAL - это единственное место, где у вас должен быть элемент физического лица (поскольку он не является сущностью в вашей модели, я назвал его «item»), и вы должны позаботиться о его изоляции от модели. Физическое лицо должно оставаться на стороне данных, поскольку это подразумевается в плане строительства издателей и сторонних партнеров. Очистка и увлажнение этих объектов должна находиться в хранилище.

Я думаю, что у вас не должно быть класса «Человек» в вашей модели, я думаю, вы должны иметь это «под» хранилищем, невидимым для вашей модели.

Смежные вопросы