Estados e máquinas de estado

Usando máquinas de estado para definir comportamentos e transições de estado – explicado com aplicativos de namoro

(20 de dezembro de 2020)

O que é um estado?

Em tecnologia da informação e ciência da computação, um sistema é descrito como stateful se for projetado para lembrar eventos anteriores ou interações do usuário; a informação lembrada é chamada de estado do sistema .

Os estados de um sistema são geralmente definidos pela agregação de comportamentos de seus usuários. Os estados são importantes porque é uma forma mais sistemática de verificar se determinados comportamentos em determinados estados são válidos ou não.

Estados de um semáforo

Considere um semáforo como exemplo. Se estiver verde, os motoristas e passageiros esperam ver amarelo – não vermelho – em seguida. Quando fica amarelo, eles esperam vermelho e não verde. Portanto, os estados aqui são simples:

Green -> Yellow -> Red
^ |
|\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_|

Siga as setas (também conhecidas como as transições de estados permitidas) e seu semáforo está pronto para funcionar.

Estados das correspondências em aplicativos de namoro

Agora, vamos pegar um aplicativo de namoro como um exemplo mais complicado, imagine que estejamos construindo um aplicativo para as pessoas “combinarem” online. Digamos que temos os algoritmos prontos e precisamos começar a escrever a lógica por trás das correspondências que surgem nos aplicativos de nossos usuários.

Vamos definir uma entidade combine primeiro para representar a correspondência entre duas pessoas. Existem vários estados para uma correspondência que devemos levar em consideração se formos projetá-la.

Precisamos dos estados para que as pessoas não vejam comportamentos inesperados, como uma pessoa aleatória e diferente que aparece na tela dizendo olá.

Foto de Yogas Design em Unsplash

Meu processo de pensamento:

  1. Primeiro de tudo, uma correspondência deve ser criada , o que significa que um determinado conjunto de algoritmos foi para selecionar duas pessoas prontas para uma partida. É claro que os algoritmos precisam ter certeza de que estão prontos para uma correspondência, se encaixam nas preferências um do outro, não foram banidos etc.
  2. Então, essa correspondência pode se tornar pendente (aguardando o deslize de outra pessoa) ou falhou dependendo da ação do primeiro usuário. Se o usuário deslizar para a direita (o que significa “Eu gosto de você” em termos de aplicativos de namoro), o estado salta de criado para pendente . Se o usuário deslizar para a esquerda (significando “Não gosto de você”), o estado muda para falhou .
  3. Então, se as duas pessoas gostam uma da outra, vai de pendente para correspondeu .
  4. Qualquer uma das pessoas em uma correspondência também poderia “descompactar” uma correspondência, trazendo o estado para incomparável .
  5. Acho que todas as mudanças de estados foram cobertas. Mas são tudo isso? Hmm … não há um recurso pago chamado “retroceder” que permite que você volte e deslize novamente? O que devemos fazer com isso?

Como podemos garantir que todas as alterações foram incluídas? Se sim, como o programamos?

O que é uma máquina de estado?

Uma metodologia para modelar o comportamento de uma entidade com um ciclo de vida estabelecido

Ao construir sistemas orientados por estado, as máquinas de estado são úteis para nos ajudar a determinar melhor as transições e gatilhos complicados.

Máquinas de estado finito (FSM)

Isso é uma máquina abstrata que pode estar exatamente em um de um número finito de estados a qualquer momento. O FSM pode mudar de um estado para outro em resposta a algumas entradas ; a mudança de um estado para outro é chamada de transição . Um FSM é definido por uma lista de seus estados, seu estado inicial e as entradas que acionam cada transição.

Vamos continuar com nosso exemplo de aplicativo de namoro.Se criarmos um diagrama de estado a partir da lógica por trás de uma correspondência , é mais ou menos assim:

* Diferentes métodos podem ser usados ​​por diferentes usuários envolvidos: qualquer um dos clientes correspondentes ou o aplicativo de namoro (construtor de plataforma / empresa).

Tem um número finito de estados, modelando todos os comportamentos dentro do ciclo de vida de uma partida. Para construir uma máquina de estado, precisamos apenas seguir as linhas e ver como a entidade responde a vários comportamentos.

Por que devo usar uma máquina de estado?

Ok, agora eu sei disso o diagrama de estado é realmente útil, mas por que devo usar uma máquina de estado quando estou escrevendo meu código?

Do mesmo exemplo, vamos dar uma olhada em alguns códigos simplificados antes e após uma máquina de estado está envolvida.

Antes de usar uma máquina de estado

Você pode identificar muitos if/else declarações.

Depois de usar uma máquina de estado

Deixe o método ChangeState cuidar das transições de estado usando o tipo StateTransition. Todos os outros métodos agora podem se concentrar na lógica de lidar com a correspondência.

O que mais posso fazer?

Apenas para citar alguns:

  • Por enquanto, assumimos que os métodos “Rewind” são bons o suficiente para chamadas de interfaces de front-end. Uma maneira mais delicada de lidar com os métodos deveria ser verificar se a correspondência foi gravada – e se sim, se gostou ou não gostou – e então decidir qual comando usar. Em vez de deixar a IU fazer o julgamento (e correr o risco de estar errado), é mais sugerido que tratemos disso na MatchEntity classe.
  • Se o estado muda ficar muito complicado, tente usar uma matriz com eixo de estados e comandos atuais. Os dados na matriz podem ser os estados atualizados. Desta forma, o código se torna mais legível.

Resumo

Então, por que usar uma máquina de estado? Porque considerando os eventos de mudança de estado (também conhecidos como os comportamentos importantes de uma entidade), ele modela melhor um sistema. Quase todo o resto pode ser resolvido com métodos CRUD básicos. Além disso, torna seu código mais legível e sustentável.

Quando se trata de construir APIs, não as projete apenas com base nas solicitações feitas pelos gerentes de produto. Projete APIs (pelo menos APIs no mínimo) para sua entidade com os comportamentos e transições críticos – estados – em mente.

Referência

Richard Clayton – Use State Machines!

As máquinas de estado finito (FSM, ou no contexto deste post, simplesmente “State Machines”) são uma metodologia para modelar o…

rclayton. silvrback.com

Máquina de estado finito

Uma máquina de estado finito (FSM) ou autômato de estado finito (FSA, plural: autômato), autômato finito ou simplesmente um estado…

en.wikipedia.org

Exemplo de máquina de estado simples em C #?

Acabei de contribuir com isso: https://code.google.com/p/ysharp/source/browse/#svn\%2Ftrunk\%2FStateMachinesPoC Aqui está um …

stackoverflow.com

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *