Pular para o conteúdo

Máquina de estados

Um enum, uma tabela de transições e nenhum estado inválido representável.

Este é o código completo do exercício 118_maquina_estados.df, que roda e verifica a si mesmo.

118_maquina_estados.df
steady TRANSICOES := {
    "novo": ["pago", "cancelado"],
    "pago": ["enviado", "reembolsado"],
    "enviado": ["entregue"],
    "entregue": [],
    "cancelado": [],
    "reembolsado": []
}

blueprint Pedido:
    action setup():
        self.estado := "novo"
        self.historico := ["novo"]

    action mover(destino):
        permitidos := TRANSICOES[self.estado]
        given not permitidos.contains(destino):
            trigger "transicao invalida: " + self.estado + " -> " + destino
        self.estado := destino
        self.historico.append(destino)
        yield destino

p := spawn Pedido()
p.mover("pago")
p.mover("enviado")
p.mover("entregue")
out p.historico

assert p.estado is "entregue", "estado final"
assert p.historico is ["novo", "pago", "enviado", "entregue"], "historico"

invalida := no
monitor:
    p.mover("pago")
handle e:
    invalida := yes
    out "bloqueado:", e
assert invalida is yes, "transicao invalida bloqueada"

As três partes#

  • O enum enumera os estados possíveis
  • A tabela declara quais saltos são legítimos
  • As ações só consultam a tabela

Nenhum estado inválido é representável, e nenhuma transição inválida é possível. Um estado com lista vazia é terminal — o laço para sozinho.

Por que não usar texto#

Com "publicado" como texto solto, um erro de digitação vira um no silencioso. Com enum, é erro na hora — e o check acha antes de rodar.