Progtwigción funcional vs progtwigción orientada a objetos

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

  • ¿Cuándo eliges la progtwigción funcional sobre la orientada a objetos?
  • ¿Cuáles son las definiciones típicas de problemas donde la progtwigción funcional es una mejor opción?

¿Cuándo eliges la progtwigció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 las 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 dejan solos.

  • Los lenguajes funcionales son buenos cuando tienes un conjunto fijo de cosas , y a medida que tu código evoluciona, principalmente agregas nuevas operaciones a las 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 progtwig 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 progtwig 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 stream principal.

¿Cuáles son las definiciones de problemas típicos donde la progtwigció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 comstackdores, donde los lenguajes de origen e intermedios cambian rara vez (casi siempre lo mismo), pero los escritores de comstackdores siempre agregan nuevas traducciones y mejoras u optimizaciones de código (nuevas operaciones en cosas). La comstackción y la traducción en general son “aplicaciones asesinas” para los lenguajes funcionales.

No necesariamente tiene que elegir entre los dos paradigmas. Puede escribir software con una architecture 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é:

  • Progtwigción funcional para el desarrollo .NET diario , por Jeremy Miller. Un gran artículo (aunque mal formateado) que muestra muchas técnicas y ejemplos prácticos y reales de FP en C #.

  • Progtwigción funcional en el mundo real , por Tomas Petricek. Un gran libro que se ocupa principalmente de los conceptos de PF, tratando de explicar qué son, cuándo deben usarse. Hay muchos ejemplos tanto en F # como en C #. Además, el blog de Petricek es una gran fuente de información.

Progtwigció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 (polymorphism)
    • un medio crudo de compartir implementación entre clases (herencia de implementación)

La Progtwigció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 progtwig 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 tipo. 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.

  1. Si se encuentra en un entorno muy concurrente, entonces la progtwigció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, consulte la lista de comprensiones en Python o std.range en el lenguaje de progtwigción D. Estos están inspirados en la progtwigción funcional.

La progtwigción orientada a objetos (OOP) es un paradigma de progtwigció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 progtwigción funcional es un paradigma de progtwigción, un estilo de construcción de la estructura y los elementos de los progtwigs 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 progtwig. 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 progtwigció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 una herencia basada en prototipos, sobre la basada en clase, que permite que los objetos hereden directamente de otros objetos.