Объект значения
В информатике объект -значение — это небольшой объект , который представляет собой простую сущность , равенство которой не основано на идентичности : т.е. два объекта-значения равны , когда они имеют одинаковое значение , и не обязательно являются одним и тем же объектом . [1] [2]
Примерами объектов значений являются объекты, представляющие сумму денег или диапазон дат.
Будучи небольшим, можно иметь несколько копий одного и того же объекта значения, которые представляют одну и ту же сущность : часто проще создать новый объект, чем полагаться на один экземпляр и использовать ссылки на него. [2]
Объекты значений должны быть неизменяемыми : [3] это необходимо для неявного контракта, согласно которому два объекта значений, созданные равными , должны оставаться равными. Также полезно, чтобы объекты значений были неизменяемыми, поскольку клиентский код не может перевести объект значения в недопустимое состояние или ввести ошибочное поведение после создания экземпляра. [4]
Объекты-значения входят в число строительных блоков DDD .
Выполнение
[ редактировать ]Из-за нюансов различных объектно-ориентированных языков программирования каждый имеет свои методы и шаблоны реализации и использования объектов -значений.
С#
[ редактировать ]В C# класс , является ссылочным типом а структура (концепция, производная от структуры в языке C ) — это тип значения. [5] Следовательно, экземпляр, полученный из определения класса, является объектом, а экземпляр, полученный из определения структуры, называется объектом значения (точнее, структуру можно сделать неизменяемой, чтобы представлять объект значения, объявляя атрибуты только для чтения). [6] ).
Для добавления свойств объекта значения в класс C# можно выполнить следующую процедуру:
- Переопределить
Object.Equals
метод, гарантирующий сравнение объекта с использованием бизнес-логики - Оператор перегружает поведение по умолчанию
==
и!=
использоватьEquals
метод. - Переопределить
Object.GetHashCode
метод и убедитесь, что хэш одинаков для объектов, имеющих одинаковое равенство. - Сделать класс неизменяемым [7] удаляя все установщики свойств и передавая только значения членов через конструкторы. [8]
Пример:
public record StreetAddress(string Street, string City);
или с более подробным синтаксисом:
public class StreetAddress
{
public StreetAddress(string street, string city)
{
Street = street;
City = city;
}
public string Street { get; }
public string City { get; }
}
С++
[ редактировать ]В C++ объект значения может быть построен путем перегрузки оператора присваивания и использования соответствующих ограничений константности для полей (которые будут оцениваться один раз в списке инициализаторов конструктора) и для методов класса.
Однако если сами поля объявлены константными (вместо того, чтобы использовать неконстантные поля, предоставляя только методы доступа «getter»), то будет невозможно полностью перезаписать такой объект значения другим ( object1 = object2
).
Питон
[ редактировать ]В Python есть классы данных, которые обеспечивают проверку на равенство и могут быть сделаны неизменяемыми с помощью frozen
параметр. [9]
from dataclasses import dataclass
@dataclass(frozen=True)
class StreetAddress:
"""Represents a street address."""
street: str
city: str
Ява
[ редактировать ]Объекты значений доступны начиная с Java 14 в виде записей данных. [10]
В отличие от C# и C++, Java не поддерживает пользовательские типы значений на уровне языка. Каждый пользовательский тип является ссылочным типом и, следовательно, имеет семантику идентификации и ссылки. [11] хотя рассматривается расширение поддержки пользовательских типов значений. [12]
Поэтому программисты Java эмулируют объекты-значения, создавая неизменяемые объекты. [13] потому что, если состояние объекта не меняется, передача ссылок семантически эквивалентна копированию объектов-значений.
Класс можно сделать неизменяемым, объявив все атрибуты пустыми Final . [14] и объявление всех атрибутов неизменяемым типом (например, Нить , Integer или любой другой тип, объявленный в соответствии с этими правилами), не изменяемого типа, такого как ArrayList или даже Дата . Им также следует определить равенства и hashCode для сравнения значений, а не ссылок.
Термин «VALJO» (объект Java VALue) был придуман для обозначения более строгого набора правил, необходимых для правильно определенного объекта неизменяемого значения. [15]
public class StreetAddress {
public final String street;
public final String city;
public StreetAddress(String street, String city) {
this.street = street;
this.city = city;
}
public boolean equals(StreetAddress that) {
return getClass()==that.getClass() && street==that.street && city==that.city;
}
public int hashCode() {
return Objects.hash(street, city);
}
}
Ява 14:
public record StreetAddress (String street, String city) {}
Котлин
[ редактировать ]data class StreetAddress(val street: String, val city: String)
В Kotlin любой класс может иметь ярлык конструктора перед телом класса (если тело вообще существует), который одновременно выполняет функцию объявления полей и назначения этим полям. Добавление ключевого слова `data` приводит к генерации реализаций `equals`, `hashCode` и т.п.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Фаулер, Мартин (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. Использование структуры» . Веб-журнал Луки Болоньезе. 2012 . Проверено 7 сентября 2012 г.
- ^ Койрала, Шивпрасад. «Неизменяемые объекты в C# — CodeProject» . www.codeproject.com . Проверено 26 декабря 2017 г.
- ^ койрала, Шивпрасад. «Шаблон проектирования объекта значения в C#» . www.codeproject.com . Проверено 26 декабря 2017 г.
- ^ «классы данных — классы данных» . Документация Python . Проверено 7 июня 2023 г.
- ^ «Рекорды приходят на Яву» . Проверено 13 апреля 2021 г.
- ^ «Спецификация языка Java, глава 4. Типы, значения и переменные» . Проверено 7 октября 2015 г.
- ^ «JEP 169: Объекты значений» . Проверено 7 октября 2015 г.
- ^ «Неизменяемые объекты» . Сборник практик Java . 2012 . Проверено 5 сентября 2012 г.
- ^, следовательно, может быть назначен только в конструкторах
- ^ «VALJOs — значения Java-объектов» . Проверено 19 октября 2014 г.