Diagramas de secuencia UML
El diagrama de comportamiento que la gente dibuja de verdad. Los participantes arriba, el tiempo bajando, y cada mensaje en el orden en que ocurre - incluidas las ramas, los bucles y las llamadas que fallan.
15 min de lecturaUML 2.5.18 de 35
La respuesta corta
- Un diagrama de secuencia responde qué ocurre, en qué orden y entre quiénes. El tiempo baja, y la distancia vertical no dice nada sobre la duración.
- Una punta de flecha rellena significa que quien llama se bloquea; una abierta, que sigue adelante. Esa única distinción es lo más útil que la notación dice de un sistema distribuido.
- Las condiciones y la repetición son fragmentos combinados - alt, opt, loop, par, ref - cada uno un marco con su operador en la esquina superior izquierda.
- Con el camino feliz ya dibujado, los fallos se pueden contar: por cada mensaje pregunta qué pasa si no hay respuesta, si la respuesta es un error y si llega dos veces.
01Qué muestra#
Un diagrama de secuencia responde con precisión a una pregunta: qué ocurre, en qué orden y entre quiénes. Es el diagrama que dibujas cuando dos personas discrepan sobre qué servicio llama a cuál, o cuando un flujo cruza cuatro sistemas y nadie tiene el camino entero en la cabeza.
La disposición hace todo el trabajo. Los participantes se colocan arriba. El tiempo corre hacia abajo: no de izquierda a derecha, y no a escala. Un mensaje más abajo en la página ocurre después de uno más arriba, y esa es toda la regla de lectura.
02Líneas de vida, activaciones, mensajes#
Tres piezas de mobiliario, y todo lo demás es una variación de ellas.
Una línea de vida es la cabecera de arriba más la vertical discontinua que baja de ella. La cabecera nombra al participante. Puede ser un nombre de clase, un objeto (: Checkout), un actor dibujado como monigote, o un rol con un estereotipo como «boundary» o «control». Elijas lo que elijas, sé coherente en todo el diagrama.
Una barra de activación -a veces llamada ocurrencia de ejecución- es el rectángulo estrecho colocado sobre la línea de vida. Marca el intervalo durante el cual ese participante está haciendo algo. Barras anidadas significan que un participante se llamó a sí mismo. Las activaciones son opcionales en UML, y merecen la pena: dejan claro que Checkout sigue esperando mientras la pasarela trabaja.
Un mensaje es la flecha horizontal. Su estilo dice de qué tipo de llamada se trata, y esa es la parte que conviene memorizar.
03Los tipos de mensaje#
| Elemento | Notación | Qué significa |
|---|---|---|
| Síncrono | Línea sólida, punta rellena. El llamante se bloquea hasta recibir respuesta. Un método corriente o una llamada HTTP bloqueante. | |
| Asíncrono | Línea sólida, punta abierta. El llamante sigue de inmediato. Publicar en una cola o emitir un evento. | |
| Respuesta | Línea discontinua, punta abierta. El retorno. Etiquétala con lo que vuelve, no con la palabra «return». | |
| Create | Flecha discontinua que aterriza en la cabecera de una línea de vida que empieza más abajo. Marcada «create». | |
| Destroy | una cruz al final de la línea de vida | El participante deja de existir; su línea de vida termina en la cruz. |
La distinción entre punta rellena y punta abierta es la que tiene peso real. Es la diferencia entre «el llamante está ahora bloqueado» y «el llamante siguió adelante», y es lo más útil que un diagrama de secuencia le dice a un lector sobre un sistema distribuido.
04Ramificar: fragmentos combinados#
Los flujos reales tienen condiciones y repeticiones. UML resuelve ambas con un fragmento combinado: una caja dibujada alrededor de una serie de mensajes, con un operador en una etiqueta en su esquina superior izquierda.
alt- alternativas. Dividido por una línea discontinua en compartimentos, cada uno con una guarda entre corchetes. Se ejecuta exactamente uno. Esto es un if/else.opt- opcional. Un compartimento con guarda; se ejecuta o no. Esto es un if sin else.loop- repetición. La guarda da la condición o los límites, comoloop [1..*]oloop [mientras haya más páginas].par- paralelo. Los compartimentos se ejecutan concurrentemente, sin orden garantizado.ref- una referencia a una interacción definida en otro diagrama. Así se evita que un diagrama de secuencia crezca hasta tres páginas.critical- una región que no debe entrelazarse con nada más.
05El marco, las puertas y los mensajes de ninguna parte#
Todo lo anterior está dentro de una caja que la mayoría de los diagramas dibuja y pocos lectores notan: el marco de interacción, un rectángulo alrededor de todo el diagrama con una etiqueta arriba a la izquierda que pone sd y el nombre de la interacción. Parece decoración y no lo es: es lo que da nombre a la interacción, y el nombre es lo que hace posible ref. Sin él no puedes cortar un flujo largo en piezas, lo que significa que cada flujo debe caber en una página.
| Elemento | Notación | Qué significa |
|---|---|---|
| Marco | sd AuthorizePayment | La caja alrededor del diagrama y el nombre de la interacción dentro. Aquello a lo que apunta un ref en otro diagrama. |
| Puerta (gate) | una flecha que termina en el marco | Un mensaje que cruza la frontera del marco en vez de empezar o terminar en una línea de vida. Es la lista de parámetros de la interacción: así un ref recibe y devuelve cualquier cosa. |
| Mensaje encontrado | un círculo relleno en la cola | Llega de un emisor que el diagrama no modela: un clic de usuario, un planificador, un webhook. Honesto, y mucho mejor que inventar una línea de vida para el mundo exterior. |
| Mensaje perdido | un círculo relleno en la punta | Enviado a un receptor que el diagrama no modela, o que realmente nunca llega. Raro en un diagrama de diseño, útil en uno que describe un fallo. |
| Restricción de duración | { < 200ms } | Una restricción entre llaves que abarca dos puntos de una línea de vida. La única forma que tiene un diagrama de secuencia de decir algo sobre el tiempo, dado que la distancia vertical no dice nada. |
| Invariante de estado | { order = PLACED } | Una condición escrita sobre una línea de vida que debe cumplirse en ese punto. Útil justo encima de un mensaje cuya razón de ser es precisamente esa condición. |
La lista de fragmentos de la sección anterior es el conjunto de trabajo, no el completo. Existen otros cuatro operadores y tres se ganan su sitio de vez en cuando: break abandona el resto del fragmento que lo envuelve cuando su guarda se cumple, que es la forma natural de un retorno temprano por error; strict impone el orden de sus compartimentos donde seq los deja sueltos; neg marca una interacción que no debe ocurrir, una manera de escribir una prueba negativa dentro de una imagen. assert, ignore y consider pertenecen al trabajo de especificación formal y puedes saltártelos hasta que algo te obligue a usarlos.
06Leer en él los caminos de fallo#
Lo más valioso que hace un diagrama de secuencia no es documentar el camino feliz. Es que, una vez el camino feliz está en la página, los fallos se vuelven contables, y un flujo que cruza cuatro sistemas tiene muchos más de los que nadie estima de memoria.
Recorre el diagrama hacia abajo y hazle tres preguntas a cada mensaje, en orden. Las respuestas son tus caminos de extensión, y cada una es o bien un fragmento que deberías dibujar, o bien una decisión que alguien tiene que tomar.
- ¿Y si no hay respuesta? Cada mensaje síncrono es un sitio donde el llamante puede bloquearse para siempre. En algún lugar hay un valor de tiempo de espera; si nadie en la sala lo conoce, ese es el hallazgo. Dibújalo como un
altcon una guarda[timeout], y el número acaba en el diagrama, donde se puede discutir. - ¿Y si la respuesta es un fallo? Distinto de que no haya respuesta, y tratado igual por una cantidad alarmante de código en producción. Una autorización rechazada y un adquirente caído necesitan tratamientos distintos, y es en el diagrama donde esa diferencia se hace visible.
- ¿Y si esto se entrega dos veces? Pregúntalo en cada mensaje asíncrono, porque las colas reentregan y los clientes reintentan. Si la respuesta es «al cliente se le cobra dos veces», has encontrado el requisito de idempotencia que no estaba en el ticket.
Después lee el diagrama una vez más, hacia atrás, por la pregunta que la pasada hacia delante nunca atrapa: ¿qué ha ocurrido ya que ahora hay que deshacer? Un fallo en el cuarto mensaje deja en pie los efectos de los tres primeros. Esa es la lógica de compensación, y un diagrama de secuencia es el sitio más barato del mundo para descubrir que la necesitas.
07Cuándo dibujar uno#
Úsalo cuando
- Un flujo cruza varios servicios y el orden de las llamadas no es obvio
- Hay que zanjar una discusión sobre quién es responsable de llamar a quién
- Documentar un protocolo, un saludo inicial o una integración para otro equipo
- Averiguar dónde están los modos de fallo: el diagrama hace visibles los caminos de error que faltan
Usa otra cosa cuando
- La interacción son dos participantes y tres mensajes: escribe la frase y ya
- Te importa el tiempo transcurrido o los plazos: usa un diagrama de tiempos
- La pregunta es la estructura, no el orden: usa un diagrama de clases o de componentes
- El flujo es sobre todo lógica de ramificación: un diagrama de actividad será mucho más legible
El diagrama de secuencia es además el artefacto UML más eficaz para revisar un diseño antes de construirlo, porque saca a la luz las preguntas incómodas. ¿Qué pasa si la pasarela agota el tiempo? ¿Quién reintenta? ¿Esa llamada bloquea? No puedes dibujar el diagrama sin responderlas.
08Errores comunes#
- Todas las flechas sólidas y rellenas. Si todo parece síncrono, el diagrama ha tirado su distinción más útil. Usa puntas abiertas para lo de disparar y olvidar.
- Flechas de respuesta para todo. La respuesta a una llamada síncrona suele estar implícita y puede omitirse. Dibújala cuando el valor devuelto importe.
- Mezclar niveles de abstracción. Una línea de vida para toda una plataforma de pagos junto a otra para una sola clase auxiliar. Elige una altitud.
- Sin camino de error. El camino feliz por sí solo es la mitad menos interesante. Es el
altcon la rama de tiempo de espera lo que hace el diagrama digno de revisión. - Veinte líneas de vida. Pasadas unas siete, el diagrama deja de caber en una pantalla y empieza a desplazarse en vez de leerse. Divídelo y usa
ref.
En una línea cada uno
- 01Participantes arriba, tiempo hacia abajo; la distancia vertical no es duración.
- 02Punta rellena es síncrono y bloqueante, punta abierta es asíncrono.
- 03Las flechas discontinuas son respuestas; discontinua hacia una cabecera bajada es «create».
- 04Las barras de activación muestran quién está ocupado, y merecen el esfuerzo.
- 05alt, opt, loop, par y ref cubren la ramificación; nunca anides más de dos niveles.
- 06Dibuja el camino de fallo: es la mitad que hace útil el diagrama.
09Preguntas frecuentes#
¿Qué es una línea de vida en un diagrama de secuencia?
La línea vertical discontinua bajo cada participante, que representa su existencia a lo largo del tiempo. El tiempo baja, así que un mensaje dibujado más abajo ocurre después que uno situado encima.
¿Qué diferencia hay entre un mensaje síncrono y uno asíncrono?
Un mensaje síncrono lleva punta de flecha rellena y significa que el emisor espera a que la llamada regrese. Uno asíncrono lleva punta abierta y significa que el emisor sigue de inmediato. La respuesta a una llamada síncrona es una línea discontinua con punta abierta.
¿Qué significan alt, opt, loop y par?
Son fragmentos combinados: marcos etiquetados que envuelven parte de la interacción. alt es una ramificación con guardas, opt una sola rama que puede no ejecutarse, loop repite su contenido, y par indica que sus regiones pueden entrelazarse. La etiqueta va en el pentágono superior izquierdo.
¿Qué es una barra de activación?
El rectángulo estrecho dibujado sobre una línea de vida mientras ese participante hace algo, formalmente una especificación de ejecución. Empieza cuando el participante recibe un mensaje y acaba cuando retorna, que es lo que hace visibles las llamadas anidadas como barras apiladas.
¿Cuándo usar un diagrama de secuencia en vez de uno de comunicación?
Secuencia cuando el orden de los mensajes es lo que importa: un protocolo, un camino de fallo, un tiempo agotado. Comunicación cuando lo que importa es la estructura, es decir quién está conectado con quién. Ambos llevan la misma información y solo difieren en la disposición.
En esta serie
- 01¿Qué es UML?
- 02Símbolos UML
- 03Elegir un diagrama
- 04Diagramas de clases
- 05Ejemplos de diagramas de clases
- 06Cómo dibujar un diagrama de clases
- 07Símbolos del diagrama de clases
- 08Diagramas de secuencia
- 09Ejemplos de diagramas de secuencia
- 10Cómo dibujar un diagrama de secuencia
- 11Diagramas de casos de uso
- 12Ejemplos de casos de uso
- 13Diagramas de actividad
- 14Ejemplos de actividad
- 15Diagramas de máquina de estados
- 16Ejemplos de máquina de estados
- 17Diagramas de componentes
- 18Ejemplos de componentes
- 19Dibujar un diagrama de componentes
- 20Símbolos de componentes
- 21Diagramas de despliegue
- 22Ejemplos de despliegue
- 23Diagramas de objetos
- 24Diagramas de paquetes
- 25Diagramas de estructura compuesta
- 26Diagramas de comunicación
- 27Secuencia vs comunicación
- 28Diagramas de tiempos
- 29Diagramas de visión general de interacción
- 30Diagramas de perfil
- 31UML con IA
- 32Ejemplo de e-commerce
- 33Ejemplo bancario
- 34Ejemplo de microservicios
- 35Ejemplo de AWS
Lecturas relacionadas
Fundamentos
Diagramas de comportamiento
Diagramas de comportamiento
Diagramas de estructura
Fundamentos
Diagramas de comportamiento