Объект значения - Value object

В Информатика, а объект значения это маленький объект что представляет собой просто сущность, равенство которой не основано на идентичности: т.е. два объекта-значения равный когда они имеют тоже самое ценность, не обязательно быть тот же объект.[1][2]

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

Будучи маленьким, можно иметь несколько копий одного и того же объекта значения, представляющих одно и то же. организация: часто проще создать новый объект, чем полагаться на один экземпляр и использовать ссылки на него.[2]

Объекты-значения должны быть неизменный:[3] это требуется для неявного контракта, созданного двумя объектами значений равный, должны оставаться равными. Также полезно, чтобы объекты-значения были неизменяемыми, поскольку клиентский код не может перевести объект-значение в недопустимое состояние или ввести ошибочное поведение после создания экземпляра.[4]

Ценностные объекты входят в число строительные блоки DDD.

Реализация

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

C #

В C #, а класс является ссылочным типом, а структура (концепция, полученная из структура на языке C ) - это тип значения.[5] Следовательно, экземпляр, производный от определения класса, является объектом, в то время как экземпляр, производный от определения структуры, называется объектом значения (чтобы быть точным, структура может быть сделана неизменной для представления объекта значения, объявляющего атрибуты как только чтение[6]).

Для добавления свойств объекта-значения в класс C # можно выполнить следующую процедуру:

  1. Отменить Object.Equals метод для обеспечения сравнения объекта с помощью бизнес-логика
  2. Перегрузка оператора поведение по умолчанию == и != использовать Равно метод.
  3. Отменить Object.GetHashCode и убедитесь, что хэш одинаков для объектов, которые имеют одинаковое равенство.
  4. Сделайте класс неизменным[7] удаляя все средства задания свойств и передавая только значения членов через конструкторы.[8]

C ++

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

Однако, если сами поля объявлены как константы (вместо того, чтобы использовать неконстантные поля, открывая только методы доступа «геттер»), то будет невозможно полностью перезаписать такой объект значения другим (объект1 = объект2).

Ява

В отличие от C # и C ++, Java не поддерживает настраиваемые типы значений на уровне языка. Каждый настраиваемый тип является ссылочным типом и поэтому имеет семантику идентификаторов и ссылок,[9] хотя рассматривается возможность расширения поддержки настраиваемых типов значений.[10]

Поэтому программисты на Java эмулируют объекты-значения, создавая неизменяемые объекты,[11] потому что, если состояние объекта не изменяется, передача ссылок семантически эквивалентна копированию объектов значений.

Класс можно сделать неизменяемым, объявив все атрибуты пустой финал,[12] и объявление всех атрибутов неизменяемого типа (например, Строка, Целое число, или любой другой тип, объявленный в соответствии с этими правилами), но не изменяемый тип, такой ArrayList или даже Дата. Они также должны определять equals и hashCode для сравнения значений, а не ссылок.

Термин «VALJO» (объект Java VALue) был придуман для обозначения более строгого набора правил, необходимых для правильно определенного объекта неизменного значения.[13]

Семантика типа значения будет представлена ​​в Java проектом Valhalla.[14][15]

пример

общественный класс Адрес улицы{    общественный Адрес улицы(строка улица, строка город)    {        Улица = улица;        город = город;    }    общественный строка Улица { получить; }    общественный строка город { получить; }}

Смотрите также

использованная литература

  1. ^ Фаулер, Мартин (2003). «Объект значения». Каталог шаблонов архитектуры корпоративных приложений. Мартин Фаулер (martinfowler.com). Получено 17 июля 2011.
  2. ^ а б «Объект значения». Wiki Портлендского репозитория паттернов. Cunningham & Cunningham, Inc. (c2.com). Получено 6 сентября 2012.
  3. ^ «Объект значения должен быть неизменным». Wiki Портлендского репозитория паттернов. Cunningham & Cunningham, Inc. (c2.com). Получено 6 сентября 2012.
  4. ^ Бернс, Сэм. «Ценность объекта-ценности». sam-burns.co.uk.
  5. ^ «Классы и структуры (Руководство по программированию на C #)». Сеть разработчиков Microsoft (msdn.microsoft.com). 2012 г.. Получено 5 сентября 2012.
  6. ^ «Создание объекта неизменяемого значения в C # - Часть III - Использование структуры». WebLog Луки Болоньезе. 2012 г.. Получено 7 сентября 2012.
  7. ^ Коирала, Шивпрасад. «Неизменяемые объекты в C # - CodeProject». www.codeproject.com. Получено 2017-12-26.
  8. ^ коирала, Шивпрасад. «Шаблон проектирования объекта значения в C #». www.codeproject.com. Получено 2017-12-26.
  9. ^ «Спецификация языка Java, глава 4. Типы, значения и переменные». Получено 7 октября 2015.
  10. ^ «JEP 169: Объекты-значения». Получено 7 октября 2015.
  11. ^ «Неизменяемые объекты». Сборник практик Java. 2012. Получено 5 сентября 2012.
  12. ^ следовательно, назначается только в конструкторы
  13. ^ «VALJOs - Ценные объекты Java». Получено 19 октября 2014.
  14. ^ «Проект Валгалла». Получено 7 августа 2018.
  15. ^ «Развитие языка Java с помощью @BrianGoetz». Получено 7 августа 2018.