programacion paradigma orientada objetos logico funcional ejemplos design f# functional-programming

design - paradigma - programacion funcional python



¿Cómo se diseña un programa funcional? (8)

Dado que los lenguajes funcionales modernos (es decir, no cecear) usan por defecto funciones polimórficas precoces (de manera eficiente), y que la orientación a objetos es solo una manera particular de organizar para tener funciones polimórficas, no es realmente muy diferente, si sabes cómo diseñar clases adecuadamente encapsuladas

Los Lisp usan enlaces tardíos para lograr un efecto similar. Para ser honesto, no hay mucha diferencia, excepto que no declaras explícitamente la estructura de los tipos.

Si programó extensamente funciones de plantillas C ++, probablemente ya tenga una idea.

En cualquier caso, la respuesta es "clases" pequeñas y en lugar de modificar el estado interno, debe devolver una nueva versión con un estado diferente.

Desde el primer día de mi carrera de programación, comencé con la programación orientada a objetos. Sin embargo, estoy interesado en aprender otros paradigmas (algo que he dicho aquí en SO, algunas veces es algo bueno, pero no he tenido tiempo de hacerlo). Creo que no solo estoy listo, sino que tengo tiempo, así que comenzaré la programación funcional con F #.

Sin embargo, no estoy seguro de cómo estructurar aplicaciones de diseño mucho menos. Estoy acostumbrado a las ideas de una clase por archivo y clase-nombre / función-verbo en la programación OO. ¿Cómo se diseñan y estructuran las aplicaciones funcionales?


En la estructuración de programas funcionales:

Mientras que los lenguajes OO estructuran el código con clases, los lenguajes funcionales lo estructuran con módulos. Los objetos contienen estado y métodos, los módulos contienen tipos de datos y funciones. En ambos casos, las unidades estructurales agrupan los tipos de datos junto con el comportamiento relacionado. Ambos paradigmas tienen herramientas para construir y aplicar barreras de abstracción.

Recomiendo encarecidamente elegir un lenguaje de programación funcional con el que se sienta cómodo (F #, OCaml, Haskell o Scheme) y echar un vistazo a cómo está estructurada su biblioteca estándar.

Compare, por ejemplo, el módulo OCaml Stack con System.Collections.Generic.Stack de .NET o una colección similar en Java.


Es posible que desee verificar una entrada de blog reciente mía: ¿Cómo afecta la programación funcional a la estructura de su código?

En un nivel alto, una metodología de diseño OO es bastante útil para estructurar un programa F #, pero encontrará esta división (más excepciones a la regla) a medida que baja a niveles inferiores. A nivel físico, "una clase por archivo" no funcionará en todos los casos, ya que los tipos mutuamente recursivos deben definirse en el mismo archivo ( escriba Class1 = ... y Class2 = ...), y un poco de su el código puede residir en funciones "gratuitas" no vinculadas a una clase en particular (esto es para lo que los "módulos" F # son útiles). Las restricciones de ordenamiento de archivos en F # también lo forzarán a pensar críticamente sobre las dependencias entre los tipos en su programa; esto es una espada de doble filo, ya que puede llevar más trabajo / pensamiento desenredar las dependencias de alto nivel, pero producirá programas que están organizados de una manera que siempre los hace accesibles (ya que las entidades más primitivas siempre son lo primero y se puede siempre lea un programa de ''arriba hacia abajo'' y tenga novedades introducidas una por una, en lugar de simplemente comenzar a buscar un directorio lleno de archivos de código y no saber ''por dónde empezar'').


F # proporciona los enfoques de OO convencionales para la programación estructurada a gran escala (por ejemplo, interfaces) y no intenta proporcionar los enfoques experimentales iniciados en lenguajes como OCaml (por ejemplo, funtores).

En consecuencia, la estructuración a gran escala de los programas F # es esencialmente la misma que la de los programas C #.


La programación funcional es un paradigma diferente, seguro. Quizás la forma más fácil de entenderlo es insistir en que el diseño se organice utilizando un diagrama de flujo. Cada función es distinta, sin herencia, sin polimorfismo, distinta. Los datos se pasan de una función a otra para eliminar, actualizar, insertar y crear nuevos datos.



Se trata de funciones puras y cómo componerlas para construir abstracciones más grandes. Este es realmente un problema difícil para el que se necesita un sólido fondo matemático . Afortunadamente, hay varios patrones con una profunda investigación formal y práctica disponible. Sobre el modelado de dominios reactivos y funcionales Debasish Ghosh explora este tema más a fondo y reúne varios escenarios prácticos que aplican patrones funcionales puros:

El modelado de dominio funcional y reactivo le enseña a pensar en el modelo de dominio en términos de funciones puras y cómo componerlas para crear abstracciones más grandes. Comenzará con los aspectos básicos de la programación funcional y progresará gradualmente hacia los conceptos y patrones avanzados que necesita saber para implementar modelos de dominio complejos. El libro demuestra cómo los patrones de FP avanzados como los tipos de datos algebraicos, el diseño basado en clases de tipo y el aislamiento de los efectos secundarios pueden hacer que su modelo se componga para ser legibles y verificables.


Cómo diseñar programas se trata de esto (a una larga duración, usando Scheme en lugar de F #, pero los principios se mantienen). En resumen, su código refleja sus tipos de datos; esta idea se remonta a la antigua "programación estructurada", solo la programación funcional es más explícita al respecto, y con tipos de datos más elegantes.