Arquitectura Empresarial - Value Object

Un Value Object es un objeto que representa un valor y no tiene identidad. Lo único que importa es su valor, dos Value Objects son iguales si sus valores son iguales.

Una característica importante es que son objetos inmutables, no se pueden modificar. La única forma válida de crear Value Objects es pasar toda la información requerida al constructor y validando dicha información en algún método interno.

Los Value Objects son objetos pequeños y simples, útiles para representar conceptos como cantidades de dinero, rangos de fechas, o coordenadas geográficas, donde los valores encapsulados son lo que realmente importan.

¿Cuándo usarlo?

Este patrón es ideal cuando se necesita modelar y trabajar con conceptos o valores que no requieren identidad persistente o seguimiento de cambios en el estado del objeto.

Es útil para:

  • Representar cantidades, medidas, o datos que son esencialmente descriptivos y comparables por su valor.
  • Reducir la complejidad y mejorar la claridad del diseño al tratar con valores inmutables en la lógica de negocio.
  • Aumentar la seguridad del diseño al evitar cambios no intencionados en datos que no deberían modificarse una vez establecidos.

Ventajas

  • Inmutabilidad: Al ser inmutables, los Value Objects son seguros para usar en aplicaciones concurrentes y no presentan problemas de cambios inesperados en el estado.
  • Eficiencia: Pueden mejorar el rendimiento y la eficiencia del uso de la memoria si se implementan correctamente, especialmente con técnicas de instanciación compartida para objetos de valor común.
  • Facilidad de prueba: La inmutabilidad y la simplicidad de los Value Objects facilitan la escritura de pruebas unitarias claras y concisas.

Desventajas

  • Sobrecarga potencial: Crear un nuevo objeto para cada operación o transformación puede llevar a una sobrecarga si no se maneja cuidadosamente, especialmente en contextos de alta performance.
  • Mal uso: Puede ser tentador abusar del patrón Value Object para conceptos que en realidad requieren identidad y mutabilidad, lo cual puede llevar a un diseño inadecuado.

Ejemplo Detallado en 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 Dinero sumar(Dinero otro) {
          if (!this.moneda.equals(otro.moneda)) {
              throw new IllegalArgumentException("No se pueden sumar cantidades de diferentes monedas.");
          }
          return new Dinero(this.cantidad.add(otro.cantidad), this.moneda);
      }
  
      // Getters y otros métodos, sin setters para mantener la inmutabilidad
  }
            

Conclusiones

El patrón Value Object se usa para representar conceptos de dominio de manera eficiente, segura y clara, objetos pequeños y simples.

Al enfocarse en el valor, más que en su identidad, ayuda a simplificar la lógica de negocio y mejora la claridad del código.

Los Value Objects facilitan el diseño y la implementación de operaciones de negocio complejas de una manera más intuitiva y segura.