[functional-programming] ¿Existe una metodología de ingeniería de software para la programación funcional?



Answers

Para Clojure, recomiendo volver al buen viejo modelo relacional. Out of the Tarpit es una lectura inspiradora.

Question

La ingeniería de software, tal como se enseña hoy, está completamente enfocada en la programación orientada a objetos y la visión 'natural' del mundo orientada a objetos. Existe una metodología detallada que describe cómo transformar un modelo de dominio en un modelo de clase con varios pasos y una gran cantidad de artefactos (UML) como diagramas de casos de uso o diagramas de clases. Muchos programadores han internalizado este enfoque y tienen una buena idea sobre cómo diseñar una aplicación orientada a objetos desde cero.

El nuevo hype es la programación funcional, que se enseña en muchos libros y tutoriales. Pero, ¿qué hay de la ingeniería de software funcional? Mientras leía sobre Lisp y Clojure, surgieron dos afirmaciones interesantes:

  1. Los programas funcionales a menudo se desarrollan de abajo hacia arriba en lugar de hacia arriba ('On Lisp', Paul Graham)

  2. Los Programadores Funcionales usan Mapas donde OO-Programadores usan objetos / clases ('Clojure para Programadores de Java', charla de Rich Hickley).

Entonces, ¿cuál es la metodología para un diseño sistemático (¿basado en el modelo?) De una aplicación funcional, es decir, en Lisp o Clojure? ¿Cuáles son los pasos comunes, qué artefactos uso, cómo los mapeo desde el espacio problemático al espacio de la solución?




Ver mi respuesta a otra publicación:

¿Cómo aborda Clojure la separación de preocupaciones?

Acepto que se debe escribir más sobre el tema sobre cómo estructurar aplicaciones grandes que usan un enfoque de FP (se necesita hacer más para documentar las IU impulsadas por FP)




Existe el estilo de "cálculo de programa" / "diseño por cálculo" asociado con el Prof. Richard Bird y el grupo Algebra of Programming en la Universidad de Oxford (Reino Unido). No creo que sea demasiado exagerado considerar esto como una metodología.

Personalmente, aunque me gusta el trabajo producido por el grupo de AoP, no tengo la disciplina para practicar el diseño de esta manera yo mismo. Sin embargo, ese es mi defecto, y no uno de los cálculos del programa.




La programación de OO ajusta estrechamente los datos con el comportamiento. La programación funcional separa los dos. Por lo tanto, no tiene diagramas de clase, pero sí tiene estructuras de datos y, en particular, tiene tipos de datos algebraicos. Esos tipos se pueden escribir para que coincidan muy estrechamente con su dominio, incluida la eliminación de valores imposibles por construcción.

Así que no hay libros ni libros sobre eso, pero hay un enfoque bien establecido para, como dice el refrán, hacer que los valores imposibles sean irrepresentables.

Al hacerlo, puede elegir entre representar ciertos tipos de datos como funciones y, a la inversa, representar determinadas funciones como una unión de tipos de datos para que pueda obtener, por ejemplo, serialización, especificación más estricta, optimización, etc. .

Luego, dado eso, escribes funciones sobre tus adts para que establezcas algún tipo de álgebra , es decir, hay leyes fijas que se aplican a estas funciones. Algunos son quizás idempotentes, lo mismo después de múltiples aplicaciones. Algunos son asociativos. Algunos son transitivos, etc.

Ahora tiene un dominio sobre el que tiene funciones que se componen de acuerdo con las leyes que se comportan bien. ¡Un simple DSL incorporado!

Ah, y las propiedades dadas, por supuesto, puedes escribir pruebas aleatorias automatizadas de ellas (como QuickCheck) ... y eso es solo el comienzo.







Recientemente encontré este libro: Modelado de dominio funcional y reactivo

Creo que está perfectamente en línea con tu pregunta.

De la descripción del libro:

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.






Related