Sto lavorando a un progetto che elabora le richieste e ci sono due componenti per la richiesta: il comando e i parametri. Il gestore per ciascun comando è molto semplice (<10 righe, spesso <5). Ci sono almeno 20 comandi e probabilmente ne avranno più di 50.
Ho escogitato un paio di soluzioni:
- un grande interruttore / if-else sui comandi
- mappa dei comandi alle funzioni
- mappa dei comandi per classi / singoli statici
Ogni comando esegue un piccolo controllo degli errori e l'unico bit che può essere estratto è il controllo del numero di parametri, che è definito per ciascun comando.
Quale sarebbe la migliore soluzione a questo problema e perché? Sono anche aperto a tutti i modelli di design che potrei aver perso.
Ho escogitato il seguente elenco pro / con per ciascuno:
interruttore
- professionisti
- mantiene tutti i comandi in un'unica funzione; poiché sono semplici, questo lo rende una tabella di ricerca visiva
- non è necessario ingombrare la fonte con tonnellate di piccole funzioni / classi che verranno utilizzate solo in un posto
- cons
- molto lungo
- difficile aggiungere comandi a livello di codice (necessità di concatenare utilizzando il caso predefinito)
comandi mappa -> funzione
- professionisti
- piccoli pezzi di dimensioni ridotte
- può aggiungere / rimuovere comandi a livello di codice
- cons
- se fatto in linea, lo stesso visualmente dell'interruttore
- se non fatto in linea, molte funzioni utilizzate solo in un posto
comandi mappa -> classe statica / singleton
- professionisti
- può usare il polimorfismo per gestire un semplice controllo degli errori (solo come 3 righe, ma comunque)
- vantaggi simili a map -> soluzione funzionale
- cons
- molte classi molto piccole ingombreranno il progetto
- l'implementazione non è tutto nello stesso posto, quindi non è facile analizzarla
Note extra:
Sto scrivendo questo in Go, ma non credo che la soluzione sia specifica della lingua. Sto cercando una soluzione più generale perché potrei aver bisogno di fare qualcosa di molto simile in altre lingue.
Un comando è una stringa, ma posso facilmente mapparlo su un numero, se conveniente. La firma della funzione è simile a:
Reply Command(List<String> params)
Go ha funzioni di livello superiore e altre piattaforme che sto considerando hanno anche funzioni di livello superiore, da cui la differenza tra la seconda e la terza opzione.