Máquina de Estado em Ruby on Rails

Máquina de Estado em Ruby on Rails

Uma Máquina de Estado, também conhecida como Máquina de Estado Final, é um modelo computacional matemático usado para projetar algoritmos. Esta máquina considera a mudança entre estados com ordem e lógica em cada um. A implementação é fácil e pode evitar futuras dores de cabeça. Neste artigo, você verá um modelo matemático com o qual controlará as mudanças entre estados ao usar enums em seus modelos.

De onde partimos quando precisamos implementar isso?

Quando você inicia um projeto Ruby on Rails (RoR) e usa enums em seus modelos para manter algum valor, geralmente validamos o que devemos e não devemos ter, dependendo do estado. Um exemplo: para chegar à faculdade, tenho que passar pelo ensino fundamental, médio ou médio. Cada um é um estado em que subo de grau, embora possa retornar a um estado anterior. Ele também tem uma sequência definida.

Então, o que buscamos ao implementá-lo é ter um design claro de quais transições são possíveis ou não, dependendo do caso.

Voltando às máquinas de estado, existem dois tipos:

  • Determinístico: A transição de um estado pode ter como alvo um único estado.
  • Não determinístico: A transição de um estado pode ter vários destinos.

Com isso, buscamos analisar se o modelo que criamos realmente tem um comportamento de acordo com o estado e se acaba sempre no mesmo lugar ou pode ter outro estado final.

Explicado isso, vamos criar nossa aplicação em RoR, usando uma gem para facilitar o uso da máquina de estado.

Nesta ordem, implementaremos uma gem chamada `aasm`. Adicionaremos um modelo neste exemplo para adicionar uma máquina de estado finito, mas você pode usá-lo em módulos ou trabalhos, se necessário. Primeiro, precisamos criar um novo aplicativo. Escrevemos no terminal:

`rails new personal-app`

Em nossos aplicativos Rails, costumávamos gerar apenas um enum no modelo e deixá-lo definido como um valor padrão ou vazio. Existem alguns requisitos em que são necessários um estado inicial e uma transição para outro estado com uma ordem definida. Você não pode avançar um estado ou, no seu caso, retornar ao anterior.

Executamos  `rails g model job aasm_state:string` e depois `rails db:migrate`.

Para facilitar a explicação, descreveremos cada etapa, mas primeiro você pode copiar este código:

Você deve incluir o módulo AASM para usar os métodos da gem `aasm`. Nesse caso, temos uma coluna chamada `aasm_state` que adicionamos ao modelo, então adicionaremos essa coluna na migração. Se você quiser adicionar o atributo depois de criar o modelo, precisará incluir a migração.

Existem dois estados:

  • Dormindo
  • Corrida

Ao mesmo tempo, temos dois eventos:

  • Corre
  • Dorme

O valor padrão é Sleep (Dormir). É por isso que adicionamos o `initial: true`

Temos o estado de `dormindo` como valor padrão após salvar o modelo.

A ideia por trás do acima é analisar os requisitos para modelos que possuem enums. aqui estão alguns exemplos:

  • Quando você inicia um valor padrão e avança, o processo deve terminar em algum ponto para evitar voltar ao valor anterior ou inicial.
  • Caso eu tenha uma lógica de negócio relacionada a pagamentos, se eu fizer com cartão de crédito, o valor inicial fica pendente após a transição para em processo ou revisão. Enquanto isso, você não pode ficar pendente novamente. Eles só têm duas opções: aprovado ou negado.
  • Assim como um triatlo, você não pode pular uma etapa quando têm etapas ou fases em seu modelo.

Em resumo

Você precisa de uma máquina de estado quando tiver um caminho claro das transições do seu modelo. Você pode definir quando o estado está ou não em uma ordem específica, bem como quantas alterações podemos coletar em nosso modelo.

Ele pode verificar se uma transição é permitida ou não. Você pode não se importar se o processo for repetido muitas vezes, mas se importará em terminar esse ciclo em algum momento.

Muitas vezes, a falta de contexto leva você a adicionar um tipo de enumeração sem saber se precisa começar em algum lugar ou se depende de outro fator ou modelo relacionado. Portanto, seria uma boa prática se perguntar se você considera o seguinte:

  • Tem ponto de partida de algum estado padrão.
  • Transições permitidas ou não, dependendo de seu status atual.
  • Processo simples (não pode voltar).

Fizemos uma aplicação RoR implementando uma máquina de estados, um conceito fácil de aplicar em seus projetos. Lembre-se que isso pode ser muito útil quando você tem uma ideia clara do modelo, pois também pode validar cada cenário e limitar o modelo de fazer transições que não são permitidas.

Isso facilitará a compreensão dos possíveis cenários. Portanto, você terá uma visão mais clara de como seu modelo e suas interações se comportarão. Esperamos que este guia tenha sido claro para você. Agora que você conhece esse conceito, pode aplicá-lo aos seus projetos.

🛑
As opiniões e comentários expressos neste artigo são de propriedade exclusiva de seu autor e não representam necessariamente o ponto de vista da Revelo. A Revelo Content Network acolhe todas as raças, etnias, nacionalidades, credos, gêneros, orientações, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclusão e crescimento na carreira dos profissionais de tecnologia.