Pregunta

Estoy familiarizado con la arquitectura orientada a objetos, incluido el uso de patrones de diseño y diagramas de clases para visualización, y conozco la arquitectura orientada a servicios con sus contratos y enlaces de protocolo, pero ¿Hay algo característico en una arquitectura de software para un sistema escrito en un lenguaje de programación funcional?

Sé que FP se ha utilizado para proyectos de mediana y gran escala.Paul Graham escribió la primera encarnación de Yahoo!Almacenar en Common Lisp.Algunos sistemas de desarrollo de ceceo son complejos.La inteligencia artificial y los sistemas financieros escritos en lenguajes funcionales pueden volverse bastante grandes.Todos tienen al menos algún tipo de arquitectura inherente, aunque me pregunto si tienen algo en común.

¿Cómo es una arquitectura basada en la evaluación de expresiones?¿Las arquitecturas FP son más componibles?

Actualizar: Kyle me recordó que SICP es un buen recurso para este tema.

Actualización 2: Encontré una buena publicación sobre el tema: ¿Cómo afecta la programación funcional a la estructura de su código?

¿Fue útil?

Solución

El hilo común en la "arquitectura" de proyectos que utilizan lenguajes funcionales es que tienden a estar separados en capas de álgebras en lugar de subsistemas en el sentido tradicional de la arquitectura de sistemas.

Para ver excelentes ejemplos de este tipo de proyectos, consulte XMonada, yi, y felicidades.Si examinas cómo están estructurados, encontrarás que comprenden capas de estructura monádica con algún pegamento combinador entre ellas.

También mira El experimento de Scala artículo que describe una arquitectura donde un sistema se compone de componentes que abstraen sus dependencias.

Otros consejos

Actualmente estoy trabajando en el libro "Diseño y Arquitectura en Programación Funcional".Describe muchos patrones y enfoques de diseño que existen en el mundo puro de FP (el idioma principal es Haskell), pero no solo.El libro le enseña cómo crear una gran aplicación desde cero con estado puro e impuro, subprocesos múltiples, red, base de datos, GUI, cómo dividirla en capas y obtener simplicidad.También muestra cómo modelar dominios e idiomas, cómo organizar y describir la arquitectura de la aplicación, cómo probarla y aún más.

La lista de temas incluye:

  • Enfoques para el modelado de arquitectura mediante diagramas;
  • Análisis de requerimientos;
  • Modelado de dominio DSL integrado;
  • Diseño e implementación de DSL externo;
  • Mónadas como subsistemas con efectos;
  • Mónadas libres como interfaces funcionales;
  • eDSL con flechas;
  • Inversión de control utilizando eDSL monádicos gratuitos;
  • Memoria Transaccional de Software;
  • Lentes;
  • Estado, Lector, Escritor, RWS, mónadas ST;
  • Estado impuro:IORef, MVar, STM;
  • Modelado de dominios concurrentes y de subprocesos múltiples;
  • interfaz gráfica de usuario;
  • Aplicabilidad de técnicas y enfoques convencionales como UML, SOLID, GRASP;
  • Interacción con subsistemas impuros.

El libro se basa en los proyectos de Haskell que estoy investigando, especialmente una aplicación SCADA. Andrómeda.El código de este libro está disponible. aquí.Mientras el libro está en desarrollo (estará listo hasta finales de 2017), te recomiendo que te familiarices con mi artículo "Diseño y Arquitectura en FP". aquí (Rusia).

ACTUALIZAR

Compartí mi libro en línea (primeros 5 capítulos). Ver publicación en Reddit

El mayor punto en común que encontrará en los lenguajes funcionales es el uso de funciones para almacenar datos.Es un poco como usar funciones de acceso en un objeto sin el objeto.En cambio, la función se crea en un entorno donde tiene acceso a los datos que necesita.Ahora esta función se puede pasar y usar en cualquier lugar y aún conservar la capacidad de usar los datos.

He aquí un ejemplo muy sencillo.Esto no es puramente funcional ya que cambia de estado, pero es bastante común:

(define (make-counter)
  (let ((count 0))
    (lambda ()
      (set! count (+ count 1))
      count)))

(define x (make-counter))

(x) returns 1

(x) returns 2

...etc...

Entonces tenemos una función, make-counter, que devuelve otra función que tiene el estado del contador dentro.Podemos llamar a ese contador recién creado y observar el cambio en su interior.

Así se estructuran los programas funcionales.Tienes funciones que toman funciones como argumentos, tienes funciones que devuelven funciones con estado oculto, etc.Es todo mucho más limpio que administrar la memoria usted mismo.

He trabajado con algunos proyectos funcionales bastante grandes.Por lo general, se dividen en dos campos (al menos los que yo he usado):

  • Escalabilidad/fiabilidad/concurrencia extremas.Los modelos transaccionales se pueden integrar muy estrechamente en el lenguaje.El ML concurrente es un gran ejemplo de esto, y es muy difícil que los proyectos que lo utilizan se equivoquen en lo que respecta a la corrección de la concurrencia.
  • Análisis/modificación de marcos.Muchos de los patrones de diseño en los que se basan estos marcos son increíblemente fáciles de formular/construir/modificar en lenguajes funcionales.El patrón de visitantes es un gran ejemplo de esto.

Imprimí y revisé Patrones de diseño en Ocaml, y utilizan módulos y functores (y objetos) para recrear los patrones de diseño normales a los que estamos acostumbrados.Es interesante, pero creo que usan objetos. también Falta mucho para ver realmente los beneficios de los lenguajes funcionales.FP es muy componible, es parte de su naturaleza.Supongo que mi respuesta corta es usar módulos y functores.

Mi proyecto actual es bastante grande y separamos cada módulo por archivos, implícitos en ocaml.También he estado buscando un recurso completo que pueda tener algunas opiniones alternativas o algunas ideas sobre un diseño realmente exitoso que surgió de un proyecto.

Esperemos que no sea demasiado tangencial, pero probablemente sea interesante para cualquiera que busque las respuestas a esta pregunta esta presentación. Patrones de diseño en programación dinámica por Peter Norvig.

Creo que esto puede ayudar;

Algunos de los patrones desaparecen, es decir, son compatibles directamente con las características del lenguaje, algunos patrones son más simples o tienen un enfoque diferente, y algunos son esencialmente sin cambios.

[AIM-2002-005] Gregorio T.sullivan, Funciones avanzadas del lenguaje de programación para patrones de diseño ejecutables "Mejores patrones a través de la reflexión

22 de marzo de 2002

El libro de patrones de diseño [GOF95] presenta 24 patrones probados en el tiempo que aparecen constantemente en sistemas de software bien diseñados.Cada patrón se presenta con una descripción del problema de diseño que aborda el patrón, así como el código de implementación de la muestra y las consideraciones de diseño.Este artículo explora cómo los patrones del libro "Gang of Four '' o" GoF ", como a menudo se llama, aparecen cuando se abordan problemas similares utilizando un lenguaje de programación dinámico, de orden superior y orientado a objetos.Algunos de los patrones desaparecen, es decir, son compatibles directamente con las características del lenguaje, algunos patrones son más simples o tienen un enfoque diferente, y algunos son esencialmente sin cambios.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top