Minha máquina de estado de nível superior tem alguns estados e arestas. Vou chamar isso de máquina de estado pai.
A ----> B ----> C
Qualquer estado na máquina de estado pai também pode ser uma máquina de estado. Vou chamar essas crianças de máquinas de estado.
___________
/ \
A ----> | B0->B1->B2 | ----> C
\____________/
Se a máquina de estado pai faz a transição de A para B, a máquina de estado de B assume o controle. Depois que B é executado, como ele deve abrir mão do controle para a máquina de estado pai e fazer a transição para o estado C? Qual padrão de design você usa?
Se você está se perguntando, eu tenho máquinas de estado filhos em máquinas de estado pai porque meu projeto exato é bastante complexo e é natural encapsular o funcionamento interno de um estado filho.
MachineContainer
classeB
que contenha B0, B1 e B2 e, quando B2 termina, passa o controle de volta para o contêiner, que depois passa para C ... Eu nunca tentei algo assim. É um problema interessante!Respostas:
Toda máquina de estado tem algum tipo de manipulador de eventos e um meio de acionar esses eventos. Esse manipulador toma como entrada o estado e o tipo de evento existentes, escolhe o novo estado e, opcionalmente, executa algum código de efeito colateral.
Essencialmente, enquanto estiver no estado
B
, seu manipulador de eventos principal encaminha todos os eventos que não reconhece aoB
manipulador de eventos e permanece no estadoB
. QuandoB
deseja fazer a transiçãoC
, ele lança o evento apropriado no manipulador de eventos principal.fonte
Você leu esta seção do Taoup ? Existem várias maneiras diferentes de realizar isso, mas muitas delas dependem de como você dividiu suas máquinas de estado. Eles são processos separados? Tópicos? Objetos?
Descubra como você os construiu e veja se existe uma maneira canônica de se comunicar. Se não existir, você pode estar criando um sistema errado.
Para mim, eu olhava para processos separados, conectando stdin e stdout. A máquina do estado filho torna-se independente, agindo em stdin e produzindo em stdout. Torna-se o trabalho da máquina de estado pai iniciar o processo filho, conectar os tubos e depois despejar dados e aguardar resultados. Todas essas coisas já foram feitas em todas as línguas modernas, por isso deve ser fácil.
fonte
Separe as duas máquinas de estado e use a passagem de mensagens entre elas. Assim, a máquina de estado 1 procederia do ABC, onde no estado B verifica os resultados atuais da máquina de estado 2. Se a saída foi alterada, a máquina de estado 1 pode ser responsável e a máquina de estado 2 não precisa ter nenhum conhecimento. de como a máquina de estado 1 realmente funciona. Algo como:
fonte
A solução depende de 1) se os sub-estados de A são visíveis aos sub-estados de B. 2) AB e C derivam de um pai comum. Se eles têm um pai comum e a visibilidade é universal, você não deve ter muitos problemas para mudar do subestado de B para o subestado de A.
Se você os isolou por meio de namespaces e / ou A, B e C não possui um pai comum, é melhor ter um driver de alteração de estado externo para máquinas A, B e C. Isso pode ser feito através de um manipulador de eventos. Basta ter um observador em A que possa ouvir eventos gerados em B e fazer a transição para seu próprio sub-estado com base no evento.
fonte