Los casos de interruptores de larga duración o las construcciones if-else-if se evitan en OOP utilizando polimorfismo donde sea aplicable.
en lugar de bifurcar haciendo coincidir un valor, la bifurcación se realiza a nivel de clase.
¿Cómo se puede aplicar un enfoque similar en el paradigma de la programación funcional, específicamente Clojure?
functional-programming
clojure
Amogh Talpallikar
fuente
fuente
Respuestas:
No los evitan, los adoptan utilizando la sintaxis de coincidencia de patrones.
Pero la programación funcional es en gran parte ortogonal a la programación orientada a objetos, por lo que la mayoría absoluta de los lenguajes "funcionales" también están orientados a objetos¹, incluido clojure. De hecho, los métodos múltiples de clojure son incluso mejores que los métodos virtuales simples de Java, ya que pueden distribuir dinámicamente tipos de argumentos múltiples, no solo el primero.
Hay un lenguaje puramente funcional que no tiene polimorfismo dinámico, Haskell. En Haskell puede definir métodos múltiples a través de clases de tipos, pero los tipos se resuelven en tiempo de compilación. Para tener diferentes tipos en tiempo de ejecución, debe crear un tipo de unión y escribir la función con coincidencia de patrones (que es como la cadena if, pero con una sintaxis más conveniente) o pedirle al compilador que derive el método componiendo el métodos de los tipos constituyentes. O use la
forall
extensión GHC .¹ Por orientado a objetos quiero decir que el lenguaje tiene alguna forma de polimorfismo dinámico con despacho basado en el tipo de tiempo de ejecución real. Muchos lenguajes nuevos solo tienen polimorfismo "basado en rasgos" donde solo se pueden heredar interfaces; Cuento que como orientado a objetos y para el propósito de esta respuesta es suficiente.
fuente
forall
extensión ghc , es completamente en tiempo de compilación.Esta es una pregunta muy antigua, pero siento que faltaban las respuestas.
Como mencionó, en OO la ramificación se mueve frecuentemente al nivel de clase. Pensemos en lo que eso significa:
Así es exactamente como lo manejarías: una función de orden superior. Su función de orden superior maneja la ramificación, devolviendo funciones optimizadas para el consumo.
En el contexto de su pregunta, el polimorfismo es una especie de abstracción para eso, con mayor seguridad de tipo.
fuente
En el lenguaje de programación funcional, podemos usar funciones y parámetros clave para deshacernos de las ramas condicionales. Eso significa usar funciones con la condición param en lugar de "if esle". Ver ejemplo 3. Como computeSphereArea ({radio: 25.55})
Ejemplo 1: OOP // en OOP (use java por ejemplo (código fuente de: http: //developer.51cto.com/art/200907/136506.htm)):
Ejemplo 2: funcional como oop. // en programación funcional (use javascript por ejemplo):
// Aunque este no es un ejemplo de programa funcional puro, sino con una interfaz funcional, como initCircle () initSphere (). Puedes crear más funciones como computeCircleArea () computeSphereArea () lo hace más funcional. // PS: typeOf () está aquí: https://github.com/will-v-king/javascript-showMe
Ejemplo 3: Ok, hagámoslo más funcional:
fuente