Comprender la diferencia entre un evento y una transición es fundamental para diseñar máquinas de estados robustas. Aunque suelen confundirse, cada concepto cumple un rol distinto dentro del flujo de una aplicación: el evento es la acción que dispara el cambio, mientras que la transición es el proceso completo de pasar de un estado a otro. A partir de esta distinción, se abren varios tipos de transiciones que permiten controlar con precisión cómo se comporta un sistema.
¿Cuál es la diferencia entre evento y transición?
Un evento es la acción concreta que genera el inicio de un cambio, por ejemplo, un clic en un botón [0:08]. La transición, en cambio, es el proceso que se activa gracias a ese evento y que lleva la máquina de un estado al siguiente [0:24]. Tener clara esta separación permite razonar mejor sobre qué ocurre en cada paso del flujo.
En código, una función transition recibe dos argumentos: el estado actual y el evento que se desea disparar. La máquina evalúa si esa combinación es válida y, de serlo, ejecuta la transición correspondiente.
¿Qué tipos de transiciones existen en una máquina de estados?
¿Cómo funcionan las transiciones habilitadas y prohibidas?
- Transiciones habilitadas: son aquellas que pueden ocurrir porque están definidas para el estado actual. Si la máquina se encuentra en el estado inicial y el evento
Start está configurado, la transición se ejecutará sin problema [1:00].
- Transiciones prohibidas: son las que deliberadamente no deben ejecutarse en cierto estado. Se declaran asignando
undefined al evento dentro de ese estado [1:20]. Un caso práctico es cuando se registra un log en todos los estados excepto en uno donde no se desea esa acción.
¿Qué son los wildcards en transiciones?
Los wildcards utilizan el operador asterisco (*) en lugar de un nombre de evento específico [1:45]. Esto significa que cualquier evento que llegue a ese estado será capturado por el wildcard y ejecutará la transición definida. Por ejemplo, si el wildcard tiene un target hacia el siguiente estado, da igual qué evento se dispare: siempre se realizará ese cambio de estado [2:10].
¿Cuándo se usan las transiciones sin eventos?
Una transición sin eventos se ejecuta automáticamente cuando la máquina llega a un estado intermedio, sin necesidad de que el usuario o el sistema disparen una acción [2:30]. Un ejemplo claro: imagina un estado inicial donde se recopilan datos para determinar si el usuario es "padre" o "hijo". Al salir de ese estado, la máquina pasa a un estado intermedio que evalúa la información y redirige al estado correcto de forma inmediata, sin esperar ningún evento externo [2:50].
¿Qué son las transiciones protegidas y las transiciones atrasadas?
Las transiciones protegidas, también conocidas como guards, incorporan una condición que debe cumplirse para que la transición se ejecute [3:25]. Siguiendo el ejemplo anterior, el estado intermedio contiene un condicional que revisa si el usuario es padre o hijo antes de completar el cambio de estado.
Este mecanismo es muy útil en aplicaciones reales. Por ejemplo, en un sistema de reservas se puede establecer un guard que impida avanzar al siguiente paso si no se ha seleccionado al menos un pasajero [3:55]. De esta forma, seleccionar un pasajero se convierte en un requisito obligatorio.
Las transiciones atrasadas se ejecutan después de que transcurre un tiempo determinado [4:15]. En lugar de usar la propiedad on, se declaran con after seguido del tiempo en milisegundos. La máquina interpreta que, al entrar a ese estado y cumplirse el tiempo definido, debe ejecutar la transición automáticamente.
Un caso práctico es el flujo de un checkout: cuando el usuario llega a la pantalla del ticket y pasan diez minutos sin ninguna acción, la transición atrasada reinicia la máquina al estado inicial [4:45]. Esto evita que el sistema quede estancado en un estado sin actividad.
Con estos tipos de transiciones —habilitadas, prohibidas, wildcards, sin eventos, protegidas y atrasadas— se cubre toda la base teórica necesaria para empezar a implementarlas en un proyecto real. ¿Cuál de estos tipos de transición crees que usarías más en tus aplicaciones?