Estado-machine: Como mudar de estado sem evento externo (estado transiente)?

votos
2

O cenário:
Eu tenho uma máquina de estado simples:

caminho feliz:

Uninitialized->Initialized->InProgress->Done

caminho infeliz:

Uninitialized->Initialized->Error

Simplificando, preciso provocar uma transição (ou em InProgress ou em estado de erro) sem um evento / trigger externo . Ou seja, estado inicializado deve resultar imediatamente em um desses estados.

Questões:

  1. É OK para fazer a transição de estado a partir de dentro Initialized.Enter () ?
  2. Eu poderia usar guardas estaduais de fazer isso, mas eu prefiro não ter lógica não-trivial na guarda do Estado (e inicialização pode muito bem ser complexo).
  3. Se não é OK, como posso fazê-lo de forma diferente?
  4. Devo apenas tomar esta decisão fora de ele FSM todos juntos e ter algum outro componente fazer com que a transição adequada? Mas então, não seria eu ainda tenho que chamar esse componente externo de dentro Initialized.Enter () ? por isso não resolve nada?
Publicado 19/05/2009 em 18:34
fonte usuário
Em outras línguas...                            


1 respostas

votos
2

Em uma máquina de estado, próximo estado é uma função lógica combinatória de entrada e estado atual.

No caso você está descrevendo, a mesma causa ( Initializedestado) parece ser capaz de desencadear dois efeitos diferentes (seja InProgressou Errorestaduais). Eu acho que há uma entrada oculta cujo valor faz a diferença. Eu também acho que essa entrada é recebido durante a transição de Uninitializedpara Initialized.

Portanto, eu teria um modelo diferente:

Uninitialized -> Successfully initialized -> InProgress -> Done
             \
              `-> Failed Initialization -> Error

Possivelmente combinando Successfully initializedcom InProgresse Failed initializationcom Error.


EDIT : Desde o seu comentário, eu entendo que a entrada escondida na verdade é o resultado de uma ação (a inicialização do dispositivo). Tomar o seu modelo, presumo que a inicialização ocorre enquanto no Initializedestado (vamos chamá-lo Initializing). Desta forma, o resultado do dispositivo é o seu evento externo que irá acionar a transição seja para InProgressou para Error.

Portanto, manter a sua máquina de estado e simplesmente adicionar o resultado de device.Initialize()que a lista de entradas ou de eventos externos.

Respondeu 19/05/2009 em 20:25
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more