Entrambe le dichiarazioni di switch
e il polimorfismo hanno il loro uso. Si noti tuttavia che esiste anche una terza opzione (nelle lingue che supportano i puntatori / lambda delle funzioni e le funzioni di ordine superiore): mappatura degli identificativi in questione alle funzioni del gestore. Questo è disponibile ad es. C che non è un linguaggio OO e C # che è *, ma non (ancora) in Java, anch'esso OO *.
In alcuni linguaggi procedurali (senza polimorfismo e funzioni di ordine superiore) le istruzioni switch
/ if-else
erano l'unico modo per risolvere una classe di problemi. Così tanti sviluppatori, abituati a questo modo di pensare, hanno continuato a usare switch
anche nei linguaggi OO, dove il polimorfismo è spesso una soluzione migliore. Questo è il motivo per cui spesso si consiglia di evitare / refactificare le dichiarazioni di switch
a favore del polimorfismo.
In ogni caso, la soluzione migliore dipende sempre dal caso. La domanda è: quale opzione ti offre un codice più pulito, più conciso e più gestibile a lungo termine?
Le istruzioni switch possono spesso diventare ingombranti, avere dozzine di casi, rendere difficile la loro manutenzione. Dal momento che devi mantenerli in una singola funzione, quella funzione può diventare enorme. Se questo è il caso, dovresti prendere in considerazione il refactoring verso una soluzione basata su mappa e / o polimorfa.
Se lo stesso switch
inizia a comparire in più punti, il polimorfismo è probabilmente l'opzione migliore per unificare tutti questi casi e semplificare il codice. Soprattutto se si prevede che verranno aggiunti altri casi in futuro; più posti è necessario aggiornare ogni volta, maggiori possibilità di errori. Tuttavia, spesso i singoli gestori di casi sono così semplici, o ce ne sono così tanti, o sono così interconnessi, che rifattorizzarli in una gerarchia di classe polimorfica completa è eccessivo, o si traduce in un sacco di codice duplicato e / o ingarbugliato, difficile da mantenere la gerarchia di classi. In questo caso, potrebbe essere più semplice utilizzare invece le funzioni / lambdas (se la lingua lo consente).
Tuttavia, se disponi di una switch
in un singolo luogo, con pochi casi che fanno qualcosa di semplice, potrebbe essere la soluzione migliore per lasciarla come è.
* Uso liberamente il termine "OO" qui; Non sono interessato ai dibattiti concettuali su ciò che è "reale" o "puro" OO.