Объект значения - Value object
В Информатика, а объект значения это маленький объект что представляет собой просто сущность, равенство которой не основано на идентичности: т.е. два объекта-значения равный когда они имеют тоже самое ценность, не обязательно быть тот же объект.[1][2]
Примерами объектов значений являются объекты, представляющие сумму денег или диапазон дат.
Будучи маленьким, можно иметь несколько копий одного и того же объекта значения, представляющих одно и то же. организация: часто проще создать новый объект, чем полагаться на один экземпляр и использовать ссылки на него.[2]
Объекты-значения должны быть неизменный:[3] это требуется для неявного контракта, созданного двумя объектами значений равный, должны оставаться равными. Также полезно, чтобы объекты-значения были неизменяемыми, поскольку клиентский код не может перевести объект-значение в недопустимое состояние или ввести ошибочное поведение после создания экземпляра.[4]
Ценностные объекты входят в число строительные блоки DDD.
Реализация
Из-за нюансов различных объектно-ориентированный языки программирования, у каждого свои методы и узоры для реализация и использование объектов-значений.
C #
В C #, а класс является ссылочным типом, а структура (концепция, полученная из структура на языке C ) - это тип значения.[5] Следовательно, экземпляр, производный от определения класса, является объектом, в то время как экземпляр, производный от определения структуры, называется объектом значения (чтобы быть точным, структура может быть сделана неизменной для представления объекта значения, объявляющего атрибуты как только чтение[6]).
Для добавления свойств объекта-значения в класс C # можно выполнить следующую процедуру:
- Отменить
Object.Equals
метод для обеспечения сравнения объекта с помощью бизнес-логика - Перегрузка оператора поведение по умолчанию
==
и!=
использоватьРавно
метод. - Отменить
Object.GetHashCode
и убедитесь, что хэш одинаков для объектов, которые имеют одинаковое равенство. - Сделайте класс неизменным[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]
пример
общественный класс Адрес улицы{ общественный Адрес улицы(строка улица, строка город) { Улица = улица; город = город; } общественный строка Улица { получить; } общественный строка город { получить; }}
Смотрите также
использованная литература
- ^ Фаулер, Мартин (2003). «Объект значения». Каталог шаблонов архитектуры корпоративных приложений. Мартин Фаулер (martinfowler.com). Получено 17 июля 2011.
- ^ а б «Объект значения». Wiki Портлендского репозитория паттернов. Cunningham & Cunningham, Inc. (c2.com). Получено 6 сентября 2012.
- ^ «Объект значения должен быть неизменным». Wiki Портлендского репозитория паттернов. Cunningham & Cunningham, Inc. (c2.com). Получено 6 сентября 2012.
- ^ Бернс, Сэм. «Ценность объекта-ценности». sam-burns.co.uk.
- ^ «Классы и структуры (Руководство по программированию на C #)». Сеть разработчиков Microsoft (msdn.microsoft.com). 2012 г.. Получено 5 сентября 2012.
- ^ «Создание объекта неизменяемого значения в C # - Часть III - Использование структуры». WebLog Луки Болоньезе. 2012 г.. Получено 7 сентября 2012.
- ^ Коирала, Шивпрасад. «Неизменяемые объекты в C # - CodeProject». www.codeproject.com. Получено 2017-12-26.
- ^ коирала, Шивпрасад. «Шаблон проектирования объекта значения в C #». www.codeproject.com. Получено 2017-12-26.
- ^ «Спецификация языка Java, глава 4. Типы, значения и переменные». Получено 7 октября 2015.
- ^ «JEP 169: Объекты-значения». Получено 7 октября 2015.
- ^ «Неизменяемые объекты». Сборник практик Java. 2012. Получено 5 сентября 2012.
- ^ следовательно, назначается только в конструкторы
- ^ «VALJOs - Ценные объекты Java». Получено 19 октября 2014.
- ^ «Проект Валгалла». Получено 7 августа 2018.
- ^ «Развитие языка Java с помощью @BrianGoetz». Получено 7 августа 2018.