Объекты Value vs Entity (Domain Driven Design)

Я только что начал читать DDD. Я не могу полностью понять концепцию объектов Entity vs Value. Может ли кто-то объяснить проблемы (ремонтопригодность, производительность и т.д.), С которыми может столкнуться система, когда объект Value спроектирован как объект Entity? Пример будет большим...

Ответ 1

Сокращение до существенного различия, идентичность имеет значение для сущностей, но не имеет значения для объектов ценности. Например, кто-то Name является объектом value. Объект клиента может состоять из имени клиента (объекта ценности), списка < Заказ > OrderHistory (Список объектов) и, возможно, адрес по умолчанию (обычно это объект значения). У клиента есть идентификатор, и каждый заказ будет иметь идентификатор, но имя не должно; как правило, в рамках объектной модели, идентификация адреса, вероятно, не имеет значения.

Объекты значений обычно могут быть представлены как неизменные объекты; изменение одного свойства объекта значения существенно уничтожает старый объект и создает новый, потому что вы не так озабочены идентичностью, как с контентом. Правильно, метод экземпляра Equals в Name возвращал бы "true", если свойства объекта идентичны свойствам другого экземпляра.

Однако изменение какого-либо атрибута объекта, такого как Клиент, не уничтожает клиента; объект клиента обычно изменен. Идентичность остается неизменной (по крайней мере, как только объект сохраняется).

Вероятно, вы создаете объекты ценности, не осознавая этого; в любое время, когда вы представляете какой-либо аспект Entity, создавая мелкозернистый класс, у вас есть объект value. Например, класс IPAddress, который имеет некоторые ограничения на допустимые значения, но состоит из более простых типов данных, будет объектом значения. EmailAddress может быть строкой, или это может быть объект значения со своим собственным набором поведения.

Вполне возможно, что даже объекты, имеющие идентификатор в вашей базе данных, не имеют идентификатора в вашей объектной модели. Но самый простой случай - это совокупность некоторых атрибутов, которые имеют смысл вместе. Вероятно, вы не хотите иметь Customer.FirstName, Customer.LastName, Customer.MiddleInitial и Customer.Title, когда вы можете составить их вместе как Customer.Name; они, вероятно, будут представлять собой несколько полей в вашей базе данных к тому моменту, когда вы думаете о сохранении, но ваша объектная модель не заботится.

Ответ 2

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

Если объект не полностью определен всеми его атрибутами, тогда существует подмножество атрибутов, которые составляют личность объекта. Остальные атрибуты могут меняться без переопределения объекта. Этот тип объекта нельзя определить в неизменяемом.

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

Ответ 3

Я не знаю, правильно ли указано следующее, но я бы сказал, что в случае объекта Address мы хотим использовать его как объект Value вместо Entity, потому что изменения в объекте будут отражаться на всех связанных объектов (например, Person).

Возьмите этот случай: вы живете в своем доме с другими людьми. Если бы мы использовали Entity для Address, я бы сказал, что будет один уникальный адрес, к которому будут привязаны все объекты Person. Если один человек уходит, вы хотите обновить его адрес. Если вы обновите свойства Адреса, все люди будут иметь другой адрес. В случае объекта Value мы не сможем редактировать адрес (поскольку он является неизменным), и мы будем вынуждены предоставить новый адрес для этого лица.

Звучит ли это правильно? Я должен сказать, что я был еще и смущен этой разницей, прочитав книгу DDD.

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

Ответ 4

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

Ответ 5

Я спросил об этом в другом потоке, и я думаю, что я все еще смущен. Я могу сбивать с толку соображения производительности при моделировании данных. В нашем приложении для каталогизации Клиент не изменяется, пока это не понадобится. Это звучит глупо, но "чтение" данных клиента намного превосходит число "записей", и поскольку многие "сетевые запросы" попадают в "активный набор" объектов, я не хочу постоянно загружать Клиентов. Таким образом, я отправился по непреложной дороге для объекта Customer - загрузил его, кешировал и обслуживал до 99% (многопоточных) запросов, которые хотят видеть Клиента. Затем, когда клиент что-то меняет, получите "редактор", чтобы создать нового Клиента и аннулировать старый.

Моя забота заключается в том, что многие потоки видят один и тот же объект-клиент и изменяются, а затем, когда один поток начинает меняться, в остальных возникает хаос.

Теперь мои проблемы: 1) это разумно и 2) как лучше всего это сделать, не дублируя много кода о свойствах.

Ответ 6

3 различие между Entities и Value Objects

  • Идентификатор и структурное равенство: У объектов есть идентификатор, сущности одинаковы, если они имеют одинаковые идентификатор. Объекты ценности за пределами руки имеют структурное равенство, мы рассматриваем два объекты значения равны, когда все поля одинаковы. Объекты Value не могут имеют идентификатор.

  • Мутируемость и неизменность: Объекты Value - это неизменные структуры данных, тогда как объекты изменяются во время их срок службы.

  • Продолжительность жизни: объекты значения должны принадлежать объектам