Sto lavorando a un progetto che elabora le richieste e ci sono due componenti alla richiesta: il comando e i parametri. Il gestore per ciascun comando è molto semplice (< 10 linee, spesso < 5). Ci sono almeno 20 comandi e probabilmente ne avranno più di 50.
Ho trovato un paio di soluzioni:
- un grosso interruttore / se-altro sui comandi
- mappa dei comandi alle funzioni
- mappa di comandi a classi statiche / singleton
Ogni comando esegue un piccolo controllo degli errori e l'unico bit che può essere estratto è il controllo del numero di parametri, 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 trovato il seguente elenco di pro / contro per ciascuno:
interruttore
- Pro
- mantiene tutti i comandi in una funzione; dal momento che sono semplici, questo lo rende una tabella di ricerca visiva
- non c'è bisogno di ingombrare fonti con tonnellate di piccole funzioni / classi che saranno utilizzate solo in un unico posto
- cons
- molto lungo
- difficile aggiungere comandi a livello di codice (è necessario concatenare il caso predefinito)
comandi della mappa - > la funzione
- Pro
- pezzi piccoli, dimensioni morso
- può aggiungere / rimuovere comandi a livello di codice
- cons
- se fatto in linea, lo stesso visivamente come interruttore
- se non eseguito in linea, molte funzioni vengono utilizzate solo in un unico punto
comandi della mappa - > classe statica / singleton
- Pro
- può utilizzare il polimorfismo per gestire il semplice controllo degli errori (solo come 3 linee, ma comunque)
- vantaggi simili alla mappa - > soluzione di funzione
- cons
- molte classi molto piccole ingombrano il progetto L'implementazione
- non è tutta nello stesso posto, quindi non è così semplice eseguire la scansione delle implementazioni
Note aggiuntive:
Sto scrivendo questo in Go, ma non penso che la soluzione sia specifica per la lingua. Sto cercando una soluzione più generale perché potrei dover fare qualcosa di molto simile in altre lingue.
Un comando è una stringa, ma posso facilmente mapparlo a un numero se conveniente. La firma della funzione è simile a:
Reply Command(List<String> params)
Go ha funzioni di primo livello e altre piattaforme che sto considerando hanno anche funzioni di livello superiore, quindi la differenza tra la seconda e la terza opzione.