Introducción a las state machines en IPF
El payments DSL permite a los clientes definir flows usando state machines. Para quienes están familiarizados con el concepto de state machines de UML V2, IPF soporta un subconjunto de UML: por ejemplo, solo se soportan acciones "on transition" y, aunque IPF no soporta parallel substates (ni substates en absoluto), sí permite que múltiples acciones de transición se disparen en paralelo. Esta página está pensada para quienes trabajarán con IPF y no entendieron la frase anterior porque no están familiarizados con el concepto de state machines.
Una finite-state machine (FSM) o finite-state automaton (FSA, plural: automata), finite automaton, o simplemente una state machine, es un modelo matemático de computación. Es una abstract machine que puede estar exactamente en uno de un número finito de states en un momento dado. La FSM puede cambiar de un estado a otro en respuesta a ciertos inputs; el cambio de un estado a otro se llama transition.
Una FSM se define por una lista de sus estados, su estado inicial y los inputs que disparan cada transition. Las finite-state machines son de dos tipos — deterministic finite-state machines y non-deterministic finite-state machines; IPF solo soporta deterministic finite-state machines.
El comportamiento de las state machines puede observarse en muchos dispositivos de la sociedad moderna que realizan una secuencia predeterminada de acciones dependiendo de una secuencia de eventos con los que se encuentran. Ejemplos simples son: máquinas expendedoras, que dispensan productos cuando se deposita la combinación adecuada de monedas; ascensores, cuya secuencia de paradas está determinada por los pisos solicitados por los usuarios; semáforos, que cambian de secuencia cuando hay coches esperando; candados de combinación, que requieren introducir una secuencia de números en el orden correcto.
Ejemplo: torniquete accionado por monedas
Un ejemplo de mecanismo sencillo que puede modelarse con una state machine es un torniquete. Un torniquete, usado para controlar el acceso al metro y a atracciones de parques, es una puerta con tres brazos giratorios a la altura de la cintura, uno cruzando la entrada. Inicialmente los brazos están bloqueados, impidiendo el paso. Depositar una moneda o ficha en una ranura del torniquete desbloquea los brazos, permitiendo pasar a un solo cliente. Tras pasar, los brazos vuelven a bloquearse hasta que se inserta otra moneda.
Considerado como una state machine, el torniquete tiene dos estados posibles: Locked y Unlocked. Hay dos inputs posibles que afectan a su estado: introducir una moneda en la ranura (coin) y empujar el brazo (push). En el estado locked, empujar el brazo no tiene efecto; sin importar cuántas veces se dé el input push, permanece en locked. Introducir una moneda —es decir, dar a la máquina un input coin— cambia el estado de Locked a Unlocked. En el estado unlocked, introducir monedas adicionales no tiene efecto; es decir, dar inputs coin adicionales no cambia el estado. Sin embargo, cuando un cliente empuja los brazos, dando un input push, el estado vuelve a Locked.
La state machine del torniquete puede representarse con una tabla de transición de estados, que muestra, para cada estado posible, las transiciones entre ellos (basadas en los inputs dados a la máquina) y las salidas resultantes de cada input. En IPF los Inputs son Domain Events y las salidas son Actions.
| Current State | Input | Domain Event | Next State | Output | Action |
|---|---|---|---|---|---|
Locked |
coin |
Valid Coin Inserted |
Unlocked |
Unlocks the turnstile so that the customer can push through. |
Unlock |
push |
Turnstile Rotated |
Locked |
None |
||
Unlocked |
coin |
Valid Coin Inserted |
Unlocked |
None |
|
push |
Turnstile Rotated |
Locked |
When the customer has pushed through, locks the turnstile. |
Lock |
La state machine del torniquete también puede representarse por un grafo dirigido llamado diagrama de estados (abajo). Cada estado se representa por un node (circle). Los edges (arrows) muestran las transiciones de un estado a otro. Cada flecha está etiquetada con el input que dispara esa transición. Un input que no cause un cambio de estado (como un coin en el estado Unlocked) se representa con una flecha circular que regresa al estado original. La flecha hacia el nodo Locked desde el punto negro indica que es el estado inicial.
Conceptos y terminología
Un state es una descripción del estado de un sistema que está esperando ejecutar una transition. Una transition es un conjunto de acciones que se ejecutan cuando se cumple una condición o cuando se recibe un event. Por ejemplo, al usar un sistema de audio para escuchar la radio (el sistema está en el estado "radio"), recibir un estímulo "next" resulta en pasar a la siguiente emisora. Cuando el sistema está en el estado "CD", el estímulo "next" provoca pasar a la siguiente pista. Estímulos idénticos desencadenan acciones diferentes dependiendo del estado actual.
En algunas representaciones de finite-state machines también es posible asociar acciones a un state:
-
una entry action: realizada al entrar al state,
-
una exit action: realizada al salir del state,
-
una during action: realizada mientras se está en el state,
-
una transition action: realizada al entrar al state mediante una transición particular
IPF solo soporta transition actions y, por tanto, en realidad es la combinación de previous state, new state y event la que determina qué action se realiza al entrar; no se define como parte del state. Para habilitar procesamiento en paralelo, múltiples actions pueden dispararse por un domain event. Por ejemplo, en la tabla anterior, la primera fila podría, además de tener la action "unlock", tener una segunda action "play welcome sound" a realizarse en paralelo con unlock.