Un modelo de dominio no debería ser solo una colección de datos. También debe expresar reglas, comportamiento y responsabilidades del negocio. Cuando los conceptos del dominio solo tienen atributos y todas las decisiones quedan en servicios externos, suele hablarse de modelo anémico.
En cambio, un modelo expresivo ubica parte importante del comportamiento dentro de los conceptos que tienen sentido para el dominio. Las entidades, objetos de valor, agregados y servicios de dominio colaboran para representar reglas y acciones con nombres cercanos al lenguaje del negocio.
Un modelo anémico es un modelo donde los objetos del dominio tienen datos, pero casi no tienen comportamiento. Las reglas importantes quedan dispersas en servicios, controladores, procedimientos, pantallas o consultas. Las entidades se vuelven estructuras pasivas que solo almacenan atributos.
Por ejemplo, si Turno solo tiene fecha, hora, paciente y estado, pero toda regla sobre reservar, cancelar, confirmar o atender está en un servicio genérico, el modelo puede ser anémico. El concepto existe, pero no expresa suficientemente su comportamiento.
Un modelo expresivo representa datos y comportamiento del dominio de manera coherente. Las entidades protegen sus invariantes, los objetos de valor validan sus propios valores, los agregados controlan sus reglas internas y los servicios de dominio se usan cuando una operación no pertenece naturalmente a un solo objeto.
Por ejemplo, Turno puede expresar operaciones como reservar, cancelar, confirmar o registrar atención, siempre que esas responsabilidades correspondan a su ciclo de vida. Agenda puede controlar la incorporación de franjas sin superposición. Dinero puede asegurar moneda y monto válidos.
Asignar responsabilidades significa decidir qué concepto debe conocer y proteger cada regla. No se trata de poner todo dentro de una entidad ni de poner todo en servicios. Se trata de ubicar cada comportamiento donde resulte natural según el dominio.
Una regla sobre el formato de un correo puede pertenecer al objeto de valor Correo electrónico. Una regla sobre transición de estado puede pertenecer a Turno. Una regla sobre franjas superpuestas puede pertenecer a Agenda. Una regla que coordina varios agregados puede pertenecer a un servicio de dominio.
Algunas señales frecuentes son:
Un modelo expresivo suele mostrar estas señales:
En un enfoque anémico, un servicio externo podría cambiar directamente el estado de Turno a cancelado, modificar la franja, actualizar historial y decidir penalizaciones sin que Turno o sus conceptos relacionados protejan reglas.
En un enfoque más expresivo, Turno puede decidir si su estado permite cancelación. Una Política de cancelación puede evaluar anticipación y consecuencias. Agenda puede liberar la franja si corresponde. Cada concepto participa según su responsabilidad.
Evitar un modelo anémico no significa poner todo dentro de las entidades. Algunas operaciones pertenecen a objetos de valor, agregados o servicios de dominio. Una entidad que conoce demasiadas cosas externas puede volverse difícil de mantener.
El objetivo es distribuir comportamiento de forma coherente. Si una regla pertenece naturalmente a una entidad, conviene ubicarla allí. Si involucra varios conceptos, puede requerir servicio de dominio. Si protege un valor, puede pertenecer al objeto de valor.
Los servicios de dominio son útiles, pero si se usan para todo, el modelo pierde expresividad. Cuando cada operación se resuelve en un servicio y las entidades solo contienen datos, los servicios se transforman en el verdadero modelo y las entidades quedan vacías de significado.
Antes de crear un servicio, conviene preguntar si la responsabilidad pertenece a una entidad, un objeto de valor o una raíz de agregado. El servicio debe aparecer cuando mejora el modelo, no cuando evita pensar responsabilidades.
Una regla suele ser más clara cuando está cerca de los datos y conceptos que protege. Si Rango horario debe tener inicio anterior a fin, esa regla pertenece al propio rango. Si Pedido no puede confirmarse vacío, esa regla pertenece al agregado Pedido.
Cuando la regla queda lejos del concepto, aumenta el riesgo de duplicarla, olvidarla o aplicarla de manera inconsistente.
Un modelo expresivo facilita pruebas del dominio. Podemos probar directamente que un Turno atendido no puede cancelarse, que una Agenda rechaza franjas superpuestas o que Dinero no permite una moneda inválida.
En un modelo anémico, muchas pruebas terminan pasando por servicios grandes y con demasiadas dependencias, lo que dificulta aislar reglas concretas.
La siguiente tabla resume diferencias habituales:
| Aspecto | Modelo anémico | Modelo expresivo |
|---|---|---|
| Entidades | Datos pasivos. | Datos y comportamiento significativo. |
| Reglas | Dispersas en servicios, pantallas o controladores. | Ubicadas cerca del concepto que las protege. |
| Nombres | Técnicos o genéricos. | Basados en lenguaje ubicuo. |
| Consistencia | Fácil de romper por modificaciones externas. | Protegida por entidades, valores y agregados. |
| Mantenimiento | Las reglas son difíciles de localizar. | El conocimiento del dominio está más visible. |
Estas preguntas ayudan a distribuir responsabilidades:
Al diseñar responsabilidades del dominio, suelen aparecer estos errores:
La diferencia entre un modelo anémico y uno expresivo está en la ubicación del conocimiento del dominio. Un modelo expresivo no solo nombra conceptos: también muestra qué pueden hacer, qué reglas protegen y cómo colaboran. Esto mejora la claridad del análisis y prepara una base más sólida para el diseño del software.
En el próximo tema veremos patrones frecuentes de modelado, como catálogo, pedido, reserva, cuenta y movimiento.