Значение по сравнению с объектами Entity (Domain Driven Design)
Я только начал читать DDD. Я не могу полностью понять концепцию объектов Entity vs Value. Может ли кто-нибудь объяснить проблемы (ремонтопригодность, производительность и т. Д.), С которыми может столкнуться система, когда объект Value проектируется как объект Entity? Пример был бы великолепен...
10 ответов
Сводится к существенному различию, идентичность имеет значение для сущностей, но не имеет значения для объектов стоимости. Например, чье-то Имя является ценным объектом. Сущность Customer может состоять из имени клиента (объекта значения), List
Значимые объекты обычно могут быть представлены как неизменяемые объекты; изменение одного свойства объекта значения по существу разрушает старый объект и создает новый, потому что вы не так озабочены идентичностью, как контентом. Правильно, метод экземпляра Equals в Name возвращает "true", если свойства объекта идентичны свойствам другого экземпляра.
Однако изменение какого-либо атрибута объекта, такого как Клиент, не разрушает клиента; Клиентский объект обычно изменчив. Идентичность остается прежней (по крайней мере, после того, как объект был сохранен).
Вы, вероятно, создаете объекты значения, не осознавая этого; всякий раз, когда вы представляете какой-либо аспект сущности, создавая детализированный класс, вы получаете объект значения. Например, класс IPAddress, который имеет некоторые ограничения на допустимые значения, но состоит из более простых типов данных, будет объектом значения. EmailAddress может быть строкой или объектом-значением со своим собственным набором поведений.
Вполне возможно, что даже элементы, которые имеют идентичность в вашей базе данных, не имеют идентичности в вашей объектной модели. Но самый простой случай - это совокупность некоторых атрибутов, которые имеют смысл вместе. Вы, вероятно, не хотите иметь Customer.FirstName, Customer.LastName, Customer.MiddleInitial и Customer.Title, когда вы можете составить их вместе как Customer.Name; к тому времени, когда вы подумаете о постоянстве, они, вероятно, станут несколькими полями в вашей базе данных, но вашей объектной модели все равно.
Любой объект, который в совокупности определяется всеми его атрибутами, является объектом значения. Если какой-либо из атрибутов изменяется, у вас есть новый экземпляр объекта значения. Вот почему объекты-значения определяются как неизменяемые.
Если объект не полностью определен всеми его атрибутами, то существует подмножество атрибутов, которые составляют идентичность объекта. Остальные атрибуты могут изменяться без переопределения объекта. Этот тип объекта не может быть определен в неизменяемом.
Более простой способ сделать различие состоит в том, чтобы рассматривать объекты-значения как статические данные, которые никогда не изменятся, а объекты - как данные, развивающиеся в вашем приложении.
Типы значений:
- Типы значений не существуют сами по себе, зависит от типов сущностей.
- Объект типа значения принадлежит объекту типа сущности.
- Срок жизни экземпляра типа значения ограничен сроком жизни экземпляра объекта-владельца.
- Три типа значений: базовые (примитивные типы данных), составные (адрес) и коллекционные (карта, список, массивы)
Объекты:
- Типы сущностей могут существовать самостоятельно (Идентичность)
- У сущности есть свой жизненный цикл. Он может существовать независимо от любого другого объекта.
- Например: человек, организация, колледж, мобильный, дом и т. Д. Каждый объект имеет свою индивидуальность
Я не знаю, правильно ли следующее, но я бы сказал, что в случае объекта Address мы хотим использовать его в качестве объекта значения вместо объекта, поскольку изменения в объекте будут отражаться на всех связанных объектах (Человек например).
Возьмите этот случай: вы живете в своем доме с другими людьми. Если бы мы использовали Entity для Address, я бы сказал, что будет один уникальный Address, на который ссылаются все объекты Person. Если один человек уходит, вы хотите обновить его адрес. Если вы обновите свойства объекта "Адрес", у всех людей будет другой адрес. В случае объекта значения мы не сможем редактировать адрес (поскольку он неизменен), и мы будем вынуждены предоставить новый адрес для этого лица.
Это звучит правильно? Я должен сказать, что я был / все еще смущен этой разницей, прочитав книгу DDD.
Идя дальше, как это будет моделироваться в базе данных? Будут ли у вас все свойства объекта Address в виде столбцов в таблице Person или вы создадите отдельную таблицу адресов, которая также будет иметь уникальный идентификатор? В последнем случае люди, живущие в одном доме, будут иметь разные экземпляры объекта Address, но эти объекты будут одинаковыми, за исключением их свойства ID.
Адрес может быть объектом или значением объекта, который зависит от процесса busiess. объект адреса может быть объектом в приложении курьерской службы, но адрес может быть объектом значения в каком-либо другом приложении. в заявлении курьера имеет значение личность для объекта адреса
3 различие между Entities
а также Value Objects
Идентификатор и структурное равенство: объекты имеют идентификатор, объекты одинаковы, если они имеют одинаковый идентификатор. Объекты-значения за пределами имеют структурное равенство, мы считаем два объекта-значения равными, когда все поля одинаковы. Значимые объекты не могут иметь идентификатора.
Изменчивость против неизменяемости: объекты-значения являются неизменяемыми структурами данных, тогда как сущности изменяются в течение срока их службы.
Продолжительность жизни: объекты значения должны принадлежать сущностям
Очень простым предложением я могу сказать, что у нас есть три типа равенства:
- Равенство идентификаторов: класс имеет поле идентификатора, и два объекта сравниваются со значением поля идентификатора.
- Ссылочное равенство: если ссылка на два объекта имеет одинаковый адрес в памяти.
- Структурное равенство: два объекта равны, если все их члены совпадают.
Равенство идентификаторов относится только к сущности, а структурное равенство относится только к объекту значения. На самом деле объекты-значения не имеют идентификатора, и мы можем использовать их как взаимозаменяемые. также объекты-значения должны быть неизменными, а сущности могут быть изменяемыми, а объекты-значения не будут иметь никакой таблицы в базе данных.
Я спросил об этом в другой ветке, и я думаю, что все еще в замешательстве. Возможно, я путаю соображения производительности с моделированием данных. В нашем приложении по каталогизации Заказчик не меняется, пока в этом нет необходимости. Это звучит глупо - но "чтения" данных клиентов намного превосходят "записи", и поскольку многие веб-запросы все чаще попадают в "активный набор" объектов, я не хочу продолжать загружать клиентов снова и снова. Поэтому я шел по неизменной дороге к объекту Customer - загружал его, кэшировал и обслуживал тот же самый запрос до 99% (многопоточных) запросов, которые хотят видеть Customer. Затем, когда клиент что-то меняет, найдите "редактора", чтобы создать нового клиента и аннулировать старого.
Меня беспокоит, что если многие потоки видят один и тот же объект клиента и он изменчив, тогда, когда один поток начинает меняться, в других возникает хаос.
Мои проблемы сейчас таковы: 1) это разумно, и 2) как лучше это сделать, не дублируя много кода о свойствах.
Рассмотрим следующие примеры из Википедии, чтобы лучше понять разницу между объектами-значениями и сущностями:
Объект ценности: Когда люди обменивают долларовые купюры, они обычно не делают различий между каждой уникальной купюрой; их беспокоит только номинальная стоимость долларовой купюры. В этом контексте долларовые банкноты являются объектами стоимости. Однако Федеральная резервная система может быть обеспокоена каждым уникальным счетом; в этом контексте каждый законопроект будет юридическим лицом.
Сущность: большинство авиакомпаний выделяют каждое место на каждом рейсе уникальным образом. В этом контексте каждое место является сущностью. Однако Southwest Airlines, EasyJet и Ryanair не различают места; все сиденья одинаковые. В этом контексте место на самом деле является объектом-значением.
Сущность:
имеет личность
содержит объекты значений
может содержать другие сущности
может быть изменчивым
Объект значения:
не имеет личности
должен быть неизменным