Un evento de dominio es un hecho importante para el negocio que ya ocurrió. No expresa una intención futura ni una orden pendiente, sino algo que el dominio considera relevante y que puede tener consecuencias. Por ejemplo: Turno reservado, Turno cancelado, Paciente ausente, Agenda publicada, Pedido confirmado o Pago registrado.
Los eventos ayudan a entender cómo cambia el dominio a lo largo del tiempo. También permiten descubrir reglas, consecuencias, integraciones, notificaciones, historial y procesos que se inician después de que algo ocurre.
Un evento de dominio representa algo que sucedió y que tiene significado dentro del negocio. Debe nombrarse en pasado porque describe un hecho ya ocurrido. Por ejemplo, "Turno reservado" es un evento; "Reservar turno" es una acción o comando.
No todo cambio técnico es un evento de dominio. "Registro insertado" o "campo actualizado" pueden ser eventos técnicos, pero no necesariamente tienen significado para los expertos del negocio.
Los eventos permiten reconstruir la historia del dominio. Si sabemos que un turno fue reservado, confirmado, cancelado o marcado como ausente, podemos entender qué pasó y por qué el objeto está en su estado actual.
También permiten descubrir consecuencias. Cuando ocurre Turno cancelado, quizás se libera una franja horaria, se envía una notificación, se registra una penalización o se habilita una lista de espera. Un evento importante rara vez queda aislado.
Un comando expresa una intención de hacer algo. Un evento expresa que algo ya ocurrió. "Reservar turno" es un comando o acción solicitada. "Turno reservado" es el evento resultante si la acción fue aceptada por el dominio.
Esta diferencia es importante porque un comando puede fallar. Un paciente puede intentar reservar un turno, pero la reserva puede rechazarse si la franja ya está ocupada. En ese caso no ocurrió Turno reservado.
Un estado describe la situación actual de un objeto. Un evento describe algo que ocurrió en un momento. "Reservado" puede ser el estado actual de un turno. "Turno reservado" es el hecho que llevó al turno a ese estado.
Un mismo estado puede alcanzarse por distintos caminos. Por eso, los eventos son útiles para conservar historia y explicar cómo se llegó a una situación.
Los eventos deben nombrarse con el lenguaje del dominio y en tiempo pasado. Algunos ejemplos:
Evitemos nombres técnicos como "UpdateTurnoEjecutado" o "InsertAgendaOK". Esos nombres hablan de implementación, no del dominio.
Un evento puede incluir la información necesaria para entender el hecho ocurrido. Por ejemplo, Turno cancelado puede registrar fecha de cancelación, motivo, usuario que canceló y si fue dentro o fuera de término.
No siempre debe contener todos los datos del objeto relacionado. Debe incluir lo necesario para interpretar el evento, aplicar consecuencias, auditar o comunicar el hecho según las necesidades del dominio.
Muchos eventos disparan consecuencias. Cuando ocurre Pago registrado, un pedido puede pasar a pagado. Cuando ocurre Turno cancelado, puede liberarse una franja. Cuando ocurre Paciente ausente registrado, puede incrementarse un contador de inasistencias.
En análisis de dominio, conviene preguntar: ¿qué debe ocurrir después de este evento?, ¿quién necesita enterarse?, ¿qué reglas se activan?, ¿qué historial debe quedar?
Un evento puede ser importante para más de un área del negocio. Por ejemplo, cuando un turno se cancela, recepción puede necesitar liberar la agenda, el paciente puede recibir una notificación y administración puede registrar una penalización si corresponde.
Modelar eventos ayuda a descubrir estas conexiones. También evita que un proceso quede oculto dentro de una única pantalla o función técnica.
Los eventos suelen aparecer en frases como "cuando ocurre", "después de", "una vez que", "al confirmarse", "si se cancela" o "cuando vence". Estas expresiones indican hechos que pueden cambiar el estado del dominio o iniciar nuevos procesos.
Por ejemplo, la frase "Cuando el paciente cancela fuera de término, se registra una inasistencia" revela al menos dos eventos posibles: Turno cancelado e Inasistencia registrada.
En una reserva de turno podemos distinguir varios elementos:
La siguiente tabla muestra eventos y posibles consecuencias:
| Evento | Qué significa | Posibles consecuencias |
|---|---|---|
| Turno reservado | Un paciente obtuvo una franja de atención. | Bloquear franja, enviar confirmación. |
| Turno cancelado | Un turno dejó de estar reservado o confirmado. | Liberar franja, notificar, evaluar penalización. |
| Paciente ausente registrado | El paciente no asistió a un turno previsto. | Actualizar historial, aplicar política de inasistencias. |
| Agenda publicada | La agenda quedó disponible para reservar turnos. | Mostrar horarios, habilitar reservas. |
| Pago registrado | Se reconoció un pago válido. | Actualizar estado, emitir comprobante. |
Algunos eventos tienen valor de auditoría. Permiten saber qué ocurrió, cuándo, por quién y con qué motivo. Esto puede ser importante en dominios médicos, financieros, legales, administrativos o comerciales.
No todo evento necesita conservarse con el mismo nivel de detalle. El modelo debe distinguir qué hechos son relevantes para el negocio y cuáles son solo detalles técnicos sin valor histórico.
Los eventos suelen estar ligados al tiempo. Fecha y hora del evento pueden ser fundamentales para aplicar reglas. Una cancelación puede ser dentro o fuera de término según el momento en que ocurrió. Un pago puede ser válido si se registró antes del vencimiento. Una confirmación puede expirar si no ocurre a tiempo.
Por eso, cuando un evento afecta reglas temporales, conviene registrar con precisión cuándo ocurrió y qué reloj o referencia temporal usa el dominio.
Estas preguntas ayudan a identificar eventos de dominio:
Al modelar eventos de dominio, suelen aparecer estos errores:
Los eventos de dominio permiten representar hechos relevantes que ya ocurrieron y que pueden cambiar el estado del modelo, iniciar consecuencias o dejar historial. Son una herramienta poderosa para comprender procesos, descubrir reglas y conectar áreas del negocio.
En el próximo tema compararemos comandos, consultas y eventos para distinguir intención, lectura y resultado dentro del modelo de dominio.