2016-07-20 6 views
0

Я моделирую свои сущности и долгое время боролся с этим. Вот мой Person Entity:ddd - Как правильно идентифицировать объекты ценности?

Person 
    ID 
    Name 
    Email 
    Password 
    City 
    Phone 
    Biography 
    Rating 
    Description 

Я попытался разделить эти свойства на объекты значений, но до сих пор я только был в состоянии преобразовать их в ВО (например, город является VO сделан с названием города , и название страны).

Должен ли я попытаться создать большие VO, собрав, например, Email и Password в Credentials VO? Я слишком глубоко углубляюсь в разделение на ВО?

Любая помощь очень ценится

[EDIT]

После некоторого обсуждения, оказывается, что лучшее решение сохранить каждое свойство в его собственном VO, для электронной почты и пароль, которые должны быть сгруппированы в исключением «Учетные данные».

ответ

1

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

При попытке идентифицировать их следует использовать язык, используемый экспертами домена. Какие слова они используют при обсуждении людей? Они ссылаются на учетные данные, электронную почту и пароль?

Также обратите внимание, чтобы идентифицировать группы свойств, которые всегда используются вместе. Например, если пароль всегда используется вместе с Email, имеет смысл сгруппировать их в мандатной объект, как вы можете нажать поведение там (т.е. Credentials.Validate())

[UPDATE]

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

Имя

  • находятся там мин/макс Валу es для имен?
  • Есть ли какие-либо символы не допускаются?

Email

  • это действительный адрес электронной почты
  • могут два человека имеют один и тот же адрес электронной почты?

Пароль

  • мин/макс длина?
  • обязательные персонажи?
  • недопустимые символы?

Телефон

  • это правильный номер телефона?
  • Как вы обрабатываете международные коды?

Рейтинг

  • есть ли минимальное и максимальное допустимое значение для рейтинга?
  • как оно рассчитывается? (Он рассчитывается?)

Описание

Биография

Город

и т.д ....

Если вы создаете Value объекты для выше понятия вместо использования примитивных значений, таких как int или str вы можете инкапсулировать свои бизнес-правила внутри объектов значений.

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

+0

Проблема в том, что я как бы делаю свои зубы на DDD с этим проектом, и я работаю соло, поэтому я являюсь экспертом в области и разработчиком, и это делает его трудным в использовании. Ubiquitous Language – Lucio

+0

Попробуйте второй подход, тогда - вещи, которые используются вместе часто – tomliversidge

+0

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

1

У вас там подозрительно выглядит структура данных (CRUD). В правильном DDD вы начинаете с бизнес-кейса типа «Создать человека», а затем вы узнаете модель , представляющую Лицо концепция.

Модель определяется группой компонентов и бизнес-правилами. Вашими компонентами обычно являются VO, поскольку они представляют собой модели, представляющие небольшие концепции, которые могут быть выражены как простые или составные значения без явного идентификатора, и они инкапсулируют конкретные бизнес-ограничения. Например, Email VO гарантирует, что у вас есть действительное значение электронной почты.

Вы должны позволить домену сообщать вам, имеет ли смысл создавать большие VO; обычно вы начинаете с VO, а вы обнаруживаете, он составлен из других VO. Как правило, мы идем сверху вниз. Вы можете привести пример модели see here.

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

+0

В примере моделирования связанной учетной записи, как будет реализован инвариант, что дебет не может превышать баланс аккаунта ? Будете ли вы полагаться на прочитанную модель для этого и, следовательно, сделать ее в конечном итоге последовательной? Я предполагаю, что какой-то лимит на суммы должен быть введен в действие, чтобы нам не пришлось компенсировать безумно высокие суммы денег. – plalx

+0

@plalx То, что вы говорите, является частью службы домена, а не агрегатом передачи. Передача не знает о AccountBalance. Бизнес-правило может позволить более высокую сумму => вы получаете хороший взнос за овердрафт или предотвращаете это. Но мой пример был сосредоточен только на совокупности, а не на всем бизнес-случае. – MikeSW

+0

То, что я говорю, заключается в том, что невозможно предотвратить транзакцию с овердрафтом, поскольку Transfer является единственным агрегатом в игре и не имеет понятия балансов. Представьте, что максимальная сумма перевода составляет 1000 $ в день, чтобы избежать чрезмерно высоких овердрафтов. Как бы вы описали сценарий, согласно которому кто-то использует условия гонки, выполняя множество одновременных запросов на передачу и, следовательно, кумулятивно превышает 1000 долларов в день? Я думаю, что это модельные банки должны следовать из-за их распределенной природы, но оставляя обнаженные инварианты намного сложнее, чем предотвращение овердрафта. – plalx

0

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

Должен ли я попытаться создать большие VO, составив, например, электронную почту и пароль в учетные данные VO?

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

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

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