Saltar para o conteúdo
← Ideias

Quando usar uma máquina de estados e quando estados simples são suficientes

Uma máquina de estados torna explícitas as regras e transições de um processo. Saiba avaliar se ela oferece mais controle ou acrescenta complexidade desnecessária.

Diagrama conceitual de um processo com estados, eventos e transições alternativas

Um campo como estado = "pendente" parece suficiente até que o processo acumule aprovações, exceções e ações que dependem de como chegou àquele ponto. Então surgem perguntas práticas: é possível cancelar depois de aprovar? Quem pode reabrir um caso? O que acontece se a mesma solicitação chegar duas vezes? Uma máquina de estados ajuda a responder a essas perguntas ao descrever não apenas o estado atual, mas também as mudanças permitidas e seus efeitos.

Nem todo fluxo precisa desse modelo. Em um processo curto e linear, um rótulo de estado e algumas regras simples podem ser mais fáceis de construir e manter. A decisão consiste em comparar a complexidade real do fluxo com o custo de explicitar suas regras, não em adotar um padrão de antemão.

Estado como rótulo e máquina de estados: o que muda

Estado como rótulo e máquina de estados: o que muda

Armazenar um estado como rótulo representa uma condição atual: por exemplo, uma tarefa pode aparecer como “pendente” ou “concluída”. Por si só, esse rótulo não explica quais mudanças são válidas, que evento as provoca nem quais ações devem acompanhá-las. Essa lógica costuma ficar distribuída pela interface, pelo servidor e por diferentes condições no código.

Uma máquina de estados descreve o processo como um conjunto definido de estados e transições. Uma transição estabelece qual evento permite passar de um estado a outro e, quando necessário, quais condições devem ser atendidas ou quais ações são executadas. Portanto, o estado atual limita as evoluções possíveis.

A diferença não está na quantidade de rótulos em um banco de dados. Um campo de estado pode fazer parte de uma máquina explícita se o sistema validar as transições. E uma lista extensa de estados não constitui, por si só, um bom modelo se ninguém consegue explicar como se passa de um para outro.

Sinais de que vale a pena definir transições explícitas

O modelo começa a trazer valor quando as regras dependem da etapa do processo e os erros de transição têm consequências. Observe estes sinais:

  • Ações permitidas diferentes: nem todos podem aprovar, editar ou cancelar em cada etapa, ou uma ação só fica disponível após uma validação.
  • Caminhos alternativos: uma solicitação pode ser aprovada, rejeitada, devolvida para completar informações ou cancelada.
  • Regras distribuídas: diferentes partes do aplicativo verificam de forma independente se uma operação é válida, com o risco de apresentarem contradições.
  • Efeitos associados à mudança: uma transição precisa registrar uma decisão, avisar alguém ou iniciar outra tarefa. Convém distinguir esse efeito da simples mudança de rótulo.
  • Repetições e concorrência: duas pessoas ou processos podem tentar alterar o mesmo caso, ou uma integração pode repetir um evento.

Um bom sinal para o diagnóstico é a equipe discutir com frequência se uma mudança “deveria ser permitida” em determinada etapa. Se a resposta depender do estado anterior, de quem age ou de um resultado de negócio, convém registrar a regra de forma explícita e centralizada.

Quando estados simples são suficientes

Um modelo simples costuma bastar quando o processo é linear, tem poucas transições e as exceções são raras ou fáceis de administrar. Por exemplo, uma tarefa interna que passa de “pendente” para “concluída” pode precisar apenas de um campo e de uma verificação clara, sobretudo se não houver aprovações, novas tentativas nem consequências externas.

O custo operacional também importa. Uma máquina de estados introduz conceitos, testes e manutenção. Se o fluxo não apresenta ambiguidades, esse custo pode superar o benefício. Não transforme cada mudança de tela, etapa da interface ou pequena variação em um estado de negócio: uma experiência visual nem sempre corresponde a uma etapa do processo.

Como critério prático, comece com a representação mais simples que permita aplicar as regras importantes. Se surgirem condições repetidas, transições implícitas ou incidentes causados por mudanças inválidas, reavalie o projeto. A evolução pode ser gradual: não é necessário redesenhar todo o processo para formalizar primeiro as transições de maior risco.

Critérios para tomar a decisão

Não existe um número universal de estados ou transições a partir do qual uma máquina se torna necessária. Avalie o comportamento e o impacto dos erros com perguntas concretas:

  1. Quantos caminhos reais existem? Conte os caminhos de negócio e suas ramificações, não apenas os rótulos. Vários caminhos com permissões ou resultados distintos costumam justificar um modelo explícito.
  2. O que acontece se alguém tentar uma transição inválida? Se o efeito for um inconveniente reversível, uma validação simples pode bastar. Se puder gerar uma decisão incorreta, trabalho duplicado ou uma ação difícil de reverter, defina controles mais claros.
  3. Pode haver mudanças simultâneas ou eventos repetidos? Se sim, estabeleça como verificar se o estado mudou desde o início da operação e como evitar que o processamento repetido do mesmo evento duplique efeitos.
  4. É necessário explicar o percurso? Se as equipes de suporte, auditoria ou operações precisam saber quem fez o quê, quando e por quê, separar o estado atual do histórico de eventos facilita reconstruir a evolução.
  5. As regras cabem em um lugar compreensível? Se exigem exceções encadeadas em vários componentes, o problema já não é apenas a quantidade de estados: é um sinal de que o fluxo não tem uma definição única.

Como nomear estados, eventos e exceções

Use termos que descrevam etapas reconhecíveis para o negócio. Um estado responde “em que situação está o caso?”; um evento responde “o que aconteceu para que ele mudasse?”. Por exemplo, “em análise” pode ser um estado e “análise aprovada”, um evento. Evite tratar os dois conceitos como se fossem intercambiáveis.

Separe também a etapa do resultado quando forem dimensões distintas. “Encerrada” descreve uma etapa final, enquanto “aprovada” ou “rejeitada” descreve um resultado. Se esses conceitos forem misturados, podem surgir estados combinados, como “encerrada e rejeitada”, que multiplicam as variações e dificultam o entendimento das regras.

Identifique quais estados são terminais, isto é, aqueles em que o processo normalmente termina. Defina separadamente se é possível cancelar ou reabrir um caso e quem pode fazê-lo. Um estado terminal não precisa impedir toda ação administrativa, mas essa exceção deve ser delimitada e não pode se transformar em um atalho para contornar as regras.

Para novas tentativas, evite criar um estado para cada tentativa se o caso continua na mesma etapa. Mantenha o estado adequado e registre a tentativa no histórico ou como um dado separado. Faça o mesmo com falhas e exceções: crie um estado distinto apenas se elas alterarem de forma relevante o que o negócio pode fazer em seguida.

Exemplo hipotético: uma solicitação em análise

Imagine uma solicitação que é recebida, analisada e, por fim, aprovada ou rejeitada. Na versão mais simples, os estados poderiam ser “recebida”, “em análise” e “resolvida”, com um resultado associado. Se a equipe precisar pedir informações adicionais, o fluxo deverá representar essa pausa e definir qual evento permite voltar à análise quando a resposta chegar.

Uma transição pode especificar que somente uma pessoa autorizada pode aprovar ou rejeitar uma solicitação “em análise”. Se ela for rejeitada, o caso fica resolvido com o resultado “rejeitado”; se faltarem informações, passa para “aguardando informações”. A máquina não exige uma plataforma especial: basta que o sistema valide essas mudanças de forma consistente e registre os dados necessários.

Este exemplo é hipotético; os nomes e as regras devem ser ajustados ao processo real. Se pedir informações não mudar as ações disponíveis nem exigir acompanhamento, pode bastar registrar uma observação. O modelo deve refletir diferenças operacionais, não antecipar todas as possibilidades imagináveis.

Erros frequentes e lista de verificação

Erros frequentes e lista de verificação

Um modelo pode se tornar mais difícil do que o processo se criar estados para cada detalhe, misturar permissões com etapas ou não definir o que acontece com os casos antigos quando as regras mudam. Também é um erro desenhar as transições e deixar que o código as ignore: a regra precisa ser aplicada onde a mudança é aceita.

Antes de escolher ou revisar a abordagem, verifique o seguinte:

  • Cada estado representa uma situação que o negócio consegue explicar?
  • Os eventos descrevem fatos e as transições especificam quais mudanças são permitidas?
  • Os caminhos alternativos, cancelamentos e reaberturas estão claros?
  • Operações inválidas são rejeitadas e eventos repetidos ou mudanças simultâneas são controlados?
  • O histórico é registrado quando é necessário reconstruir decisões?
  • Há estados que podem ser combinados sem perder regras ou informações relevantes?

Escolha uma máquina de estados quando ela tornar visíveis e aplicáveis regras que, de outro modo, ficariam dispersas, e quando o custo de uma transição incorreta justificar esse controle. Se o processo for linear e previsível, comece com estados simples. Reavalie a decisão quando mudarem os caminhos, as exceções ou as consequências: o melhor modelo é o mais simples que representa fielmente como o trabalho evolui.

Fuentes y referencias

  1. MDN Web DocsMozilla
  2. Web performanceweb.dev
  3. OWASP Cheat Sheet SeriesOWASP Foundation