Clojure es un lenguaje poderoso, pero como con cualquier lenguaje, su verdadero poder proviene de la extensibilidad . La capacidad de conectar módulos adicionales y abrir la funcionalidad es clave para el desarrollo adecuado de una aplicación Clojure y, como tal, comprender cómo funciona Clojure y cómo se entrelazan los distintos marcos es clave para un desarrollo adecuado.
Hoy, vamos a echar un vistazo a Clojure y observar algunos marcos comunes que se ofrecen. Resumiremos brevemente estos marcos y, con suerte, crearemos un recurso para que los nuevos desarrolladores de Clojure encuentren su solución dada. Tenga en cuenta que esta lista no se proporciona en ningún orden específico y solo sirve para informar sobre las ofertas generales disponibles.
¿Qué es Clojure (brevemente)?
Clojure es un lenguaje único diseñado desde cero para ser la mejor de muchas cualidades. El autor, Rich Hickey , estableció algunos requisitos que estaba buscando antes de decidirse a crear Clojure:
¿Por qué escribí otro lenguaje de programación? Básicamente porque quería:
- Un Lisp
- para programación funcional
- simbiótico con una plataforma establecida
- diseñado para la concurrencia
y no pude encontrar uno.
Todo esto se basó en el principio de que el lenguaje sería simbiótico con Java : el propio Clojure se ejecuta en la JVM (máquina virtual de Java) y, como tal, el código Java se puede utilizar para llamar a las funciones de Clojure y viceversa. Clojure se basa en expresiones S , lo que significa que, como la mayoría de las implementaciones de Lisp, un lector definido analiza primero la sintaxis en estructuras de datos antes de compilarla.
Un gran enfoque para Clojure fue la idea de que Clojure debería integrarse en programación funcional. La idea de estructuras de datos inmutables y evitar la tipificación estática llevó a la adopción de tipos muy dinámicos con una estructura de datos persistente y estrictamente inmutable en su núcleo. Este enfoque híbrido, en última instancia, va en contra de la orientación a objetos que se ha vuelto tan común en la programación, incluso cuando su uso es inapropiado.
Cabe señalar que, si bien Clojure es en sí mismo un lenguaje, en la práctica, con su gran comunidad central funcionando para desarrollarlo y mejorarlo continuamente, casi forma una plataforma de plantillas y bibliotecas modulares más que un simple lenguaje. Debido a esto, Clojure tiene mucho que ofrecer; es probable que, si desea hacer algo con Clojure, la solución esté ahí.
Frameworks
Por supuesto, este enfoque en la iteración de la comunidad significa que hay muchas posibilidades para implementaciones específicas. La amplitud de plantillas y bibliotecas modulares antes mencionada es el núcleo de lo que hace que Clojure sea tan atractivo: es lo suficientemente universal como para funcionar en casi cualquier JVM, a la vez que es dinámico hasta el punto de ofrecer una amplia gama de funcionalidades. Echemos un vistazo a algunos de estos posibles marcos.
Bibliotecas Compojure y de enrutamiento alternativo
Desde el principio, deberíamos abordar el problema del enrutamiento de bibliotecas a través de su representante más grande: Compojure . Aunque técnicamente no es un marco, Compojure se describe a menudo como tal. Compojure es en gran parte una biblioteca que maneja el enrutamiento y muy poco más allá de las funciones terciarias para ese propósito. Una de las razones por las que a menudo se lo considera un marco es porque está muy ampliamente adoptado.
Dicho esto, hay muchas alternativas a Compojure, incluidas gudu , bidi , Reitit y playnice . Estos son útiles en sus propios casos de uso, pero están fuera del alcance de esta pieza, ya que no son marcos realmente completos.
Catacumba
Catacumba es un marco relativamente joven construido sobre la idea de construir una alternativa asincrónica a Ring sin las limitaciones inherentes a esa implementación. El enfoque en aplicaciones web asincrónicas diferencia a Catacumba de otras en esta lista, especialmente en su soporte para abstracciones como promesas y flujos reactivos. Su enfoque en la reducción de restricciones se refleja en su código base de desarrollo y, debido a esto, la implementación es altamente modular, potente y liviana.
Desafortunadamente, el enfoque específico de Catacumba significa que no es realmente apto para la integración de pila completa: es limitado, poderoso en lo que hace, pero en última instancia está diseñado específicamente para aplicaciones asincrónicas y sin opiniones. Debido a esto, tiene aplicaciones bastante limitadas y debe considerarse solo cuando la aplicación en sí cumple con los requisitos que impulsaron la creación de Catacumba en primer lugar.
ClojureHomePage
ClojureHomePage es un marco único en el que se centra casi por completo en la creación de una página web utilizando Clojure tanto para el front como para el backend . Es compatible con una amplia gama de encabezados web, variables ambientales y rutas, y es capaz de generar HTML y CSS bastante complejos. Además, su soporte para funciones SQL significa que, mientras se genera el frontend, el backend también lo está de una manera muy estrechamente integrada y poderosa .
Por supuesto, al igual que Catacumba, esto plantea la cuestión de si ClojureHomePage es apropiado o no para cualquier situación en la que no se genere una página de inicio. Se podría argumentar que podría ser efectivo crear una API como si fuera una página de inicio, creando un servicio web en un portal, pero en algunos casos, es posible que una API de Clojure nunca sea pública de esa manera. En consecuencia, en este caso, considere los requisitos antes de la implementación.
Hoplon
Una vez más, sin embargo, Hoplon está bastante limitado a una función singular y los módulos que se requieren para realizar esas funciones. Como tal, es muy limitado, y si no tiene la intención de crear una aplicación web de una sola página, su valor es bastante limitado.
Luminus
Dicho esto, hay algo que decir sobre la creación de módulos especialmente diseñados para su implementación específica, y optar por no hacerlo a cambio de un desarrollo más rápido puede incurrir en sus propios costos en el desarrollo futuro.
Por supuesto, existe un gran beneficio para la modularidad predefinida, y debe tenerse en cuenta que poder iniciar un proyecto casi de inmediato y al mismo tiempo deshabilitar módulos no tiene ningún uso para resultados en una implementación de alta eficacia y bajo costo de recursos.
Bigote
Moustache es otro micro-framework para Clojure, pero el espacio en el que opera es bastante importante: actúa como una especie de tránsito entre Ring y varios otros middlewares. Si bien esto puede parecer simple y, de hecho, la única macro necesaria para ejecutarlo es de app
acuerdo con su propia documentación, su uso facilita una amplia gama de interacciones . Cualquier cosa que necesite un controlador Ring, una ruta definida, una cadena de texto sin formato o un envío de método HTTP puede utilizar Moustache.
Este es otro caso en el que el marco es tan "micro" que es difícil considerarlo un marco adecuado; dicho esto, debido al potencial que permite, podría considerarse para las API de Clojure, especialmente teniendo en cuenta el hecho de que las API REST pueden beneficiarse desde su enfoque en vincular el contenido HTTP , que es en esencia una etapa importante de facilitación para la integración hipermedia .
Macchiato
Por ejemplo, podemos mirar tres bibliotecas aleatorias implementadas en el marco para ver qué tan amplias son estas opciones. macchiato-crypto
es una biblioteca que codifica contraseñas de forma segura utilizando bcrypt o scrypt. También admite la verificación de estas contraseñas con una contraseña de texto sin formato para fines de hash. macchiato-db-scratchpad
es un sistema experimental que permite probar diferentes implementaciones y enfoques de bases de datos dentro de Macchiato. macchiato-template
es un sistema de plantillas simple que permite la creación rápida de aplicaciones basadas en Macchiato.
Como puede ver, la amplia gama de opciones que habilita Macchiato es bastante valiosa y, como tal, si está comenzando su desarrollo desde cero, ciertamente es algo a considerar.
Conducto
Duct es un marco de creación de aplicaciones basado en Integrant , diseñado para ser altamente modular . En esencia, Duct forma un tipo de "plano" maestro para las aplicaciones que utilizan un archivo de configuración inmutable con una alta preferencia por el estado local sobre el estado global. Además, Duct prefiere agrupar funciones por propósito en lugar de por capas, lo que hace que el desarrollo sea algo más intuitivo y expresivo en comparación con la agrupación tradicional de "capas" que a menudo domina los métodos de desarrollo tradicionales.
Dicho esto, llamar a Duct un marco está un poco fuera de lugar; en la práctica, es mucho más una plantilla , aunque poderosa. Nuevamente, si está comenzando el desarrollo desde abajo, definitivamente vale la pena considerarlo, pero para las API y aplicaciones existentes, la idea de convertir a una plantilla completamente nueva podría dificultar su adopción.
Conjurar
Conjure se basa en la idea de simplificar las aplicaciones respaldadas por bases de datos mediante el uso de un marco similar a Rails. Con este fin, Conjure se basa en gran medida en bibliotecas de terceros existentes , como se admite en su propia documentación. Dicho esto, Conjure es una biblioteca poderosa para simplificar los aspectos de la base de datos de una aplicación moderna, que a menudo es la etapa más laboriosa y compleja del ciclo de vida del desarrollo. Solo por esta razón, debe considerarse, aunque dentro de los límites de la comprensión de lo que hace funcionalmente, cuán limitado está a un área funcional específica y el hecho de que tiene dependencia de terceros.
Pedestal
El verdadero poder detrás de Pedestal es el hecho de que se basa en conexiones de protocolo, lo que permite un alto grado de personalización, casi al borde del "plug and play". Además, el hecho de que admita encabezados seguros y otras mejores prácticas lo convierte en una oferta clave para API en Clojure que pretenden tener seguridad de calidad, como debería ser cualquier buena aplicación moderna.
Otros marcos:
- Fulcro : una biblioteca para el desarrollo de aplicaciones web de pila completa de una sola página en clj / cljs
- Re-frame : un marco de reactivos para escribir SPA, en Clojurescript.
Conclusión
Clojure es un ejemplo perfecto de potencia modular . Si bien Clojure en sí es ciertamente un lenguaje útil, está algo limitado a un caso de uso y función específicos. La adopción de bibliotecas y marcos modulares adicionales convierte a Clojure en un fuerte competidor para el desarrollo de aplicaciones web, servicios y API modernos.
Dicho esto, cada uno de estos marcos tiene sus propias advertencias, una de las cuales es el hecho de que una aplicación determinada puede requerir varias bibliotecas, módulos y marcos para incluso hacer lo que se requiere en primer lugar. Si bien eso puede ser una estafa para algunos, sin embargo, es un beneficio para otros: la idea de un sistema altamente modular es ciertamente valiosa, y junto con el espíritu y los enfoques de diseño adecuados puede resultar en algo mayor que la suma de sus partes
0 Comentarios
Dejanos tu comentario para seguir mejorando!