Episódio 33 — Interpretador declarativo com Contexto Compartilhado: Compreendendo o estado ao longo da execução
Em um sistema onde tarefas são encadeadas ou regras são avaliadas de forma declarativa, é comum que seja necessário compartilhar informações entre etapas. Esse episódio introduz o conceito de Contexto Compartilhado, uma forma controlada de passar informações entre as partes do interpretador, sem criar acoplamentos desnecessários.
Por que um Contexto?
Imagine que você quer aplicar uma série de transformações, validações e ações sobre dados diferentes, mas precisa manter o "estado" da execução: o que já foi feito? Houve erro? Qual foi a última ação? Qual dado foi carregado?
O Contexto resolve isso.
Representação
{
"acao": "ValidarEmail",
"params": { "campo": "email" },
"contexto": {
"UsuarioID": 123,
"EmailValido": false,
"Erros": []
}
}
Esse exemplo mostra um interpretador que, ao executar a ação ValidarEmail, atualiza o campo EmailValido dentro do contexto, e pode adicionar mensagens a Erros se houver problema.
Benefícios do Contexto Compartilhado
- Permite encadear ações com dependência de dados anteriores
- Evita variáveis globais ou acoplamento entre regras
- Pode ser persistido, logado, auditado
- Facilita testes unitários e reprocessamento
- Cria base para debug visual declarativo
Integração com TSafeThread e TTaskChain
Cada tarefa pode acessar o contexto atual:
SetOnExecute(
procedure(Context: TThreadContext)
begin
if Context.Data['UsuarioID'] = 0 then
raise Exception.Create('Usuário inválido');
end)
Você pode pensar no contexto como um dicionário dinâmico, ou melhor ainda, como um TJSONObject Delphi compartilhado e seguro.
Validação e Consistência
Ao final da execução, o contexto pode ser avaliado para garantir:
- Não houve erro
- Todas as ações esperadas foram executadas
- Valores obrigatórios foram preenchidos
Isso permite transformar o interpretador em pipeline de validação ou fluxo de execução reutilizável.
Próximos passos
No próximo episódio, vamos:
- Implementar um tipo de contexto padronizado e reutilizável
- Criar extensões que validam o próprio contexto
- Encadear regras com fallbacks condicionais com base no estado
O interpretador está ficando cada vez mais próximo de um orquestrador dinâmico de execução declarativa.
Seguimos!