Skip to content

Entidades value objects y agregados

DDD tactico ofrece patrones para modelar reglas de negocio sin convertir todo en tablas, DTOs o clases anemicas.

Entidades

Una entidad tiene identidad y ciclo de vida.

txt
User
Order
Course
Invoice

Dos pedidos con los mismos datos no son el mismo pedido si tienen IDs distintos.

Value objects

Un value object se define por sus valores, no por identidad.

txt
Money(amount, currency)
EmailAddress(value)
DateRange(start, end)
Address(street, city, country)

Son utiles para encapsular validaciones:

txt
EmailAddress
  - debe tener formato valido
  - se normaliza en minusculas

Agregados

Un agregado es un grupo de objetos que se modifica como una unidad consistente.

txt
Order
  OrderLine[]
  ShippingAddress
  PaymentStatus

El agregado tiene una raiz. Desde fuera se modifica a traves de esa raiz.

txt
order.addLine(product, quantity)
order.confirm()
order.cancel(reason)

Invariantes

Una invariante es una regla que siempre debe cumplirse.

Ejemplos:

  • Un pedido confirmado debe tener al menos una linea.
  • Una factura pagada no puede modificarse.
  • Un curso publicado debe tener titulo y al menos una leccion.
  • Una reserva no puede superar el aforo disponible.

Tamano del agregado

Agregados demasiado grandes generan bloqueos, transacciones pesadas y modelos dificiles de entender.

Regla practica:

  • Agrega lo que necesite consistencia inmediata.
  • Comunica lo demas con eventos.
  • Evita cargar colecciones enormes dentro de la raiz.

Checklist

  • Las entidades protegen reglas, no solo almacenan datos.
  • Los value objects eliminan strings y numeros ambiguos.
  • Los agregados tienen limites claros.
  • Las invariantes viven cerca del modelo que protegen.
  • No se modifican objetos internos saltandose la raiz del agregado.