2008-10-10 16 views
52

Desde el primer día de mi carrera en 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 #.¿Cómo se diseña un programa funcional?

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?

Respuesta

19

Lea el SICP.

Además, hay un PDF Version disponible.

+4

Vea las notas de lectura de este tipo sobre el SICP, muy completo. http://eli.thegreenplace.net/category/programming/lisp/sicp/ – ripper234

+0

Además, http://en.wikipedia.org/wiki/Functional_design – Dan

+1

Actualización menor: las notas de lectura de Eli están ahora en http: // eli.thegreenplace.net/tag/sicp –

5

Dado que los lenguajes funcionales modernos (es decir, no lisps) utilizan por defecto funciones polimórficas precoces (de manera eficiente), y que la orientación a objetos es solo una forma particular de organizar las funciones polimórficas, no es muy diferente, si usted sabe cómo diseñar clases adecuadamente encapsuladas.

Lisp utilizan el enrojecimiento tardío para lograr un efecto similar. Para ser honesto, no hay mucha diferencia, excepto que no declaras explícitamente la estructura de los tipos.

Si ha programado extensamente con C++ funciones de plantilla, entonces es probable que tenga una idea ya.

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

+0

Así que, en realidad, son muchas cosas iguales. Solo una forma diferente de pensar. Noté que en C, estaba usando estructuras de la misma manera que uso las clases, que podrían haber sido buenas o malas (sé C, pero no soy C-ace). Cosas similares se aplican? –

+0

No estoy seguro de cómo puede aplicar programación polimórfica a funcional. – dacracot

+0

Aún puede modificar las estructuras, lo cual es una diferencia, pero es un proceso de diseño similar. La principal diferencia es el enfoque en interfaces muy bien definidas y de buen comportamiento que le permiten usar, p. la iteración funciona sensiblemente. Ese hábito ayuda a suavizar las estructuras del programa y acelera el desarrollo. – Marcin

1

La programación funcional es un paradigma diferente. 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.

+0

Creo que un profesor habló de esto una vez ... algo sobre pisotear toda la información para crear algo nuevo. ¿Es esto lo que quiso decir? –

+0

Creo que sí. Un gran problema que la programación funcional aporta al desarrollador/diseñador es el cuidado y la alimentación del blob de datos. Está separado y parte de las funciones. Tienes que estructurarlo con mucho cuidado para que sea compatible con todas las funciones que lo deseen. – dacracot

+1

No recomendaría un diagrama de flujo * en absoluto *. De hecho, el punto de la programación funcional es que puede modelar una colección de funciones como una función única que realiza la transformación compuesta que componen. – Marcin

13

Es posible que desee echa un vistazo a una entrada de blog mío reciente: How does functional programming affect the structure of your code?

En un nivel alto, una metodología de diseño orientado a objetos es aún bastante útil para estructurar un programa F #, pero se encuentra esta descomposición (más excepciones a la regla) a medida que desciendes a niveles más bajos. En un 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 (tipo Clase 1 = ... y Clase2 = ...), y un poco de su código puede residir en funciones "gratuitas" no vinculadas a una clase particular (esto es para lo que F # "módulos" son buenos). 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').

6

How to Design Programs es todo acerca de esto (en tediosa duración, utilizando 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.

2

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

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

1

en la estructuración de los programas funcionales:

Si bien la estructura lenguajes OO el código con clases, los lenguajes funcionales estructura 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 librería estándar.

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

+1

Los objetos no necesariamente contienen estado. Mire la actualización del objeto funcional en OCaml, por ejemplo. –

-1

Se trata de funciones puras y cómo componerlas para crear abstracciones más grandes. Esto es realmente un problema difícil para el cual se necesita robust mathematical background. Afortunadamente, hay varios patrones con una profunda investigación formal y práctica disponible. En Functional and Reactive Domain Modeling Debasish Ghosh explora este tema más a fondo y reúne varios escenarios prácticos aplicando patrones funcionales puros:

funcional y reactiva dominio de modelado le enseña a pensar en el modelo de dominio en términos de funciones puras y cómo componer ellas a construir abstracciones más grandes. Comenzará con los principios básicos de la programación funcional y progresará gradualmente hacia los conceptos avanzados y los patrones que necesita saber para implementar modelos de dominio complejo. El libro demuestra cómo los patrones de FP avanzados como los tipos de datos algebraicos , el diseño basado en clases de clase y el aislamiento de los efectos secundarios pueden hacer que su modelo sea para la legibilidad y la verificabilidad.

Cuestiones relacionadas