11

En marcos de desarrollo web MVC como Ruby on Rails, Django y CakePHP, las solicitudes HTTP se enrutan a los controladores, que captan objetos que generalmente se conservan en un almacén de bases de datos de fondo. Estos objetos representan cosas como usuarios, publicaciones en blogs, etc., y a menudo contienen lógica dentro de sus métodos para permisos, búsqueda y/o mutación de otros objetos, validación, etc.¿Cómo se implementaría el 'Modelo' en una aplicación web Rails en un lenguaje de programación funcional?

Estas estructuras están todas orientadas a objetos. He estado leyendo recientemente sobre programación funcional y parece proponer enormes beneficios como la capacidad de prueba, la concisión, la modularidad, etc. Sin embargo, la mayoría de los ejemplos que he visto para la programación funcional implementan funcionalidades triviales como quicksort o la secuencia fibonnacci, no webapps complejos. He visto algunos frameworks web 'funcionales', y todos parecen implementar la vista y el controlador muy bien, pero en gran medida se saltean toda la parte 'modelo' y 'persistencia'. (Estoy hablando más sobre frameworks como Compojure que se supone que son puramente funcionales, versus algo Lift que convenientemente parece usar la parte OO de Scala para el modelo, pero corríjanme si me equivoco aquí)

No he visto una buena explicación de cómo se puede usar la programación funcional para proporcionar la metáfora que proporciona la programación OO, es decir, las tablas mapean a los objetos, y los objetos pueden tener métodos que proporcionen una lógica potente y encapsulada como permisos y validación. También todo el concepto de usar consultas SQL para persistir datos parece violar todo el concepto de 'efectos secundarios'. ¿Podría alguien proporcionar una explicación de cómo se implementaría la capa 'modelo' en un marco web funcionalmente programado?

+4

Los lenguajes funcionales intentan limitar los efectos secundarios sí. Pero la limitación siempre está dentro de los límites del programa. Los almacenes de datos y IO viven fuera de los límites de la aplicación, por lo que son aceptables. Una vez que los datos han llegado dentro de la aplicación, entonces las transformaciones y el enrutamiento de esos datos deben ser comprensibles y deterministas. –

Respuesta

6

Sin querer golpear marcos MVC orientados a objetos - No sé Rails, Django, pero es una excelente pieza de software para el ojo - No estoy seguro de que el objeto-relacional Mapping es una particularly good metaphor .

Por supuesto, en un lenguaje OO puede parecer natural querer pensar en tablas en términos de objetos, pero en un lenguaje funcional es perfectamente natural pensar en tablas en términos de tablas. Una sola fila se puede representar fácilmente utilizando un tipo de datos algebraicos (en Haskell y otros lenguajes funcionales de tipo estático) o un mapa (a.k.a., un diccionario, una estructura asociativa que mapea las claves de los valores); una mesa se convierte entonces en una secuencia de filas, que después de todo, está incluso en el nivel DB. Por lo tanto, no existe un mapeo especial desde el constructo DB de una tabla hasta algún otro constructo disponible en el lenguaje de programación; simplemente puede usar tablas en ambos lados.

Ahora bien, esto no significa de ninguna manera que sea necesario utilizar consultas SQL para manipular los datos en la base de datos, renunciando a los beneficios de la abstracción sobre las peculiaridades de varios RDBMS. Dado que está utilizando la etiqueta Clojure, tal vez le interese ClojureQL, una DSL incorporada para comunicarse con varios DB de forma genérica. (Tenga en cuenta que está siendo rediseñado en este momento). Puede usar algunos de estos DSL para extraer datos; manipular los datos así obtenidos usando funciones puras; a continuación, muestre algunos resultados y tal vez persista algunos datos en el DB (usando el mismo DSL).


Si cree que la comparación de una tecnología para la guerra de Vietnam es un poco extremo, supongo que estoy de acuerdo, pero eso no significa que el artículo no hace un trabajo muy bueno de por qué uno discribing podría no querer hundirse en el atolladero ORM.

Tenga en cuenta que podría utilizar el mismo enfoque en un lenguaje OO y abstraer sobre los back-end DB de la misma forma que lo hace en los lenguajes FP (consulte el párrafo siguiente). Por supuesto, su framework MVC ya no se parecería a Rails.

1

Eche un vistazo a Conjure web application framework para ver un ejemplo de cómo se puede implementar una estructura MVC en un lenguaje de programación funcional. Conjure utiliza clj-record para la capa del modelo, que admite asociaciones y validaciones.

Cuestiones relacionadas