Estoy trabajando en un proyecto que procesa solicitudes, y la solicitud tiene dos componentes: el comando y los parámetros. El controlador para cada comando es muy simple (<10 líneas, a menudo <5). Hay al menos 20 comandos y probablemente tendrá más de 50.
Se me ocurrieron algunas soluciones:
- un gran interruptor / if-else en comandos
- mapa de comandos a funciones
- mapa de comandos a clases estáticas / singletons
Cada comando realiza una pequeña comprobación de errores, y el único bit que puede extraerse es verificar la cantidad de parámetros, que se define para cada comando.
¿Cuál sería la mejor solución a este problema y por qué? También estoy abierto a cualquier patrón de diseño que pueda haber pasado por alto.
Se me ocurrió la siguiente lista pro / con para cada uno:
cambiar
- pros
- mantiene todos los comandos en una función; como son simples, esto lo convierte en una tabla de búsqueda visual
- no es necesario abarrotar la fuente con toneladas de pequeñas funciones / clases que solo se usarán en un lugar
- contras
- muy largo
- difícil de agregar comandos mediante programación (es necesario encadenar usando el caso predeterminado)
comandos de mapa -> función
- pros
- trozos pequeños y del tamaño de un bocado
- puede agregar / eliminar comandos mediante programación
- contras
- si se hace en línea, lo mismo visualmente que el interruptor
- si no se hace en línea, muchas funciones solo se usan en un lugar
comandos de mapa -> clase estática / singleton
- pros
- puede usar polimorfismo para manejar la verificación de errores simple (solo como 3 líneas, pero aún así)
- beneficios similares al mapa -> solución de función
- contras
- muchas clases muy pequeñas desordenarán el proyecto
- la implementación no está en el mismo lugar, por lo que no es tan fácil escanear implementaciones
Notas adicionales:
Estoy escribiendo esto en Go, pero no creo que la solución sea específica del idioma. Estoy buscando una solución más general porque es posible que deba hacer algo muy similar en otros idiomas.
Un comando es una cadena, pero puedo asignarlo fácilmente a un número si es conveniente. La firma de la función es algo así como:
Reply Command(List<String> params)
Go tiene funciones de nivel superior, y otras plataformas que estoy considerando también tienen funciones de nivel superior, de ahí la diferencia entre las opciones segunda y tercera.