Estou trabalhando em um projeto que processa solicitações e há dois componentes para a solicitação: o comando e os parâmetros. O manipulador para cada comando é muito simples (<10 linhas, geralmente <5). Existem pelo menos 20 comandos e provavelmente terá mais de 50.
Eu vim com algumas soluções:
- um grande switch / if-else nos comandos
- mapa de comandos para funções
- mapa de comandos para classes estáticas / singletons
Cada comando faz uma pequena verificação de erro, e o único bit que pode ser extraído é a verificação do número de parâmetros, definidos para cada comando.
Qual seria a melhor solução para esse problema e por quê? Também estou aberto a quaisquer padrões de design que eu possa ter perdido.
Eu vim com a seguinte lista pro / con para cada um:
interruptor
- profissionais
- mantém todos os comandos em uma função; por serem simples, isso torna uma tabela de pesquisa visual
- não precisa desordenar a fonte com toneladas de pequenas funções / classes que só serão usadas em um só lugar
- contras
- muito longo
- difícil adicionar comandos programaticamente (é necessário encadear usando o caso padrão)
comandos de mapa -> função
- profissionais
- pequenos pedaços pequenos
- pode adicionar / remover comandos programaticamente
- contras
- se feito em linha, o mesmo visualmente que o switch
- se não for feito em linha, muitas funções são usadas apenas em um só lugar
comandos de mapa -> classe estática / singleton
- profissionais
- pode usar polimorfismo para lidar com a verificação de erros simples (apenas três linhas, mas ainda)
- benefícios semelhantes ao map - - função function
- contras
- muitas classes muito pequenas irão desorganizar o projeto
- implementação nem tudo no mesmo lugar, por isso não é tão fácil verificar implementações
Notas extras:
Estou escrevendo isso no Go, mas não acho que a solução seja específica do idioma. Estou procurando uma solução mais geral, porque talvez eu precise fazer algo muito semelhante em outros idiomas.
Um comando é uma string, mas posso mapeá-lo facilmente para um número, se for conveniente. A assinatura da função é algo como:
Reply Command(List<String> params)
O Go tem funções de nível superior, e outras plataformas que estou considerando também têm funções de nível superior, daí a diferença entre a segunda e a terceira opções.