Últimamente he escuchado mucho hablar sobre el uso de lenguajes funcionales como Haskell. ¿Cuáles son algunas de las grandes diferencias, ventajas y desventajas de la programación funcional frente a la programación orientada a objetos?
Últimamente he escuchado mucho hablar sobre el uso de lenguajes funcionales como Haskell. ¿Cuáles son algunas de las grandes diferencias, ventajas y desventajas de la programación funcional frente a la programación orientada a objetos?
Respuestas:
Yo diría que es más programación funcional vs Imperativo de programación .
La mayor diferencia es que la programación imperativa se trata del flujo de control, mientras que la programación funcional se trata del flujo de datos . Otra forma de decirlo es que la programación funcional solo usa expresiones, mientras que en la programación imperativa se usan tanto expresiones como declaraciones .
Por ejemplo, en la programación imperativa, las variables y los bucles son comunes cuando se maneja el estado, mientras que en la programación funcional el estado se maneja a través del paso de parámetros, lo que evita los efectos secundarios y las asignaciones.
Seudocódigo imperativo para una función para calcular la suma de una lista (la suma se mantiene en una variable):
int sumList(List<int> list) {
int sum = 0;
for(int n = 0; n < list.size(); n++) {
sum = sum + list.get(n);
}
return sum;
}
Seudocódigo funcional para la misma función (la suma se pasa como parámetro):
fun sumList([], sum) = sum
| sumList(v::lst, sum) = sumList(lst, v+sum)
Recomiendo la presentación Efectos de domesticación con programación funcional de Simon Peyton-Jones para una buena introducción a los conceptos funcionales.
La programación funcional se basa en un modelo declarativo y tiene sus raíces en el cálculo lambda. Ofrece muchos conceptos geniales que se pueden tomar prestados de lenguajes más imperativos como C ++ y C #.
Algunos ejemplos incluyen transparencia referencial, funciones lambda, funciones de primera clase, evaluación perezosa e impaciente e inmutabilidad.
Si por nada más, aprender programación funcional es útil para los conceptos que contiene. Cambiará la forma de programar y pensar acerca de la programación. Y supongo que en el futuro la programación funcional será tan importante como lo ha sido la programación orientada a objetos.
Para comenzar, puede elegir usar un lenguaje funcional puro como Haskell, o puede usar uno híbrido como F # .
La mayoría de las buenas universidades cubrirán la programación funcional y si vas a la escuela, te sugiero que tomes ese curso.
¿Cuáles son algunas de las grandes diferencias, ventajas y desventajas de la programación funcional frente a la programación orientada a objetos?
La programación bien orientada a objetos es buena porque le permite modelar su problema complejo en jerarquías para que pueda simplificar el problema. Pero se vuelve muy difícil cuando comienzas a considerar la programación de subprocesos múltiples al usar objetos mutables. En tales casos, debe utilizar mucho los objetos de sincronización y es casi imposible perfeccionar una aplicación grande.
Ahí es donde entra la programación funcional. Debido a cosas como la inmutabilidad, la programación funcional realmente simplifica los programas de subprocesos múltiples. Hace que sea casi trivialmente fácil paralelizar algo cuando se sabe que, dada la entrada X a una función, siempre generará Y. También se sabe que una variable (o valor en la programación funcional) no puede cambiar a mitad de uso desde otro hilo.
(Esta respuesta está adaptada de una respuesta a una pregunta cerrada en StackOverflow ).
Una de las grandes diferencias entre la programación funcional y la programación orientada a objetos es que cada uno es mejor en un tipo diferente de evolución del software:
Los lenguajes orientados a objetos son buenos cuando tiene un conjunto fijo de operaciones sobre cosas y, a medida que su código evoluciona, agrega principalmente cosas nuevas. Esto se puede lograr agregando nuevas clases que implementen métodos existentes, y las clases existentes se dejan solas.
Los lenguajes funcionales son buenos cuando tiene un conjunto fijo de cosas y, a medida que su código evoluciona, agrega principalmente nuevas operaciones en cosas existentes. Esto se puede lograr agregando nuevas funciones que computan con los tipos de datos existentes, y las funciones existentes se dejan solas.
Cuando la evolución va por el camino equivocado, tienes problemas:
Agregar una nueva operación a un programa orientado a objetos puede requerir editar muchas definiciones de clase para agregar un nuevo método.
Agregar un nuevo tipo de cosas a un programa funcional puede requerir editar muchas definiciones de funciones para agregar un nuevo caso.
Este problema se conoce desde hace muchos años; en 1998, Phil Wadler lo denominó el "problema de expresión" . Aunque algunos investigadores piensan que el problema de la expresión puede abordarse con características del lenguaje como los mixins, una solución ampliamente aceptada aún no ha llegado a la corriente principal.
No hay real versus. Pueden ser perfectamente complementarios. Hay lenguajes FP, que admiten OOP. Pero las comunidades difieren en la forma en que manejan la modularidad.
Los usuarios de lenguajes FP tienden a lograr modularidad a través de leyes matemáticas. Y prefiera pruebas para demostrar el cumplimiento de sus leyes.
En imperativo, los usuarios de OOP tienden a capturar el comportamiento del objeto en los casos de prueba, que se pueden volver a ejecutar si el objeto ha cambiado y lograr así la modularidad.
Es solo un aspecto pequeño, pero creo que vale la pena mencionarlo.
Una analogía:
Te entregaron una solicitud de empleo. Complete su nombre, información de contacto e historial de trabajo. Cuando haya terminado, ya no tendrá una solicitud en blanco.
Ahora imagine que antes de escribir lo superpone con una hoja transparente de celofán. Tu escribes tu nombre. Agregas otra hoja de celofán. Usted escribe su información de contacto. Más celofán. Tú escribes tu historia laboral. Cuando haya terminado, todavía tiene la aplicación en blanco intacta. También tiene tres hojas de celofán, cada una de las cuales ha capturado el efecto de un único cambio discreto.
El primero (OOP) adopta la idea de cambiar las cosas en su lugar, mientras que el segundo (FP) lo evita. Ambos son paradigmas de gestión estatal. Ambos pueden, utilizando diferentes estrategias, capturar el efecto de completar una solicitud de empleo. OOP cambia el instrumento de inicio directamente, mientras que FP superpone lo que vino antes para efectuar la aparición del cambio .