Как обрабатывать необходимые свойства для доменных объектов? - PullRequest
0 голосов
/ 16 марта 2012

У меня есть UserEntity, который в конечном итоге сохраняется в БД в соответствии с его свойством id. В этом случае свойство id явно чувствительно, потому что его изменение приведет к тому, что UserEntity будет сохранен поверх другого UserEntity при сохранении позже.

Поэтому я хотел бы помочь защитить себя от чего-то подобного ...

Вариант 1. Заставляю ли я id передаваться в конструктор, тем самым удаляя сеттер?

  • Это будет означать, что каждый UserEntity, которому дается хранилище, будет действительным (потому что он имеет минимальное требование id).
  • Недостатком является то, что мой контроллер не смог бы создать новый UserEntity (), потому что у него не было бы id, чтобы дать его.

Вариант 2. Разрешить Id в конструкторе быть нулевым, но не предоставлять Setter

  • Это, по сути, создаст два типа объектов UserEntity: те, которые были сохранены, и те, которые не сохранились.
  • Я мог бы создать новый UserEntity () где угодно, заполнить его значениями, затем передать в репозиторий, который затем сохранит его, создаст новый UserEntity с новым id и вернет его.
  • Это круто, но означает, что мне нужно дважды проверить, что у моей сущности есть id везде, где я хочу использовать ее для сохранения / логики домена / и т. Д., Чтобы убедиться, что это сохраненная сущность.

Вариант 3. Не беспокоюсь ли я так, и предоставил для этого сеттер?

  • Это создает риск изменения id объекта UserEntity и перезаписи другого объекта UserEntity в БД.
  • С другой стороны, я могу создать новый UserEntity (), не зная заранее id, который я могу передать в свой репозиторий для сохранения.

1 Ответ

3 голосов
/ 16 марта 2012

Если вы заботитесь о достоверности своих доменных объектов, вам необходимо постоянно проверять действительность.

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

Если id в вашем примере никогда не изменится, вы должны только когда-либо устанавливать его в конструкторе (и принудительно передавать его в).

...