Articulo de referencia

Objeto de valor

En informática , un objeto de valor es un objeto pequeño que representa una entidad cuya igualdad no se basa en la identidad : es decir, dos objetos de valor son iguales cuando ...

En informática , un objeto de valor es un objeto pequeño que representa una entidad cuya igualdad no se basa en la identidad : es decir, dos objetos de valor son iguales cuando tienen el mismo valor , no necesariamente siendo el mismo objeto . [ 1 ] [ 2 ]

Ejemplos de objetos de valor son aquellos que representan una cantidad de dinero o un rango de fechas.

Al ser pequeños, se pueden tener múltiples copias del mismo objeto de valor que representan la misma entidad : a menudo es más sencillo crear un nuevo objeto en lugar de depender de una sola instancia y usar referencias a ella. [ 2 ]

Los objetos de valor deben ser inmutables : [ 3 ] Esto es necesario para el contrato implícito de que dos objetos de valor creados iguales deben permanecer iguales. También es útil que los objetos de valor sean inmutables, ya que el código del cliente no puede poner el objeto de valor en un estado inválido ni introducir un comportamiento erróneo después de la instanciación. [ 4 ]

Los objetos de valor se encuentran entre los componentes básicos de DDD .

Implementación

Debido a los matices de los distintos lenguajes de programación orientados a objetos , cada uno tiene sus propios métodos y patrones para implementar y utilizar objetos de valor.

DO#

En C# , una clase es un tipo de referencia, mientras que una estructura (concepto derivado de la estructura en el lenguaje C ) es un tipo de valor. [ 5 ] Por lo tanto, una instancia derivada de la definición de una clase es un objeto, mientras que una instancia derivada de la definición de una estructura se denomina objeto de valor (para ser precisos, una estructura puede hacerse inmutable para representar un objeto de valor declarando atributos como de solo lectura [ 6 ] ).

El siguiente procedimiento se puede llevar a cabo para agregar propiedades de objetos de valor a una clase de C#:

  1. Sobrescribe el Object.Equalsmétodo para asegurar que el objeto se compare utilizando la lógica de negocio.
  2. El operador sobrecarga el comportamiento predeterminado ==y !=utiliza el Equalsmétodo.
  3. Sobrescribe el Object.GetHashCodemétodo y asegúrate de que el hash sea el mismo para los objetos que tengan la misma igualdad.
  4. Haga que la clase sea inmutable [ 7 ] eliminando cualquier método setter de propiedades y pasando solo los valores de los miembros a través de los constructores. [ 8 ]

Ejemplo:

registro público Dirección de la calle ( cadena Calle , cadena Ciudad );

o con una sintaxis más detallada:

clase pública DirecciónCalle { public DirecciónCalle ( string calle , string ciudad ) { Calle = calle ; Ciudad = ciudad ; }public string Calle { obtener ; } public string Ciudad { obtener ; } }

C++

En C++, se puede construir un objeto de valor sobrecargando el operador de asignación y utilizando restricciones de constancia apropiadas en los campos (que serán evaluados una sola vez por la lista de inicialización del constructor) y en los métodos de la clase.

Sin embargo, si los campos en sí mismos se declaran como constantes (en lugar de usar campos no constantes mientras solo se exponen los accesores "getter"), entonces no será posible sobrescribir completamente dicho objeto de valor con otro ( object1 = object2).

Pitón

Python tiene clases de datos que proporcionan pruebas de igualdad y se pueden hacer inmutables usando el frozenparámetro. [ 9 ]

from dataclasses import dataclass@dataclass ( frozen = True ) class StreetAddress : """Representa una dirección postal."""calle : str ciudad : str

Java

Los objetos de valor están disponibles desde Java 14, como registros de datos [ 10 ].

A diferencia de C# y C++, Java no admite tipos de valor personalizados a nivel de lenguaje. Cada tipo personalizado es un tipo de referencia y, por lo tanto, posee semántica de identidad y referencia, [ 11 ] aunque se está considerando ampliar la compatibilidad con tipos de valor personalizados. [ 12 ]

Por lo tanto, los programadores de Java emulan los objetos de valor creando objetos inmutables, [ 13 ] porque si el estado de un objeto no cambia, pasar referencias es semánticamente equivalente a copiar objetos de valor.

Una clase puede hacerse inmutable declarando todos los atributos como blank final [ 14 ] y declarando que todos los atributos sean de un tipo inmutable (como String , Integer o cualquier otro tipo declarado de acuerdo con estas reglas), no de un tipo mutable como ArrayList o incluso Date . También deben definir equals y hashCode para comparar valores en lugar de referencias.

El término "VALJO" (VALue Java Object) se ha acuñado para referirse al conjunto de reglas más estrictas necesarias para un objeto de valor inmutable correctamente definido. [ 15 ]

clase pública DirecciónCalle { public final String calle ; public final String ciudad ;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 ) ; } }

Java 14  :

Registro público Dirección de la calle ( Cadena calle , Cadena ciudad ) {}

Kotlin

clase de datos DirecciónCalle ( val calle : String , val ciudad : String )

En Kotlin, cualquier clase puede tener un atajo de constructor antes del cuerpo de la clase (si es que existe un cuerpo), que también funciona como declaración de campos y asignación a esos campos. Agregar la palabra clave `data` genera implementaciones de `equals`, `hashCode` y similares.

Rubí

Ruby tiene soporte para objetos de valor inmutables a través de la Data.defineclase (introducida en Ruby 3.2), que proporciona automáticamente igualdad, hash e inmutabilidad. [ 16 ]

Dirección = Datos.define ( : calle , : ciudad )

Véase también

Referencias

  1. Fowler, Martin (2003). "Objeto de valor" . Catálogo de patrones de arquitectura de aplicaciones empresariales . Martin Fowler (martinfowler.com) . Consultado el 17 de julio de 2011 .
  2. 1 2 "Objeto de valor" . Wiki del repositorio de patrones de Portland . Cunningham & Cunningham, Inc. (c2.com) . Consultado el 6 de septiembre de 2012 .
  3. "El objeto de valor debe ser inmutable" . Wiki del repositorio de patrones de Portland . Cunningham & Cunningham, Inc. (c2.com) . Consultado el 6 de septiembre de 2012 .
  4. Burns, Sam. "El valor de un objeto de valor" . sam-burns.co.uk .{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace )
  5. "Clases y estructuras (Guía de programación de C#)" . Microsoft Developer Network (msdn.microsoft.com). 2012. Consultado el 5 de septiembre de 2012 .
  6. "Creación de un objeto de valor inmutable en C# - Parte III - Uso de una estructura" . Blog de Luca Bolognese. 2012. Consultado el 7 de septiembre de 2012 .
  7. Koirala, Shivprasad. "Objetos inmutables en C# - CodeProject" . www.codeproject.com . Consultado el 26 de diciembre de 2017 .
  8. koirala, Shivprasad. "Patrón de diseño de objeto de valor en C#" . www.codeproject.com . Consultado el 26 de diciembre de 2017 .
  9. "dataclasses — Clases de datos" . Documentación de Python . Consultado el 7 de junio de 2023 .
  10. "Los discos llegan a Java" . Consultado el 13 de abril de 2021 .
  11. "Especificación del lenguaje Java, capítulo 4. Tipos, valores y variables" . Consultado el 7 de octubre de 2015 .
  12. "JEP 169: Objetos de valor" . Consultado el 7 de octubre de 2015 .
  13. "Objetos inmutables" . Prácticas Java recopiladas . 2012. Consultado el 5 de septiembre de 2012 .
  14. por lo tanto, solo se puede asignar en los constructores
  15. "VALJOs - Value Java Objects" . Consultado el 19 de octubre de 2014 .
  16. "Clase: Datos" . Documentación de Ruby . Consultado el 29 de septiembre de 2025 .