De uma simples substituição de condicionais para estruturas robustas como State, Command e Plugin Pattern.
Descubra como o uso de dicionários de ações pode ser a base para padrões clássicos de design como State Pattern, Command Pattern e Sistemas Plugináveis - criando aplicações mais flexíveis, modulares e descoladas.
Introdução
No artigo anterior, vimos como dicionários de ações (ou maps de funções) são uma forma elegante de substituir estruturas tradicionais de if e else, melhorando legibilidade e extensibilidade.
Mas essa técnica vai muito além.
Ao entender seu potencial, você pode estruturar seu código com base em padrões consagrados como:
- State Pattern
- Command Pattern
- Plugin Pattern / Modularização Dinâmica
Se você deseja criar sistemas flexíveis, extensíveis e fáceis de evoluir, esse artigo é para você.
State Pattern - Comportamento baseado em estado
📌 O problema: Um objeto muda seu comportamento dependendo de seu estado interno. Ao invés de condicional após condicional...
if Estado = 'Autenticado' then
AcessarDashboard
else if Estado = 'Visitante'' then
MostrarLogin;
... podemos representar cada estado como um objeto independente com seu próprio comportamento.
🪄 A solução com Dicionário:
Estados := TDictionary<string, TProc>.Create;
Estados.Add('Autenticado', AcessarDashboard);
Estados.Add('Visitante', MostrarLogin);
Estados[estadoAtual]();
Agora, o comportamento não está mais acoplado ao controle de fluxo, e sim mapeado diretamente ao estado. O código fica mais limpo, estável e pronto para crescer.
🧠 Vantagens:
- Lógica por estado fica encapsulada.
- Facilita a adição de novos estados.
- Reduz ramificações e duplicações.
🚀 Use quando:
- Implementar máquinas de estado.
- Lidar com fluxos complexos (ex: processos de compra, autenticação, validação).
🔌 Plugin Pattern - Extensibilidade com registro dinâmico
📌 O problema: Você quer encapsular ações como objetos para poder:
- Agendá-las.
- Reexecutá-las.
- Revertê-las (undo/redo).
- Combiná-las em sequência.
Ao invés de:
if Acao = 'Salvar' then
SalvarArquivo;
🪄 Solução com Dicionário:
Comandos := TDictionary<string, TProc>.Create;
Comandos.Add('Salvar', SalvarArquivo);
Comandos.Add('Imprimir', ImprimirDocumento);
Comandos[NomeDoComando](); // Executa dinamicamente
💎 Expansão:
Você pode registrar essas ações em tempo de execução, armazenando histórico, ou mesmo criar macros de comandos.
🧠 Vantagens:
- Ações podem ser tratadas como dados.
- Ideal para interfaces (menus, botões, teclas de atalho).
- Facilita histórico, desfazer/refazer, logo.
🚀 Use quando:
- Criar menus e botões dinamicamente.
- Implementar sistemas de histórico.
- Reutilizar ou encadear ações.
Conclusão
O uso de dicionários de ações não é apenas uma alternativa moderna ao if e else. Ele representa uma forma de pensar diferente, onde o comportamento é tratado como dado e a lógica é descentralizada.
A partir desse padrão simples, você pode construir:
- Estados independentes que controlam fluxos complexos.
- Comandos reutilizáveis com histórico e automação.
- Sistemas modulares e plugináveis com registro dinâmico.