En el tema anterior estudiamos las entidades, que se reconocen por su identidad y continuidad en el tiempo. Ahora veremos otro tipo de elemento muy importante en el modelo de dominio: los objetos de valor. Un objeto de valor no se reconoce por una identidad propia, sino por el significado de sus atributos.
Ejemplos habituales de objetos de valor son Dirección, Dinero, Rango de fechas, Coordenada, Porcentaje, Teléfono, Correo electrónico, Documento de identidad o Franja horaria. Su importancia no está en distinguir una instancia de otra por un identificador, sino en representar correctamente un valor significativo para el dominio.
Podemos definir un objeto de valor de la siguiente manera:
Dos objetos de valor con los mismos atributos representan el mismo valor para el dominio. Por ejemplo, dos importes de $1000 en la misma moneda son equivalentes. Dos rangos de fechas con el mismo inicio y fin representan el mismo período. Dos direcciones con la misma calle, número, ciudad y provincia pueden considerarse el mismo valor, según el contexto.
La característica principal de un objeto de valor es que se compara por sus atributos. A diferencia de una entidad, no importa si fue creado en otro momento o en otra parte del sistema. Si contiene los mismos valores relevantes, se considera equivalente.
Por ejemplo, si dos turnos tienen una franja horaria de 10:00 a 10:30 del mismo día, esas franjas pueden ser iguales como valor. No necesitamos preguntar cuál es "la franja original" si el dominio solo necesita comparar el período representado.
Los objetos de valor suelen tratarse como inmutables. Esto significa que, una vez creados, no deberían modificarse internamente. Si necesitamos un valor distinto, se crea un nuevo objeto de valor.
Por ejemplo, si una dirección cambia, no modificamos conceptualmente la dirección anterior para convertirla en otra. Registramos una nueva dirección para la entidad correspondiente. Si un importe cambia de $1000 a $1200, no es el mismo valor modificado: es otro importe.
La inmutabilidad ayuda a evitar errores, simplifica comparaciones y hace más claro el historial. También evita que un cambio accidental en un valor compartido afecte otros lugares del sistema.
La diferencia entre entidad y objeto de valor se basa en la identidad. Una entidad conserva identidad aunque cambien sus datos. Un objeto de valor, en cambio, es reemplazado cuando cambian sus atributos.
Un Paciente es una entidad porque debe ser reconocido como el mismo paciente a través del tiempo. Una Dirección puede ser un objeto de valor porque lo importante es su composición: calle, número, localidad y provincia. Si la dirección cambia, la entidad Paciente sigue siendo la misma, pero su dirección pasa a ser otro valor.
Dinero es un ejemplo clásico de objeto de valor. No alcanza con guardar un número; también importa la moneda. Un importe de 100 pesos no es igual a 100 dólares. Por eso, un objeto de valor Dinero podría incluir monto y moneda.
Además, Dinero puede tener reglas propias: no permitir montos negativos en ciertos contextos, redondear según la moneda, comparar importes solo si tienen la misma moneda o convertir valores mediante una tasa de cambio cuando el dominio lo permita.
Representar Dinero como objeto de valor evita tratar importes como números sueltos sin significado.
Dirección puede modelarse como objeto de valor cuando lo importante es el conjunto de datos que la forman. Calle, número, ciudad, provincia y código postal componen un valor que describe ubicación. Dos direcciones con los mismos datos pueden considerarse iguales.
Sin embargo, hay dominios donde una dirección puede requerir identidad propia, historial, validaciones externas o georreferenciación compleja. En esos casos, podría modelarse de otra manera. La decisión depende del dominio, no de una regla universal.
En un sistema de turnos, una Franja horaria puede ser un objeto de valor si representa un período con fecha, hora de inicio y hora de fin. Su igualdad se basa en esos atributos. Dos franjas con la misma fecha y el mismo rango horario representan el mismo valor temporal.
Pero una Agenda puede contener muchas franjas disponibles, reservadas o bloqueadas. Allí debemos decidir si la franja es solo un valor que describe tiempo o si se convierte en una entidad con identidad, estado e historial. La respuesta depende de las reglas del negocio.
Un objeto de valor puede contener varios atributos y reglas. No debe confundirse con un dato simple. Por ejemplo, un Correo electrónico puede parecer solo texto, pero puede tener formato válido, normalización y reglas de comparación. Un Rango de fechas puede tener fecha de inicio, fecha de fin y la regla de que el inicio no puede ser posterior al fin.
Los objetos de valor permiten agrupar datos que juntos tienen significado. Esto evita que el modelo quede lleno de atributos sueltos sin reglas claras.
Muchos objetos de valor protegen reglas pequeñas pero importantes. Un Porcentaje puede asegurar que el valor esté entre 0 y 100. Un Rango de fechas puede asegurar que tenga inicio y fin válidos. Un Documento de identidad puede asegurar formato, tipo y número.
Estas reglas no pertenecen necesariamente a una entidad mayor. Si se repiten en varios lugares, conviene darles un nombre y una estructura propia dentro del dominio.
Conviene considerar un objeto de valor cuando:
La siguiente tabla resume diferencias entre entidades y objetos de valor:
| Aspecto | Entidad | Objeto de valor |
|---|---|---|
| Identidad | Tiene identidad propia. | No tiene identidad propia. |
| Igualdad | Se compara por identidad. | Se compara por atributos. |
| Cambio | Puede cambiar y seguir siendo la misma. | Si cambia, se reemplaza por otro valor. |
| Ejemplos | Paciente, Turno, Pedido, Factura. | Dirección, Dinero, Rango de fechas, Correo electrónico. |
| Pregunta clave | ¿Necesitamos seguirlo a través del tiempo? | ¿Representa el mismo valor si sus atributos son iguales? |
En un diagrama conceptual, los objetos de valor pueden mostrarse como clases conceptuales relacionadas con entidades. Por ejemplo, Paciente puede tener Dirección y Correo electrónico. Turno puede tener Franja horaria. Pago puede tener Dinero como importe.
No siempre hace falta dibujar todos los objetos de valor. Conviene representarlos cuando aclaran reglas, reducen ambigüedad o muestran un significado importante del dominio. Si solo agregan ruido, pueden quedar documentados en texto o aparecer más adelante.
Al modelar objetos de valor, suelen aparecer estos errores:
Los objetos de valor permiten representar significados importantes sin crear identidades innecesarias. Ayudan a expresar mejor conceptos como importes, direcciones, períodos, porcentajes y datos compuestos que poseen reglas propias. Su igualdad por atributos y su inmutabilidad los hacen especialmente útiles para construir modelos claros y consistentes.
En el próximo tema estudiaremos los atributos del dominio, diferenciando datos relevantes, datos derivados y datos calculados.