Entrambe le switch
affermazioni e il polimorfismo hanno il loro uso. Si noti tuttavia che esiste anche una terza opzione (in lingue che supportano i puntatori / lambda di funzioni e le funzioni di ordine superiore): mappare gli identificatori in questione sulle funzioni del gestore. Questo è disponibile ad es. In C che non è un linguaggio OO, e C # che è *, ma non (ancora) in Java che è anche OO *.
In alcuni linguaggi procedurali (senza polimorfismo né funzioni di ordine superiore) switch
/ if-else
dichiarazioni erano l'unico modo per risolvere una classe di problemi. Tanti sviluppatori, abituati a questo modo di pensare, hanno continuato a utilizzare switch
anche nei linguaggi OO, dove il polimorfismo è spesso una soluzione migliore. Questo è il motivo per cui si raccomanda spesso di evitare switch
dichiarazioni / refattori a favore del polimorfismo.
Ad ogni modo, la soluzione migliore dipende sempre dal caso. La domanda è: quale opzione offre un codice più pulito, più conciso e più gestibile a lungo termine?
Le istruzioni switch possono spesso diventare ingombranti, con dozzine di casi, rendendo difficile la loro manutenzione. Dal momento che devi tenerli in una sola funzione, quella funzione può diventare enorme. In tal caso, è necessario considerare il refactoring verso una soluzione basata su mappa e / o polimorfica.
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 di aggiungere altri casi in futuro; più luoghi è necessario aggiornare ogni volta, maggiori sono le possibilità di errori. Tuttavia, spesso i singoli gestori di casi sono così semplici, o ce ne sono così tanti, o sono così correlati, che il refactoring in una gerarchia di classi polimorfiche completa è eccessivo, o si traduce in un sacco di codice duplicato e / o aggrovigliato, difficile mantenere la gerarchia di classe. In questo caso, potrebbe essere più semplice utilizzare funzioni / lambdas (se la tua lingua lo consente).
Tuttavia, se hai un switch
in un unico posto, con solo pochi casi che fanno qualcosa di semplice, potrebbe essere la soluzione migliore per lasciarlo così com'è.
* Uso il termine "OO" liberamente qui; Non mi interessano i dibattiti concettuali su ciò che è OO "reale" o "puro".