Добавление членов объекта в бизнес-сущности в OOD

У меня есть 2 бизнес-объекта (объекта): Продукт и Заказ. Объект Product содержит свойство Name в дополнение к некоторым другим свойствам. Объект Order содержит свойства «Id, Date... и т. д.» в дополнение к свойству, указывающему на Product (при условии, что в заказе может быть только один продукт для простоты).

В моем случае, когда я хочу показать список заказов, я хочу показать название продукта для каждого заказа, но мне не нужно показывать свойства другого продукта.

Мой вопрос: когда я разрабатываю класс сущности Order, должен ли я добавить свойство, указывающее на продукт, или я должен просто добавить свойство с именем "ProductName"? И если ответ состоит в том, чтобы добавить свойство, указывающее на продукт, можно ли загрузить только свойство «Имя» или я должен также заполнить все остальные свойства (во время извлечения данных из БД)?

Я также был бы признателен, если бы вы могли добавить ссылки на некоторые статьи с вашими ответами.


person user2931442    schedule 24.05.2015    source источник
comment
Спасибо за ваши ответы. Хотя ответы не давали прямого ответа на мой вопрос, они открыли глаза на проблему. Спасибо   -  person user2931442    schedule 25.05.2015
comment
но я должен выбрать только один ответ   -  person user2931442    schedule 25.05.2015


Ответы (2)


Кажется, в вашем вопросе есть предположение, что штуковина для отображения заказа должна соответствовать 1-1 с сущностью заказа.

Я думаю, что вы вырыли яму для себя, пытаясь упростить заказ до одного продукта.

Если бы у вас была таблица соединения (OrderProducts? или, еще лучше, OrderLines. Ни Order, ни Product Entities не должны были бы «знать» друг о друге. Вы могли бы сохранить их чистыми и простыми и делегировать эту функцию DisplayOrders новому объекту Join.

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

Это потребовало бы значительной переделки ваших сущностей, и если бы вы придерживались этой идеи совпадения 1-1, то и вашей БД.

Не ходи туда. Изменение — это данность. ip После комментариев...

Если это действительно отношения 1-1, то вам не нужны две сущности. 1-1 будет один продукт на заказ и один заказ на продукт.

Учитывая ваш вопрос, я по глупости предположил, что на самом деле вы можете заказывать товар много раз.

Таким образом, большинство интересных методов (помимо базовой херни для двух сущностей) основаны на отношениях между двумя сущностями. Это часть предметной области, которую вы должны моделировать.

После дополнительных комментариев...

Я никогда не денормализую, если только не оптимизирую производительность, и я делаю это «в последнюю очередь», если у меня нет лучшего варианта.

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

Я бы сделал это, исходя из предположения, что свойство имени объекта издателя может измениться. Денормализация означала бы, что мне пришлось бы фиксировать изменение имени издателя, читать все книги и менять в них название. Что еще хуже, там скрыто предположение, что имя издателя уникально. Теперь вы, вероятно, могли бы пойти с этим, но во избежание действительно ужасной ошибки, если какой-то буйный пользователь даст двум издателям одно и то же имя, вам придется применить его.

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

Все дизайны являются компромиссами, если вы собираетесь много просматривать списки книг, и имя издателя будет использоваться один раз в операции голубой луны, и вы готовы к проблеме идентификации, и вы не можете предвидеть никаких изменений в этом поведение, то денормализация является хорошим компромиссом.

В некотором смысле нет правильного ответа на ваш вопрос, вам нужно четко понимать, что ваш дизайн позволяет / позволяет и какие ограничения он накладывает, например. Имя издателя уникально, чего нет в требованиях, и это может привести к тому, что ваш клиент будет называть вас по-разному....

HtHs

person Tony Hopkinson    schedule 24.05.2015
comment
Спасибо за Ваш ответ. Я боюсь, что мой вопрос с Заказом и Продуктом сделал вопрос неясным и вводящим в заблуждение. Попробуйте перечитать еще раз, но вместо «Заказ» замените на «Книга», а вместо «Продукт» на «Издатель». - person user2931442; 24.05.2015
comment
Еще одно замечание: пожалуйста, не предполагайте ничего, что не указано в вопросе. Вся идея моего вопроса заключается в том, когда у вас есть 2 таблицы БД с отношением 1-1 и как нам нужно представлять их в классах. Как они должны ссылаться друг на друга в классах? - person user2931442; 24.05.2015
comment
Если у них отношения 1-1, то зачем два класса! Есть предположение, что там нет. Возможно, вам лучше обратиться к программистам с этим вопросом. Теперь больше обсуждения. - person Tony Hopkinson; 24.05.2015
comment
о, и в зависимости от того, как вы идентифицируете книгу, у них может быть более одного издателя... - person Tony Hopkinson; 24.05.2015
comment
Спасибо за попытку ответить на мой вопрос. Кажется, что в моей попытке сделать вопрос простым я сделал его недействительным/сложным :) Я чувствую, что у меня проблемы с формулировкой вопроса, чтобы вы могли ответить на него в то же время, я чувствую, что мой вопрос довольно просто. Больше пояснений в следующем комментарии - person user2931442; 24.05.2015
comment
Допустим, мы с вами работаем в одной компании и пришло руководство и сказало мне, что вы должны разработать систему, которая имеет следующие особенности: Нам нужно добавлять книги. Каждая книга имеет название, ISBN, дату публикации и одного издателя. Нам также нужно добавить издателей и назначить им книги, и у каждого издателя есть имя, имя владельца, название страны и дата создания. Нам нужна страница со списком книг. Каждая строка должна содержать название книги, ISBN, дату публикации и имя издателя.... продолжение следует в следующем комментарии. - person user2931442; 24.05.2015
comment
Одно издательство может издать много книг. К вам подошло руководство и сказало, что вам нужно пересмотреть мой дизайн. Я написал первоначальный дизайн и предоставил вам 2 варианта, чтобы выбрать лучший. Первый дизайн имеет 2 класса: Publisher и Book. Издатель имеет следующие свойства: Name (строка), OwnerName (строка), CountryName (строка), EstablishmentDate (DateTime). а класс Book имеет следующие свойства: Title (строка), ISBN (строка), PublishingDate (DateTime), PublisherName (строка). Продолжение в следующем комментарии - person user2931442; 24.05.2015
comment
Вторая конструкция имеет 2 класса. первый класс — Publisher, и он точно такой же, как и в первом дизайне. Второй класс называется Book и содержит следующие свойства: Title (строка), ISBN (строка), PublishingDate (DateTime), PublisherName (это тип Publisher). Теперь вы хотите дать мне совет, какой из двух дизайнов я должен следовать и почему - person user2931442; 24.05.2015
comment
Я прошу прощения за то, что вопрос получился длинным, но я чувствовал, что брифинг принесет больше вреда, чем пользы. Я хотел бы еще раз поблагодарить вас за попытку помочь мне :) - person user2931442; 24.05.2015
comment
Я знаю, что ты начал злиться на меня :) Я прочитал новые абзацы, которые ты добавил к своему ответу. Первая часть была о нормализации/денормализации, и, поскольку мой вопрос касается проектирования ОО (а не проектирования БД), я не думаю, что это связано с моим вопросом. Я не хочу менять структуру базы данных. Дизайн базы данных представляет собой просто 2 таблицы с отношением 1 ко многим. а потом вы начали говорить о BookListItem и BookList. Хотя добавление этих двух классов может помочь в общем дизайне, но я все равно не отвечаю на мой вопрос, который конкретно касается класса Book. - person user2931442; 24.05.2015
comment
В общем, я ожидаю, что на мой вопрос не будет правильного ответа, и это всегда будет зависеть от случая, и поэтому мне нужно несколько статей, чтобы прочитать об этом вопросе. Я знаю, что мне нужно прочитать несколько статей на эту тему, чтобы лучше понять, и тогда я, следовательно, отвечу сам себе. Моя проблема в том, что я не знаю, где найти эти статьи и не знаю, как называется эта тема. Я пытался искать в Google, но смог найти достаточно информации - person user2931442; 24.05.2015
comment
Кто сказал вам, что нормализация — это только базы данных? Речь идет о дублировании данных и целостности. То, что касается таблиц в БД, также относится и к вашим объектам в памяти. Я бы не стал добавлять имя издателя в книгу, если бы не знал, что описанные недостатки никогда не возникнут из-за этого. Это может помочь, en.wikipedia.org/wiki/Reification_%28computer_science%29 - person Tony Hopkinson; 24.05.2015

Это просто вопрос CQRS. Чтобы показать что-либо, связанное с пользовательским интерфейсом, просто используйте обработчик запросов (службу), получающий необходимые данные модели представления непосредственно из базы данных (постоянство), поэтому уровень Business/Domain пропускается. И это все. Вы не должны разрабатывать свою бизнес-модель на основе потребностей пользовательского интерфейса.

При изменении состояния бизнес-модели (Командная часть CQRS) дизайн должен отражать концепции и их отношения. В вашем случае Заказ ссылается на один или несколько Продуктов, используя их идентификатор. Эта модель не должна использоваться для запросов, только для создания/обновления.

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

person MikeSW    schedule 24.05.2015