Archyno
UMLDiagramas de comportamiento

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.
Un diagrama de secuencia UML. Un comercio envía un pago a Checkout, que pide al orquestador de pagos que lo autorice. El orquestador carga la tarjeta a través de la pasarela y obtiene la aprobación. Dentro de un fragmento alt, si hay fondos anota un apunte en el libro mayor; si no, devuelve un rechazo. Checkout devuelve por último un recibo al comercio.
Autorizar un pago. El tiempo corre hacia abajo, cada línea vertical discontinua es un participante, y la caja enmarcada es una elección entre dos alternativas.

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#

ElementoNotaciónQué significa
SíncronoLínea sólida, punta rellena. El llamante se bloquea hasta recibir respuesta. Un método corriente o una llamada HTTP bloqueante.
AsíncronoLínea sólida, punta abierta. El llamante sigue de inmediato. Publicar en una cola o emitir un evento.
RespuestaLínea discontinua, punta abierta. El retorno. Etiquétala con lo que vuelve, no con la palabra «return».
CreateFlecha discontinua que aterriza en la cabecera de una línea de vida que empieza más abajo. Marcada «create».
Destroyuna cruz al final de la línea de vidaEl 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.

Un diagrama de secuencia UML que muestra una llamada a sí mismo y la creación de un objeto. El orquestador se valida a sí mismo, después crea un Receipt con un mensaje create discontinuo, llama a render sobre él y por último lo destruye, marcado con una cruz al final de su línea de vida.
Una autollamada sale y vuelve a la misma línea de vida. La cabecera de un participante creado baja al mensaje que lo crea, y uno destruido termina en una cruz.

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, como loop [1..*] o loop [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.

ElementoNotaciónQué significa
Marcosd AuthorizePaymentLa 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 marcoUn 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 encontradoun círculo relleno en la colaLlega 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 perdidoun círculo relleno en la puntaEnviado 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.

  1. ¿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 alt con una guarda [timeout], y el número acaba en el diagrama, donde se puede discutir.
  2. ¿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.
  3. ¿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#

  1. 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.
  2. 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.
  3. 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.
  4. Sin camino de error. El camino feliz por sí solo es la mitad menos interesante. Es el alt con la rama de tiempo de espera lo que hace el diagrama digno de revisión.
  5. 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

  1. 01Participantes arriba, tiempo hacia abajo; la distancia vertical no es duración.
  2. 02Punta rellena es síncrono y bloqueante, punta abierta es asíncrono.
  3. 03Las flechas discontinuas son respuestas; discontinua hacia una cabecera bajada es «create».
  4. 04Las barras de activación muestran quién está ocupado, y merecen el esfuerzo.
  5. 05alt, opt, loop, par y ref cubren la ramificación; nunca anides más de dos niveles.
  6. 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

Lecturas relacionadas

Todos los artículos