En el tema anterior vimos que un diagrama de secuencia muestra participantes y mensajes ordenados en el tiempo. Ahora profundizaremos en algunos elementos que permiten representar con más precisión una interacción: tipos de mensajes, activaciones, retornos y creación de objetos.
Estos recursos ayudan a explicar qué participante ejecuta una acción, qué resultado se devuelve, cuándo se crea un objeto y cómo se comunican las partes del sistema. No siempre es necesario usar todos; conviene incorporarlos cuando aportan claridad al escenario.
Un mensaje representa una comunicación entre dos participantes. Puede ser una llamada a una operación, una solicitud a un servicio, una respuesta, un evento, una creación de objeto o una señal enviada a otro componente.
El nombre del mensaje debe expresar la intención de la comunicación. Por ejemplo, validarCredenciales(), consultarDisponibilidad(), registrarPago() o enviarConfirmación(). Nombres como procesar() o hacer() suelen ser demasiado generales.
Los mensajes muestran comunicaciones, las activaciones indican períodos de ejecución, los retornos representan respuestas y la creación de objetos permite mostrar cuándo aparece una nueva instancia durante el escenario. Combinados con criterio, estos elementos permiten describir una interacción de forma ordenada y precisa.
Un mensaje síncrono representa una llamada en la que el emisor espera que el receptor complete la operación antes de continuar. Es habitual en llamadas a métodos, servicios o funciones donde se necesita una respuesta inmediata para seguir el flujo.
Por ejemplo, un ControladorTurnos puede llamar a obtenerHorariosDisponibles() en ServicioTurnos y esperar la lista de horarios antes de responder a la interfaz.
Un mensaje asíncrono representa una comunicación en la que el emisor no queda obligado a esperar la finalización inmediata del receptor. Es útil para eventos, colas, notificaciones o tareas en segundo plano.
Por ejemplo, después de registrar un pedido, el sistema puede enviar un mensaje asíncrono a un ServicioNotificaciones para que envíe un correo. La operación principal puede continuar sin esperar todos los detalles del envío.
El mensaje de retorno representa una respuesta. Puede indicar un valor devuelto, una confirmación, un error o el resultado de una operación. Normalmente se dibuja con línea discontinua.
No todos los retornos deben dibujarse. Si cada mensaje síncrono tuviera siempre su retorno visible, muchos diagramas se volverían innecesariamente largos. Conviene mostrar retornos cuando el resultado influye en decisiones posteriores o cuando evita ambigüedad.
Un mensaje de creación indica que durante la interacción se crea un nuevo objeto. La flecha suele apuntar al encabezado del objeto creado, y su línea de vida comienza en ese punto del diagrama, no desde la parte superior.
Por ejemplo, un ServicioPedidos puede crear un nuevo objeto Pedido después de validar los datos de compra. Mostrar la creación es útil cuando la aparición del objeto forma parte importante del escenario.
La destrucción de un objeto puede representarse con una marca al final de su línea de vida. Indica que ese objeto deja de existir durante la interacción.
No es necesario mostrar destrucción en todos los diagramas. Se usa principalmente cuando el ciclo de vida del objeto es relevante para comprender el escenario, por ejemplo en objetos temporales, sesiones o recursos que deben liberarse.
UML permite representar mensajes cuyo origen o destino no se muestra completamente. Un mensaje encontrado parece venir desde fuera del diagrama. Un mensaje perdido sale hacia un destino que no se detalla.
Estos recursos son útiles cuando se quiere concentrar la vista en una parte del sistema sin modelar todo el entorno. Deben usarse con cuidado para no ocultar participantes importantes.
Una activación, o foco de control, muestra que un participante está ejecutando una operación durante un intervalo. Se dibuja como un rectángulo delgado sobre la línea de vida. Puede comenzar cuando llega un mensaje y terminar cuando se devuelve una respuesta o finaliza la operación.
Las activaciones ayudan a visualizar qué participante tiene el control en cada momento. En diagramas simples pueden omitirse; en diagramas técnicos pueden aportar precisión.
Una activación anidada ocurre cuando un participante, mientras está ejecutando una operación, invoca otra operación propia o de otro participante. Esto puede mostrar llamadas internas o delegaciones.
Conviene no abusar de activaciones anidadas. Si el diagrama empieza a parecer una traza completa de ejecución, tal vez se está mostrando demasiado detalle para el propósito del modelo.
Un auto-mensaje ocurre cuando un participante se envía un mensaje a sí mismo. Representa una llamada interna, una validación propia o una operación auxiliar dentro del mismo objeto o componente.
Por ejemplo, ServicioTurnos puede ejecutar internamente validarReglasDeReserva() antes de guardar un turno. Mostrar el auto-mensaje puede ser útil si esa validación es importante para entender el escenario.
Los mensajes pueden incluir parámetros y valores de retorno. Por ejemplo, buscarTurnos(fecha, especialidad) o horariosDisponibles como respuesta. Esto ayuda a aclarar qué información viaja entre participantes.
No conviene incluir listas largas de parámetros si no son necesarias para el objetivo del diagrama. En muchos casos alcanza con nombrar la operación y destacar solo los datos importantes.
Un mensaje puede tener una condición o guarda, por ejemplo [pago aprobado] enviarConfirmación(). Esto indica que el mensaje se envía solo si se cumple cierta condición.
Cuando existen varias alternativas, conviene usar fragmentos combinados como alt, opt o loop. Esos fragmentos se estudiarán en el próximo tema.
En un sistema de ventas, la interfaz envía confirmarCompra() al controlador. El controlador solicita al servicio que valide el carrito. Luego el servicio crea un objeto Pedido, genera sus líneas, calcula el total y solicita al repositorio que lo guarde. Finalmente se devuelve una confirmación.
En este escenario, el mensaje de creación del objeto Pedido es importante porque muestra en qué momento nace la entidad principal de la operación.
Después de reservar un turno, el sistema puede enviar una notificación al paciente. Si esa notificación no es necesaria para completar la reserva, puede representarse como un mensaje asíncrono hacia ServicioNotificaciones.
Esta decisión comunica que el flujo principal no depende de esperar el envío completo del mensaje. Es una diferencia importante frente a una llamada síncrona.
Un diagrama de secuencia no debe convertirse automáticamente en una traza de cada línea de código. Debe mostrar las comunicaciones relevantes para comprender el escenario. Si se agregan demasiados mensajes internos, el diagrama se vuelve difícil de leer y mantener.
Una buena práctica es comenzar con los participantes y mensajes principales. Luego se agregan activaciones, retornos, parámetros o creación de objetos solo cuando realmente aclaran el modelo.
Mensajes, activaciones, retornos y creación de objetos permiten representar con mayor precisión una interacción en un diagrama de secuencia. Usados con criterio, ayudan a entender responsabilidades, orden de ejecución y resultados importantes dentro de un escenario.
En el próximo tema veremos fragmentos combinados: alternativas, ciclos, opciones y paralelismo.