terminal

codeando_simple

terminal

menu

terminal

search_module

guest@codeandosimple: ~/system/search $ grep -r "" .

Press [ENTER] to execute search

Status

Engine: Ready

Database: Online

Index: V2.1.0_LATEST

bash — cat value-object.md
guest@codeandosimple: ~/enterprise/patterns $ cat value-object.md

Value Object_

// "Un gramo de práctica vale más que una tonelada de teoría"

Un Value Object es un pequeño objeto que representa una cantidad simple, como una suma de dinero, una fecha o un rango de celdas. Su identidad se basa en su valor en lugar de en una identidad única.

Lo que define a un Value Object es que dos instancias son consideradas iguales si tienen el mismo valor, independientemente de si son el mismo objeto en memoria.

# ¿Cuándo usarlo?

Es ideal para representar conceptos del dominio que no requieren una identidad persistente pero que agrupan atributos relacionados que siempre van juntos (como una Dirección o un Importe).

# Ventajas

  • verified

    Inmutabilidad

    Generalmente son inmutables, lo que previene efectos secundarios indeseados.

  • verified

    Claridad semántica

    Aporta significado al código al agrupar datos relacionados bajo un nombre descriptivo.

  • verified

    Facilidad de pruebas

    Al ser inmutables y no tener dependencias, son muy fáciles de probar.

# Desventajas

  • warning

    Sobrecarga de memoria

    La creación de muchos objetos pequeños puede impactar ligeramente en el rendimiento en casos extremos.

  • warning

    Dificultad en ORMs

    Algunos mapeadores objeto-relacional pueden requerir configuración extra para manejarlos.

# Ejemplo Detallado en Java

Un ejemplo clásico de un Value Object para representar una Moneda:

Dinero.java

public final class Dinero {
    private final BigDecimal cantidad;
    private final String moneda;

    public Dinero(BigDecimal cantidad, String moneda) {
        this.cantidad = cantidad;
        this.moneda = moneda;
    }

    public BigDecimal getCantidad() { return cantidad; }
    public String getMoneda() { return moneda; }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Dinero)) return false;
        Dinero dinero = (Dinero) o;
        return Objects.equals(cantidad, dinero.cantidad) &&
               Objects.equals(moneda, dinero.moneda);
    }

    @Override
    public int hashCode() {
        return Objects.hash(cantidad, moneda);
    }
}

# Conclusiones

El patrón Value Object simplifica la lógica de negocio al tratar a los objetos pequeños como valores inmutables en lugar de entidades con ciclos de vida complejos. Esto mejora la robustez y mantenibilidad del sistema.