4 Pregunta: Programación funcional vs programación orientada a objetos [cerrado]

pregunta creada en Tue, Aug 22, 2017 12:00 AM

He estado expuesto principalmente a la programación de OO hasta ahora y estoy ansioso por aprender un lenguaje funcional. Mis preguntas son:

  • ¿Cuándo elige la programación funcional sobre la orientada a objetos?
  • ¿Cuáles son las definiciones típicas de problemas donde la programación funcional es una mejor opción?
744
  1. 2010-01-16 22: 23: 26Z
  2. 2013-09-11 02: 14: 50Z
  3. pregunta similar cs.se también se cerró qué es un ejemplo donde la programación funcional proporciona mejores resultados que el estilo imperativo . la sabiduría convencional parece ser que uno no es superior al otro, o que no son comparables en criterios simples, o que se usan para diferentes propósitos ... la programación funcional tiene más orígenes científico /académico & usa y es menos común en la industria, por lo que la pregunta también establece una pov /conflicto sin solución "industria contra academia". una referencia clásica que muestra el estilo OOP en la programación funcional, SICP book /MIT
    2014-04-27 15: 19: 10Z
4 Respuestas                              4                         
  

¿Cuándo elige la programación funcional sobre la orientación a objetos?

Cuando anticipa 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 apodó el "problema de expresión" . Aunque algunos investigadores piensan que el problema de la expresión se puede abordar con características de lenguaje tales como mixins, una solución ampliamente aceptada aún no ha llegado a la corriente principal.

  

¿Cuáles son las definiciones típicas de problemas donde la programación funcional es una mejor opción?

Los lenguajes funcionales sobresalen en la manipulación de datos simbólicos en forma de árbol. Un ejemplo favorito son los compiladores, donde los lenguajes fuente e intermedios cambian raramente (principalmente las mismas cosas ), pero los escritores de compiladores siempre están agregando nuevas traducciones y mejoras de código u optimizaciones (nuevas operaciones en cosas). En general, la compilación y la traducción son "aplicaciones asesinas" para lenguajes funcionales.

    
1146
2010-05-09 08: 11: 56Z
  1. Hay un zen serio detrás de esta respuesta. Creo que ilumina el hecho de que cierto diseño de OOP pattLos erns (Visitante) son en realidad hacks que intentan superar el problema de agregar nuevas operaciones.
    2013-03-26 16: 08: 45Z
  2. En JavaScript, puedes tener todas las cosas.
    2013-11-15 17: 38: 43Z
  3. @ ErikReppen en el punto en que surge la pregunta, ¿cuándo elige utilizar las funciones funcionales y cuándo elige las funciones orientadas a objetos?
    2013-11-23 00: 38: 15Z
  4. @ NormanRamsey No es nada raro mezclarlo en JS y las funciones de primera clase están vinculadas a muchas características relacionadas con JS OOP. La clasificación de matrices de JS toma funciones como un argumento que puede producir algunas estructuras de datos poderosas. Closures + una función pasada se usa para mantener los objetos de jQuery muy ligeros en la memoria ya que la mayoría de los métodos son solo referencias. Etc ...
    2013-11-23 00: 55: 23Z
  5. @ NormanRamsey: Muy buena respuesta, en la línea de SICP. De acuerdo con esta clasificación, la programación funcional y de procedimiento se agrupan en el lado opuesto de la programación orientada a objetos. Esto podría explicar el auge de la OOP a fines de la década de 1980: principios de la década de 1990: cuando las GUI se convirtieron en una OOP generalizada, demostraron ser un buen método para modelarlas porque normalmente tiene un conjunto fijo de operaciones (pintar, abrir, cerrar, cambiar el tamaño) y un número creciente de widgets. Por supuesto, esto no significa que la POO sea mejor que el procedimiento para cualquier aplicación, como ilustró.
    2015-01-09 17: 54: 27Z

No necesariamente tienes que elegir entre los dos paradigmas. Puede escribir software con una arquitectura OO utilizando muchos conceptos funcionales. FP y OOP son de naturaleza ortogonal .

Tomemos por ejemplo C #. Se podría decir que es principalmente OOP, pero hay muchos conceptos y construcciones de PF. Si considera Linq , las construcciones más importantes que permiten que Linq exista son de naturaleza funcional: expresiones lambda .

Otro ejemplo, F #. Se podría decir que es principalmente de FP, pero hay muchos conceptos y construcciones de POO disponibles. Puede definir clases, clases abstractas, interfaces, lidiar con la herencia. Incluso puede usar la mutabilidad cuando hace que su código sea más claro o cuando aumenta dramáticamente el rendimiento.

Muchos lenguajes modernos son multi-paradigma.

Lecturas recomendadas

Como estoy en el mismo barco (fondo de POO, aprendiendo FP), te sugiero algunas lecturas que realmente aprecié:

168
2010-05-09 08: 10: 07Z
  1. @ duffymo: tu comentario, la forma en que lo pones, es en su mayoría inútil. Nadie quiere una comparación de idiomas, máquinas virtuales o plataformas, gracias.
    2010-01-16 22: 08: 56Z
  2. @ Bruno - una respuesta a "power of .NET". Relájate.
    2010-01-16 22: 14: 39Z
  3. Curioso, no te veo reprendiendo a Dykam por su inútil comentario. ¿Fuiste nominado como moderador mientras no estaba mirando? Nadie está ardiendo aquí excepto tú. Lo diré de nuevo - relhacha.
    2010-01-16 22: 18: 42Z
  4. Jeh, perdón si empecé a hacer llamas. No quise decir que otras plataformas son menos potentes, solo que .NET no solo es compatible con OOP. Por ejemplo, tiene optimización de llamadas de cola.
    2010-01-16 22: 26: 45Z
  5. @ nawfal, hasta que pueda señalar algunas características intrínsecas en los dos paradigmas y decir que son incompatibles, son ortogonales: ese es el corazón de la discusión . FP es incompatible con la programación imperativa por definición, pero la OOP no se limita a la programación imperativa. La razón por la que tenemos diferentes palabras para estos conceptos es para poder hablar de ellos: cuando los agrupas, nos obligas a encontrar nuevas palabras innecesariamente.
    2016-02-10 06: 16: 32Z

Ofertas de programación orientada a objetos:

  1. Encapsulación, para
    • control de mutación del estado interno
    • limitar el acoplamiento a la representación interna
  2. Subtitulación, permitiendo:
    • sustitución de tipos compatibles (polimorfismo)
    • un medio simple para compartir la implementación entre clases (herencia de implementación)

La programación funcional, en Haskell o incluso en Scala, puede permitir la sustitución a través de un mecanismo más general de clases de tipo. El estado interno mutable está desanimado o prohibido. También se puede lograr la encapsulación de la representación interna. Consulta Haskell vs OOP para una buena comparación.

La afirmación de Norman de que "Agregar un nuevo tipo de cosa a un programa funcional puede requerir editar muchas definiciones de función para agregar un nuevo caso". Depende de qué tan bien el código funcional ha empleado clases de tipo. Si la concordancia de patrones en un tipo de datos abstracto en particular se propaga a través de una base de código, ciertamente sufrirá este problema, pero tal vez sea un diseño pobre para empezar.

EDITADO Se eliminó la referencia a las conversiones implícitas al discutir las clases de tipos. En Scala, las clases de tipos se codifican con parámetros implícitos, no conversiones, aunque las conversiones implícitas son otro medio para lograr la sustitución de tipos compatibles.

    
31
2010-02-18 14: 08: 33Z
  1. Las clases de tipos no son un mecanismo para la conversión implícita a otros tipos. Son una descripción de un conjunto de funciones definidas para un tipo para proporcionar una forma de polimorfismo. Lo más cercano al OOP de estilo Java serían las interfaces, aunque las clases de tipos de Haskell tienen algunas diferencias importantes.
    2010-02-18 08: 48: 22Z
  1. Si estás en un entorno muy concurrente, entonces la programación funcional pura es útil. La falta de estado mutable hace que la concurrencia sea casi trivial. Ver Erlang.

  2. En un lenguaje multiparadigm, es posible que desee modelar algunas cosas funcionalmente si la existencia de un estado mutable es un detalle de implementación, y por lo tanto, FP es un buen modelo para el dominio del problema. Por ejemplo, vea la lista de comprensión en Python o std.range en el lenguaje de programación D . Estos están inspirados en la programación funcional.

23
2010-01-16 21: 41: 00Z
fuente colocada aquí