Jump to content

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

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

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

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

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

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

Выполнение

[ редактировать ]

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

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

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

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

См. также

[ редактировать ]
  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. Использование структуры» . Веб-журнал Луки Болоньезе. 2012 . Проверено 7 сентября 2012 г.
  7. ^ Койрала, Шивпрасад. «Неизменяемые объекты в C# — CodeProject» . www.codeproject.com . Проверено 26 декабря 2017 г.
  8. ^ койрала, Шивпрасад. «Шаблон проектирования объекта значения в C#» . www.codeproject.com . Проверено 26 декабря 2017 г.
  9. ^ «классы данных — классы данных» . Документация Python . Проверено 7 июня 2023 г.
  10. ^ «Рекорды приходят на Яву» . Проверено 13 апреля 2021 г.
  11. ^ «Спецификация языка Java, глава 4. Типы, значения и переменные» . Проверено 7 октября 2015 г.
  12. ^ «JEP 169: Объекты значений» . Проверено 7 октября 2015 г.
  13. ^ «Неизменяемые объекты» . Сборник практик Java . 2012 . Проверено 5 сентября 2012 г.
  14. ^, следовательно, может быть назначен только в конструкторах
  15. ^ «VALJOs — значения Java-объектов» . Проверено 19 октября 2014 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 46f9943104c455cca52798ecd88a0f08__1718209140
URL1:https://arc.ask3.ru/arc/aa/46/08/46f9943104c455cca52798ecd88a0f08.html
Заголовок, (Title) документа по адресу, URL1:
Value object - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)