Episódio 12 – Comparações, lógicas e decisões encadeadas
No episódio anterior, estruturamos um fluxo condicional simples com if, then, else, e permitimos agrupar múltiplas ações em listas. Mas como prometido no final do episódio 10, chegou a hora de ampliar o poder do interpretador declarativo.
Agora vamos tratar de expressões mais complexas:
- Comparações como
>,<,>=,<=,!=,== - Lógicas como
and,or,not - Avaliações encadeadas e combinadas
Um passo além nos "if"
Até aqui, uma condicional como esta:
{ "if": { "equals": ["@idade", 18] }, "then": { "acao": "MostrarMensagem" } }
Era interpretada como uma verificação direta de igualdade. Agora, vamos permitir isso:
{
"if": {
"and": [
{ ">": ["@idade", 17] },
{ "<": ["@idade", 25] },
{ "!=": ["@pais", "Japao"] }
]
},
"then": [
{ "acao": "LiberarAcesso" },
{ "acao": "MostrarMensagem", "mensagem": "Acesso autorizado" }
],
"else": { "acao": "MostrarMensagem", "mensagem": "Acesso negado" }
}
Esse bloco diz:
Se idade for maior que 17, menor que 25, e o país diferente de Japão, então...
E isso não requer if aninhado. O interpretador lida com isso como uma expressão booleana de múltiplas condições.
Suporte interno a operadores
Vamos dar suporte direto a estas operações no interpretador:
- Comparações:
==,!=,>,<,>=,<= - Lógicas:
and,or,not
A estrutura básica é:
{ "<operador>": [<operando1>, <operando2>] }
Ou para not, apenas um operando:
{ "not": <expressao> }
Como isso será processado no código?
Em pseudocódigo:
function AvaliarExpressao(expr: TJSONValue): Boolean;
begin
if expr é objeto com chave "and" então
Resultado := true;
para cada item em expr["and"] faça
Resultado := Resultado and AvaliarExpressao(item);
else if expr é objeto com chave "==" então
Resultado := ResolverValor(expr["=="][0]) = ResolverValor(expr["=="][1]);
// ... e assim por diante para cada operador
end;
A chave de tudo é o método AvaliarExpressao, que será chamado sempre que uma chave "if" for encontrada.
Um novo nível de possibilidades
Com esse recurso, podemos:
- Criar filtros mais sofisticados
- Reaproveitar as mesmas expressões em múltiplas decisões
- Encadear lógicas sem perder clareza
- Construir um interpretador poderoso sem recorrer a
evalou scripts externos
E tudo isso permanece:
- Seguro
- Declarativo
- Extensível
No próximo episódio, vamos mostrar como:
- Reutilizar essas expressões como funções reutilizáveis
- Criar um sistema de macros ou alias
- Introduzir contexto local para expressões mais ricas
Estamos avançando rápido. A linguagem declarativa está se tornando expressiva, segura e poderosa. E tudo isso, controlado por você.