Pregunta Programación funcional vs programación orientada a objetos [cerrada]


Hasta ahora, he estado expuesto principalmente a la programación OO y estoy deseoso de aprender un lenguaje funcional. Mis preguntas son:

  • ¿Cuándo eliges 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?

686
2018-01-16 21:41


origen


Respuestas:


¿Cuándo eliges 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 su código evoluciona, usted principalmente agrega cosas nuevas. Esto se puede lograr agregando nuevas clases que implementan métodos existentes, y las clases existentes se dejan solos.

  • Los lenguajes funcionales son buenos cuando tienes un conjunto fijo de cosas, y a medida que su código evoluciona, usted principalmente agrega nuevos operaciones en cosas existentes. Esto se puede lograr agregando nuevas funciones que computan con tipos de datos existentes, y las funciones existentes se dejan en paz.

Cuando la evolución va por el camino equivocado, tienes problemas:

  • Agregar una nueva operación a un programa orientado a objetos puede requerir la edición de muchas definiciones de clase para agregar un nuevo método.

  • Agregar un nuevo tipo de cosas a un programa funcional puede requerir la edición de muchas definiciones de funciones para agregar un nuevo caso.

Este problema ha sido bien conocido por muchos años; en 1998, Phil Wadler lo denominó el "problema de la expresión". Aunque algunos investigadores piensan que el problema de 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 se destacan en la manipulación de datos simbólicos en forma de árbol. Un ejemplo favorito es el de los compiladores, donde las lenguas fuente e intermedias cambian pocas veces (la mayoría son las mismas cosas), pero los escritores de compiladores siempre agregan nuevas traducciones y mejoras u optimizaciones de código (nuevas operaciones en cosas). La compilación y la traducción en general son "aplicaciones asesinas" para los lenguajes funcionales.


1072



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

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

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

Muchos lenguajes modernos son multi-paradigma.

Lecturas recomendadas

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


152



Programación orientada a objetos ofrece:

  1. Encapsulación, a
    • controlar la mutación del estado interno
    • limitar el acoplamiento a la representación interna
  2. Subtipo, permitiendo:
    • sustitución de tipos compatibles (polimorfismo)
    • un medio crudo de compartir 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 tipos. El estado interno mutable está desaconsejado o prohibido. La encapsulación de la representación interna también se puede lograr. Ver Haskell vs OOP para una buena comparación.

La afirmación de Norman de que "Agregar un nuevo tipo de cosas a un programa funcional puede requerir editar muchas definiciones de funciones para agregar un nuevo caso". depende de qué tan bien el código funcional haya empleado clases de tipos. Si la coincidencia de patrones en un tipo de datos abstracto en particular se extiende a lo largo de una base de código, de hecho sufrirá este problema, pero es quizás un diseño pobre para empezar.

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


28



  1. Si se encuentra 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 comprensiones en Python o std.range en el lenguaje de programación D. Estos están inspirados en la programación funcional.


22



La programación orientada a objetos (OOP) es un paradigma de programación basado en el concepto de "objetos", que son estructuras de datos que contienen datos, en forma de campos, a menudo conocidos como atributos; y código, en forma de procedimientos, a menudo conocidos como métodos.

La programación funcional es un paradigma de programación, un estilo de construcción de la estructura y los elementos de los programas informáticos, que trata la computación como la evaluación de las funciones matemáticas y evita el cambio de estado y los datos variables.

OOP dice que reunir datos y su comportamiento en un solo lugar hace que sea más fácil entender cómo funciona un programa. FP dice que los datos y el comportamiento son cosas distintivamente diferentes y deben mantenerse separados para mayor claridad.

Incluso la combinación de Javascript y programación orientada a objetos permite a los desarrolladores escribir códigos que sean limpios, concisos y repetibles. Los desarrolladores pueden crear pequeños bloques de códigos que luego se pueden volver a llamar sin tener que volver a escribir el código o copiar y pegar el código una y otra vez. OOP JavaScript también ofrece herencia basada en prototipos, sobre la basada en la clase, que permite que los objetos hereden directamente de otros objetos.


16