Tanto las switch
declaraciones como el polimorfismo tienen su uso. Sin embargo, tenga en cuenta que también existe una tercera opción (en idiomas que admiten punteros / lambdas de funciones y funciones de orden superior): asignar los identificadores en cuestión a las funciones de controlador. Está disponible en, por ejemplo, C, que no es un lenguaje OO, y C #, que es *, pero no (todavía) en Java, que también es OO *.
En algunas lenguas de procedimiento (que no tienen funciones polimorfismo ni de orden superior) switch
/ if-else
declaraciones eran la única manera de resolver una clase de problemas. Muchos desarrolladores, habiéndose acostumbrado a esta forma de pensar, continuaron usando switch
incluso en lenguajes OO, donde el polimorfismo es a menudo una mejor solución. Es por eso que a menudo se recomienda evitar / refactorizar las switch
declaraciones a favor del polimorfismo.
En cualquier caso, la mejor solución siempre depende del caso. La pregunta es: ¿ qué opción le ofrece un código más limpio, más conciso y más sostenible a largo plazo?
Las declaraciones de cambio a menudo pueden volverse difíciles de manejar, teniendo docenas de casos, lo que dificulta su mantenimiento. Como debe mantenerlos en una sola función, esa función puede crecer enormemente. Si este es el caso, debe considerar la refactorización hacia una solución basada en mapas y / o polimórficos.
Si lo mismo switch
comienza a aparecer en varios lugares, el polimorfismo es probablemente la mejor opción para unificar todos estos casos y simplificar el código. Especialmente si se espera agregar más casos en el futuro; Cuantos más lugares necesite actualizar cada vez, mayores serán las posibilidades de errores. Sin embargo, a menudo los manejadores de casos individuales son tan simples, o hay tantos de ellos, o están tan interrelacionados, que refactorizarlos en una jerarquía de clase polimórfica completa es excesivo, o resulta en una gran cantidad de código duplicado y / o enredado, difícil mantener la jerarquía de clases. En este caso, puede ser más simple usar funciones / lambdas en su lugar (si su idioma lo permite).
Sin embargo, si tiene una switch
en un solo lugar, con solo unos pocos casos haciendo algo simple, puede ser la mejor solución para dejarlo como está.
* Uso el término "OO" libremente aquí; No me interesan los debates conceptuales sobre lo que es "real" o "puro" OO.