O vault de opções
Por que recusar a chave desconhecida — e não avisar sobre ela.
Um vault de opções aceita qualquer chave. É isso que o torna conveniente, e é exatamente por isso que ele precisa de uma guarda.
Recusar, e não avisar#
Um aviso impresso não para nada: o programa segue com o padrão, que é exatamente o estado que se queria evitar. E num servidor o aviso vai para um log que ninguém lê.
dataforge
PADROES := {"tentativas": 3, "prazo": 30, "recuo": 0.5}
action ler_opcoes(recebidas, conhecidas, onde):
resultado := {}
cycle k in conhecidas.keys():
resultado[k] := conhecidas[k]
cycle k in recebidas.keys():
given k.startswith("_"):
skip
given k not in conhecidas:
nomes := ", ".join(sorted(conhecidas.keys()))
trigger $"'{k}' nao e uma opcao de '{onde}'. Aceita: {nomes}"
resultado[k] := recebidas[k]
yield resultado
o := ler_opcoes({"prazo": 5}, PADROES, "cliente")
assert o["prazo"] is 5
assert o["tentativas"] is 3
monitor:
ler_opcoes({"tentativa": 9}, PADROES, "cliente")
assert no
handle Error as e:
out e.message| Decisão | Porque |
|---|---|
| a lista de conhecidas num lugar só | ela é a documentação; duas cópias divergem |
| a mensagem lista o que aceita | quem errou o nome não tem como adivinhar o certo |
chave começando com _ passa | é a porta de escape para extensão e para teste |
| o padrão é aplicado pelo chamador | a validação e a mesclagem são perguntas diferentes |
Continue em Desenhar a API e Os erros.