DDD: Могут ли неизменные объекты быть сущностями?

9

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

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

bckpwrld
источник
Я должен выучить немного DDD, чтобы я мог разумно ответить на некоторые из этих вопросов. Я подозреваю, что сложность, с которой сталкиваются многие разработчики программного обеспечения с такими простыми понятиями, связана с ошибочным представлением о том, что DDD - это методология программирования.
Роберт Харви

Ответы:

4

Если верить книге (Evans, 2004), «объект, определяемый прежде всего своей идентичностью, называется сущностью». Это определение не зависит от того, является ли объект изменчивым или неизменным. Я думаю, что гораздо менее вероятно, что неизменяемый объект будет сущностью в данном домене, так что это полезная эвристика для определения, является ли объект «объектом значения» или «сущностью», но это не является частью определения.

Например, допустим, у вас есть субъект, представляющий сотрудника, который может иметь или не иметь прямого руководителя. Если вы решите представить идею отсутствия прямого супервизора в качестве ссылки на «нулевой» объект супервизора, то «нулевой» объект супервизора разумно считается сущностью. И вы, вероятно, могли бы сделать этот «нулевой» объект неизменным.

Эйдан Калли
источник
1
+1 Менеджер может быть доступен только для чтения (неизменяемый) в определенном контексте или поддомене, но это не значит, что он не имеет идентичности.
Адриан Шнайдер
Прости меня за глупость, но я не совсем понимаю твой пример руководителя. Вы говорите, что в области у нас будет две концепции, связанные с супервизором? Одна концепция будет представлять супервизоров, у которых есть сотрудники, которых они контролируют (в коде эта концепция будет реализована как изменяемый класс Supervisor), в то время как другая концепция будет описывать супервизора, который не контролирует каких-либо сотрудников (и эта концепция будет реализована как нулевая в коде) ?
bckpwrld
@bckpwrld Нет, он наверняка означает Нулевой Объект .
Маартин
2

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

http://lostechies.com/joeocampo/2007/04/23/a-discussion-on-domain-driven-design-value-objects/

Я все еще могу изменить свойства объекта значения, но его не нужно идентифицировать независимо от его сущности.

Kevin
источник
Я смешал терминологию из реляционных баз данных (первичный ключ) как тождество как метафору, пожалуйста, не воспринимайте это буквально
Кевин
По моему мнению, по крайней мере, даже если в коде VO представлены изменяемым типом (таким образом, экземпляры этого типа могут иметь измененные свойства), концептуально эти VO по-прежнему неизменны. Таким образом, изменение свойства экземпляра, представляющего конкретный VO, означает, что теперь этот же экземпляр представляет другой VO. Другими словами, ВО концептуально всегда неизменны
bckpwrld