Programación funcional vs. OOP [cerrado]

91

He oído hablar mucho sobre el uso de lenguajes funcionales como Haskell en los últimos tiempos. ¿Cuáles son algunas de las grandes diferencias, ventajas y desventajas de la programación funcional frente a la programación orientada a objetos?

    
pregunta GSto 05.10.2010 - 21:02

5 respuestas

66

Diría que es más Programación funcional vs Programación imperativa .

La mayor diferencia es que la programación imperativa se trata de flujo de control , mientras que la programación funcional se trata de flujo de datos . Otra forma de decirlo es que la programación funcional solo usa expresiones , mientras que en la programación imperativa se utilizan tanto expresiones como declaraciones .

Por ejemplo, en imperativo las variables y los bucles de programación son comunes cuando se trata del estado, mientras que en funcional la programación se maneja mediante el paso de parámetros, lo que evita los efectos secundarios y tareas.

Seudo código imperativo de 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;
}

Pseudocó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 control con programación funcional por Simon Peyton -Jones para una buena introducción a los conceptos funcionales.

    
respondido por el Jonas 05.10.2010 - 23:19
15

La programación funcional se basa en un modelo declarativo y tiene sus raíces en el cálculo lambda. Ofrece una gran cantidad de grandes conceptos que pueden tomarse 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 para nada más, el aprendizaje de la programación funcional es útil para los conceptos que contiene. Cambiará la forma en que haces la programación y piensas en 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 utilizar 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 empiezas a considerar la programación de múltiples hilos mientras usas objetos mutables. En tales casos, debe usar un uso intensivo de los objetos de sincronización y es casi imposible perfeccionar una aplicación grande.

Ahí es donde entra en juego la programación funcional. Debido a cosas como la inmutabilidad, la programación funcional realmente simplifica los programas de múltiples subprocesos. Hace que sea casi trivialmente sencillo paralelizar algo cuando sabes que, dada la entrada X a una función, siempre generará Y. También sabes que una variable (o valor en la programación funcional) no puede cambiar el uso medio de otro hilo.

    
respondido por el Brian R. Bondy 05.10.2010 - 21:17
8

(Esta respuesta se adapta de un responder 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 de software:

  • Los lenguajes orientados a objetos son buenos cuando tienes un conjunto fijo de operaciones en cosas , y a medida que tu código evoluciona, principalmente agregas cosas nuevas. Esto se puede lograr agregando nuevas clases que implementan métodos existentes, y las clases existentes se quedan solas.

  • Los lenguajes funcionales son buenos cuando tienes un conjunto fijo de cosas y, a medida que tu código evoluciona, principalmente agregas 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 quedan 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 cosa a un programa funcional puede requerir editar muchas definiciones de función para agregar un nuevo caso.

Este problema ha sido bien conocido durante muchos años; en 1998, Phil Wadler lo denominó "problema de expresión" . Aunque algunos investigadores piensan que el problema de la expresión se puede abordar con características de lenguaje como los mixins, una solución ampliamente aceptada aún no ha llegado a la corriente principal.

    
respondido por el Norman Ramsey 28.08.2014 - 22:43
4

No hay real contra. Pueden ser perfectamente complementarios. Hay idiomas de FP, que apoyan OOP. Pero las comunidades difieren en la forma en que manejan la modularidad.

Los usuarios de lenguajes de PF tienden a lograr modularidad a través de leyes matemáticas. Y prefieren las pruebas para demostrar el cumplimiento de sus leyes.

En el imperativo OOP, los usuarios 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 de esta manera la modularidad.

Es solo un aspecto pequeño, pero creo que vale la pena mencionarlo.

    
respondido por el Edgar Klerks 22.04.2012 - 13:09
2

Una analogía:

Te entregan una solicitud de empleo. Usted completa su nombre, información de contacto e historial de trabajo. Cuando hayas terminado, ya no tienes una aplicación en blanco.

Ahora imagina, en cambio, que, antes de escribir, lo superpones con una hoja transparente de celofán. Tu escribes tu nombre. Se agrega otra hoja de celofán. Usted escribe su información de contacto. Más celofán. Usted escribe su historial de trabajo. Cuando hayas terminado, todavía tienes 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 solo cambio discreto.

El primero (OOP) abarca 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, usando diferentes estrategias, capturar el efecto de completar una solicitud de trabajo. OOP cambia el instrumento de inicio directamente, mientras que la FP superpone lo que vino antes de para afectar la apariencia del cambio .

    
respondido por el Mario T. Lanza 19.06.2014 - 20:16

Lea otras preguntas en las etiquetas

Comentarios Recientes

Característica ansiedad frente a reactividad proactiva [decidido] Crisis en el diseño estructural [cerrado] Posibilidad de códigos duros excesivos [decidido] Sistema de línea de tiempo / temporizador para registrar XML [abierto] usando XDML para ETL ( [decidido] Bibliotecas para inferencia intermedia en lugar de plantillas ([cerrado] Mapa de acción de onda de XLiving ([abierto] Programas de nodos KMD ([decidido] Estándares abiertosFora: Colecciones y empalmes de Clojure que pueden devolver valores aleatorios de... Lee mas