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.