Mi máquina de estado de nivel superior tiene algunos estados y bordes. Llamaré a esto la máquina de estado principal.
A ----> B ----> C
Cualquier estado dentro de la máquina de estado principal también puede ser una máquina de estado. Llamaré a estos niños máquinas de estado.
___________
/ \
A ----> | B0->B1->B2 | ----> C
\____________/
Si la máquina de estado principal pasa de A a B, la máquina de estado de B se hace cargo. Una vez que B termina de ejecutarse, ¿cómo debería ceder el control a la máquina de estado principal y pasar al estado C? ¿Qué patrón de diseño usas?
Si se está preguntando, tengo máquinas de estado de niños dentro de máquinas de estado de padres porque mi proyecto exacto es bastante complejo y es natural encapsular el funcionamiento interno de un estado de niño.
MachineContainer
claseB
que contenga B0, B1 y B2 y cuando B2 termine, devuelva el control a su contenedor que luego pasa a C ... Sin embargo, nunca he intentado algo como esto. ¡Es un problema interesante!Respuestas:
Cada máquina de estado tiene algún tipo de controlador de eventos y un medio para activar esos eventos. Ese controlador toma como entrada el estado existente y el tipo de evento, elige el nuevo estado y, opcionalmente, ejecuta un código de efectos secundarios.
Esencialmente, mientras está en estado
B
, su controlador de eventos principal reenvía los eventos que no reconoce alB
controlador de eventos y permanece en estadoB
. CuandoB
desea realizar la transiciónC
, publica el evento apropiado en el controlador de eventos principal.fuente
¿Has leído esta sección de Taoup ? Hay varias formas diferentes de lograr esto, pero muchas de ellas dependen de cómo haya dividido sus máquinas de estado. ¿Son procesos separados? ¿Hilos? ¿Objetos?
Averigua cómo los construiste y observa si hay una forma canónica para que se comuniquen. Si no existe, es posible que esté diseñando mal su sistema.
Para mí, miraría procesos separados, conectando stdin y stdout juntos. La máquina de estado secundaria se vuelve independiente, actuando en stdin y generando en stdout. Se convierte en el trabajo de la máquina de estado principal para iniciar el proceso secundario, conectar las tuberías y luego volcar los datos y esperar los resultados. Todas esas cosas ya se han hecho en todos los idiomas modernos, por lo que debería ser fácil de hacer.
fuente
Separe las dos máquinas de estado y use el mensaje que pasa entre ellas. Por lo tanto, la máquina de estado 1 procedería de ABC, donde en el estado B verifica los resultados actuales de la máquina de estado 2. Si la salida ha cambiado, entonces la máquina de estado 1 puede explicarlo y la máquina de estado 2 no necesita tener ningún conocimiento de cómo funciona realmente la máquina de estado 1. Algo como:
fuente
La solución depende de 1) si los subestados de A son visibles para los subestados de B. 2) AB y C se derivan de un padre común. Si tienen un padre común y la visibilidad es universal, no debería tener demasiados problemas para pasar del subestado de B al subestado de A.
Si los ha aislado a través de espacios de nombres y / o A, B y C no tienen un padre común, entonces su mejor opción es tener un controlador externo de cambio de estado para las máquinas A, B y C. Esto se puede hacer a través de un controlador de eventos. Simplemente tenga un observador en A que pueda escuchar eventos generados en B y transiciones a su propio subestado según el evento.
fuente