Archyno
UMLDiagramas de comportamiento

Diagramas de máquina de estados UML

Un objeto, todos los estados en los que puede estar, y todos los eventos que lo mueven entre ellos. El diagrama que convierte "¿se puede anular un pago capturado?" de una discusión en algo que se puede señalar.

9 min de lecturaUML 2.5.115 de 35

La respuesta corta

  • Una etiqueta de transición es disparador [guarda] / efecto, y las tres partes son opcionales. Casi toda la confusión con las máquinas de estados está en esa línea.
  • Una acción de entrada se ejecuta por cualquier entrada al estado; un efecto de transición, solo en esa transición. Repetir el mismo efecto por transición es como divergen las copias.
  • Un estado compuesto factoriza una salida común: la transición se dibuja una vez desde su borde en lugar de una vez desde cada subestado.
  • H vuelve al último subestado activo, H con asterisco a la última configuración anidada en todos los niveles. Es la notación de retomar donde lo dejamos.
Diagrama de estados UML de un pago. Desde el pseudoestado inicial el pago entra en Pending. Con authorize y fondos suficientes pasa a Authorized; con la autorización denegada pasa a Failed. Desde Authorized, capture lo lleva a Captured y void a Voided. Desde Captured, refund lo lleva a Refunded, que alcanza el estado final.
El ciclo de vida de un pago. Todo movimiento legal está dibujado; todo movimiento que no está dibujado es ilegal, y ese es el contenido real del diagrama.

01Qué muestra#

Un diagrama de estados describe la vida de una sola cosa. No un proceso, no una interacción: un objeto, o un componente, y los estados por los que pasa desde su creación hasta su fin.

Su fuerza está en el espacio negativo. El diagrama de arriba dibuja seis transiciones. Todo lo demás queda por ello prohibido: un pago Refunded no puede volver a Captured, uno Failed no se puede capturar y uno Pending no se puede reembolsar. En un diagrama de clases esas restricciones viven en prosa o en la cabeza de nadie. Aquí son el dibujo.

02Estados y transiciones#

ElementoNotaciónQué significa
Pseudoestado inicialdisco rellenoDonde empieza el objeto. No es un estado: aquí no descansa nada; la transición saliente se dispara de inmediato.
Estadorectángulo redondeadoUna condición en la que el objeto permanece mientras espera algo. Nombrado con un adjetivo o participio: Authorized, no Authorizing it.
Transiciónflecha con etiquetaUn paso entre estados, disparado por un evento. Etiquetada como disparador [guarda] / efecto.
Estado finalanillo alrededor de un discoLa vida del objeto termina. Después no hay nada.
Estado compuestoun estado que contiene estadosAgrupa subestados. Una transición que sale del compuesto se aplica a cada estado de dentro.
Historiauna H rodeada por un círculoVolver a entrar en un compuesto reanuda en el subestado en el que estaba por última vez, en lugar de en el inicial.
Dos estados unidos por una transición etiquetada authorize, corchete de apertura funds ok corchete de cierre, barra reserve funds. Una nota explica que esas partes son el disparador, la guarda y el efecto.
Una etiqueta de transición tiene tres partes opcionales. El disparador es el evento, la guarda es la condición y el efecto es lo que ocurre por el camino.

03Dónde va el comportamiento#

El comportamiento puede colgar de una transición o de un estado, y elegir bien elimina mucha duplicación.

  • Efecto en una transición: se escribe tras la barra. Se ejecuta una vez, en ese paso concreto. Úsalo cuando el comportamiento pertenezca a ese camino.
  • entry / … - se ejecuta cada vez que se entra en el estado, por cualquier transición. Si tres flechas hacia Captured necesitan escribir un apunte contable, eso es una acción entry, no tres efectos.
  • exit / … - se ejecuta cada vez que se sale del estado, por cualquier transición.
  • do / … - se ejecuta de forma continua mientras se está en el estado y se interrumpe al salir. Esta es la del trabajo largo.

La regla práctica: si el comportamiento va de estar en el estado, usa entry/do/exit. Si va del viaje concreto entre dos estados, ponlo en la transición.

04Estados compuestos e historia#

Los ciclos de vida reales acaban con un caso común: varios estados que responden igual a un mismo evento. Un pago en Pending, Authorized o Captured se puede cancelar, y dibujar tres flechas cancel separadas hacia Cancelled es ruido.

Un estado compuesto lo resuelve. Envuelve esos tres en un estado envolvente llamado Active y dibuja una sola transición cancel saliendo de Active. Se aplica al subestado que esté activo. Tres flechas se convierten en una, y añadir un cuarto subestado más adelante no cuesta nada.

Un pseudoestado de historia - una H rodeada por un círculo - se ocupa de la reanudación. Sin él, volver a entrar en un compuesto empieza por su subestado inicial. Con él, la máquina regresa al subestado en el que estaba al salir. La historia superficial (H) recuerda un nivel; la historia profunda (H*) recuerda todo el anidamiento. Esto es lo que quieres para cualquier cosa suspendible.

05Cuándo dibujar uno#

Úsalo cuando

  • Una entidad tiene un campo de estado y reglas sobre qué cambios se permiten
  • Pedido, pago, suscripción, ticket, aprobación de documento: cualquier cosa con ciclo de vida
  • Un protocolo o dispositivo con modos, donde las transiciones ilegales causan daño real
  • Estás a punto de escribir un enum de estados y quieres acertar antes las transiciones

Usa otra cosa cuando

  • El objeto tiene dos estados: basta una frase
  • Estás describiendo un proceso que abarca varios objetos; usa un diagrama de actividad
  • Los estados son en realidad pasos que siempre se siguen unos a otros en orden
  • Lo interesante es quién llama a quién, no en qué estado está cada cosa

Un diagrama de estados se traduce casi directamente a código, algo inusual en UML. Los estados se convierten en un enum, las transiciones en una tabla y las guardas en las condiciones de cada entrada. Dibujarlo primero e implementar a partir de él es uno de los pocos sitios donde modelar ahorra tiempo sin más, en vez de solo documentar.

06Errores comunes#

  1. Estados nombrados como actividades. Authorizing sugiere trabajo en curso; si el objeto está esperando ahí, nombra la condición: Authorized, Awaiting capture.
  2. Modelar un proceso, no un objeto.Si tus «estados» son pasos que realizan personas distintas, lo que quieres es un diagrama de actividad.
  3. Transiciones sin disparador. Legal - se dispara cuando termina la actividad do del estado - pero normalmente es señal de que falta un evento.
  4. Ningún estado final y ninguna explicación. O el objeto vive de verdad para siempre, o se olvidó un estado terminal. Pasan las dos cosas; solo una es intencionada.
  5. Repetir la misma transición desde cada estado. Para eso está el estado compuesto.

En una línea cada uno

  1. 01Un objeto, sus estados y los eventos que lo mueven. No un proceso.
  2. 02Las transiciones que no dibujas son la restricción que el diagrama existe para dejar registrada.
  3. 03Las etiquetas de transición se leen disparador [guarda] / efecto, y cada parte es opcional.
  4. 04Las acciones entry, exit y do pertenecen al estado; los efectos pertenecen a una transición.
  5. 05Los estados compuestos reducen a una flecha un evento compartido por varios subestados.
  6. 06Los pseudoestados de historia reanudan donde la máquina lo dejó, en lugar de reiniciar.

07Preguntas frecuentes#

¿Cuál es el formato de una etiqueta de transición UML?

Disparador, luego guarda entre corchetes, luego efecto tras una barra. El disparador es el evento que puede activar la transición, la guarda una condición que debe cumplirse para que se active, y el efecto lo que ocurre al hacerlo. Los tres son opcionales, así que una etiqueta puede ser solo un nombre de evento o solo una guarda.

¿Qué diferencia hay entre una acción de entrada y un efecto de transición?

Una acción de entrada se ejecuta siempre que se entra al estado, por cualquier transición. Un efecto de transición se ejecuta solo en esa transición. Si el mismo comportamiento pertenece a todas las entradas a un estado, es una acción de entrada, y escribirlo transición por transición es justo como las copias acaban divergiendo.

¿Qué es un estado compuesto?

Un estado que contiene su propia máquina de estados. Es como se factoriza un grupo de estados que comparten una misma transición saliente: la dibujas una vez desde el borde del compuesto en lugar de una vez desde cada subestado.

¿Qué significa el símbolo H en una máquina de estados?

Es un pseudoestado de historia. La historia superficial, H, vuelve al último subestado activo de un estado compuesto; la historia profunda, H con asterisco, vuelve a la última configuración anidada en todos los niveles. Es la notación de retomar donde lo dejamos.

¿Cuándo usar una máquina de estados en vez de un diagrama de actividad?

Cuando el sujeto es el ciclo de vida de un objeto y la pregunta es qué puede pasar a continuación. Una máquina de estados gira en torno a una cosa y los estados que puede tomar; un diagrama de actividad gira en torno a un proceso y los pasos que recorre.

En esta serie

Lecturas relacionadas

Todos los artículos