Programmation Clojure: frameworks et autres outils

Bien que toutes ces bibliothèques visent à simplifier les tâches de programmation Clojure, elles peuvent dérouter un débutant. Parfois, il est difficile de comprendre comment les assembler tous et trouver une solution optimale pour une tâche spécifique. Alors, maintenant, je veux vous montrer mes outils préférés pour la programmation dans Clojure.

  • travailler avec le serveur web et les points de terminaison
  • interaction avec le serveur web et la base de données
  • routage sur le serveur
  • utilisation de GraphQL dans la programmation Clojure
  • prise en charge de l’architecture modulaire

Commençons le voyage dans le monde de la programmation Clojure!

Remarque: lorsque vous quittez Java et d’autres langages similaires, vous devez savoir qu’il n’existe aucun framework traditionnel dans Clojure. Tout est basé sur les bibliothèques et leurs collections. Cela rend la langue plus flexible et polyvalente.

L’écosystème Clojure comprend des bibliothèques de complexité différente. Certains d’entre eux ne sont qu’un ensemble de fonctions supplémentaires (par exemple, une bibliothèque pour travailler avec le temps). Pendant ce temps, les bibliothèques système fournissent une plate-forme pour créer l’ensemble du framework. De telles bibliothèques permettent au programmeur de présenter une application sous la forme d’un ensemble de composants, de décrire les connexions entre eux, etc. La bibliothèque elle-même assure la création de graphiques de dépendance. Par exemple, il peut convertir des composants en choses plus compréhensibles, comme des fonctions.

Objet: travail pratique avec le serveur Web et le code des points de terminaison

: https://github.com/ring-clojure/ring

L’abstraction du serveur HTTP est un élément clé de la pile web Clojure. Il permet un travail simple avec le serveur Web et les points de terminaison, ce qui est essentiel pour le développement d’applications réussi. Créé par analogie avec WSGI (Python) et Rack (Ruby), Ring résume les informations de HTTP dans une API claire et unifiée. En conséquence, le développeur Web peut construire des systèmes modulaires composés de composants et partager ces composants entre divers serveurs et applications.

Comment fonctionne Ring?

Il reçoit des requêtes HTTP et renvoie des réponses HTTP. Donc, Ring n’est pas un soi-disant framework d’application Web.

Raisons d’utiliser Ring

En tant que bibliothèque Web dominante dans la programmation Clojure, Ring est un bon choix pour les débutants. Tout d’abord, sa fonction principale est de fournir une interface pratique pour une large gamme de serveurs Web. De ce point de vue, la technologie est extrêmement utile et fonctionne parfaitement.

Une autre fonctionnalité en anneau fournit un ensemble de modules (‘middleware’). Ainsi, il vous permet d’utiliser différentes bibliothèques pré-écrites, compatibles les unes avec les autres.

La plupart des programmeurs Clojure choisissent Ring pour les points de terminaison en raison de sa capacité à utiliser des middlewares. Par exemple, ces modules permettent de transformer les paramètres requis d’une URL vers la carte de code Clojure. Un développeur web peut facilement écrire un nouveau middleware et l’intégrer à l’écosystème. Par exemple, en utilisant la bibliothèque cemerick / friend, vous pouvez gérer entièrement le processus d’autorisation, appliquer différentes stratégies (à partir du login et du mot de passe, se terminant par OAuth), etc. Le middleware Ring aide à décrire et à démarrer le processus de manière pratique. Il ferme tous les points de terminaison interdits aux utilisateurs non autorisés.

L’expérience dans l’utilisation de Ring est importante pour travailler avec d’autres technologies Clojure. C’est la première chose que vous pouvez utiliser pour faire bouger une application.

Http-kit

Objectif: démarrage du serveur

Code: https://github.com/http-kit/http-kit

La bibliothèque serveur/client HTTP très efficace et axée sur les événements inclut WebSocket, ainsi qu’une prise en charge asynchrone.

Comment fonctionne Http-kit ?

C’est une bibliothèque pour organiser une interaction de serveur Web appropriée. Http-kit convient aux applications asynchrones ou synchrones hautement simultanées. En ce qui concerne WebSocket et HTTP long polling / streaming, il est préférable de disposer d’une API unifiée.

Raisons d’utiliser Http-kit

Solution flexible

Http-kit offre la possibilité de travailler à la fois avec des systèmes sync et asynchrones. La première option est simple, tandis que la seconde fonctionne plus rapidement. Ainsi, vous pouvez faire un choix en fonction de votre objectif spécifique. De plus, vous pouvez utiliser la bibliothèque avec Ring. Cela fonctionne presque comme l’adaptateur de jetée.

Utilisation pratique

La bibliothèque assure la prise en charge des WebSockets, ainsi qu’une gestion parfaite des requêtes HTTP de longue date. Ainsi, la création d’une application en temps réel devient plus facile. De plus, c’est un projet open source. La bibliothèque est disponible sur GitHub sous la licence Apache Version 2.0.

Excellents résultats

HTTP-kit affiche des performances élevées et fonctionne rapidement malgré de grandes charges. Dans le même temps, chaque connexion ne nécessite que quelques Ko de mémoire. Un client / serveur qui est écrit à partir de zéro est disponible sous forme d’un seul POT de ~ 90 Ko avec 0 dépendance et ~ 3k lignes de code clair.

De nombreux développeurs de logiciels considèrent HTTP-kit comme un outil de base pour la programmation Clojure.

Compojure et Bidi

Objectif : routage sur serveur

Code: https://github.com/juxt/bidi, https://github.com/weavejester/compojure

Compojure et Bidi sont toutes deux des technologies de routage dans les applications Web. La première bibliothèque est très populaire parmi la communauté, tandis que la seconde est connue comme une solution pratique pour écrire en ClojureScript.

Comment fonctionnent Compojure et Bidi ?

Ces petites bibliothèques assurent le routage sur un serveur web. En conséquence, un développeur de logiciels peut écrire des applications composées de plusieurs parties distinctes.

Quelle est la différence entre eux?

Les 2 bibliothèques remplissent la même fonction. Mais, contrairement à Compojure, Bidi:

  • prend en charge à la fois clj et cljs
  • est isomorphe et extensible

La principale différence est que dans les routes Bidi, il s’agit de structures de données. Il n’y a pas de macros ici. Ainsi, la bibliothèque offre une approche bidirectionnelle pratique et d’autres avantages. Certains développeurs Web préfèrent Bidi car il affiche chaque itinéraire d’un gestionnaire particulier. De plus, il est possible de lire les routes à partir d’un fichier de configuration, de les générer et de les transformer par fonctions et d’introspecter. Ils travaillent indépendamment des demandes traitées. Ainsi, le développeur peut faire correspondre des choses qui ne sont pas nécessairement des gestionnaires (par exemple, des mots clés).

Lacinia

Objectif: implémentation de GraphQL dans la programmation Clojure

Code: https://github.com/walmartlabs/lacinia

Cette bibliothèque populaire de Clojure est utile pour ceux qui souhaitent implémenter GraphQL tout en travaillant avec des API Web.

Comment Lacinia agit-il?

A l’origine, GraphQL est écrit en JavaScript. Lacinia est une référence officielle à cette implémentation. Il est écrit par analogie avec la spécification initiale. Il peut être appelé un moteur d’exécution de requêtes GraphQL indépendant du backend. Ainsi, la bibliothèque fournit un contact entre vos données et le client GraphQL.

Raisons d’utiliser Lacinia

En utilisant GraphQL, vous pouvez facilement obtenir une API Web plus riche et plus compliquée. Lacinia simplifie le développement d’API car il prend en charge les fragments de requête en ligne/nommés, l’introspection de schéma GraphQL, les abonnements, les interfaces, les unions, les énumérations, les entrées et les scalaires personnalisés.

Écrite dans un langage de schéma basé sur EDN, la bibliothèque fonctionne parfaitement avec les requêtes GraphQL. Il est construit sur Antlr4. Lacinia aide à l’exécution de requêtes asynchrones riches et efficaces. Vous pouvez le brancher sur n’importe quel pipeline HTTP Clojure et utiliser la bibliothèque associée lacinia-pedestal pour le support HTTP.

HoneySQL et HugSQL

Objectif : interaction réussie avec la base de données

Code: https://github.com/jkk/honeysql, https://github.com/layerware/hugsql

De nombreux programmeurs Web se sentent plus à l’aise de travailler avec des technologies SQL, telles qu’Oracle, MS SQL, MySQL, PostgreSQL, SQLite, etc. HoneySQL et HugSQL sont des constructeurs de requêtes qui fournissent un accès stable aux bases de données SQL dans les applications Clojure.

Comment fonctionnent HoneySQL et HugSQL ?

Les deux bibliothèques garantissent l’intégration de SQL dans la programmation Clojure. Ainsi, vous pourrez écrire des commandes de base de données SQL même dans les applications Web Clojure.

Quelle est la différence entre eux?

En utilisant HugSQL, vous commencez par écrire des fichiers SQL séparés et les mettre dans votre application. Le constructeur de requêtes est inspiré d’une autre bibliothèque populaire, YeSQL. Il analyse non seulement les fichiers SQL en fonctions Clojure, mais convient également à plus de cas d’utilisation que YeSQL. HugSQL est activement maintenu. Il dispose d’adaptateurs basés sur des protocoles prenant en charge plusieurs bibliothèques de base de données.

HugSQL présente plusieurs avantages grâce à 2 caractéristiques fondamentales:

  • les requêtes sont écrites directement, une requête pour chaque fonction requise ;
  • les requêtes sont écrites en SQL.

HugSQL pros

HugSQL permet de séparer la syntaxe Clojure et la sémantique SQL (QUOI et COMMENT).

  1. Nous décrivons CE qu’il faut faire dans Clojure

( recevoir les e-mails de l’utilisateur par nom d’utilisateur ” Alexandr Petrov”) ;->

  1. Nous décrivons COMMENT procéder en SQL

— : nom get-user-emails-by-username 😕 : *

sélectionnez user_emails.e-mail de user_emails où user_emails.user_id =: id

Par conséquent, nous pouvons changer la logique d’obtention des données directement en SQL, sans réécrire le code Clojure. C’est utile lorsqu’un schéma de base de données est modifié et que l’ancienne requête ne renvoie pas la structure nécessaire.

De plus, SQL lui-même est un outil beaucoup plus puissant pour travailler avec un SGBD spécifique. Il permet d’écrire de grandes requêtes complexes avec des fonctions de “jointure”, d’agrégations et de fenêtres, ce qui peut être extrêmement difficile dans Clojure.

De plus, SQL permet d’utiliser les avantages d’un SGBD spécifique (par exemple, Postgres). C’est important si vous êtes sûr que la base de données ne sera pas modifiée.

HugSQL cons

  • Il est difficile de changer de SGBD au milieu du projet. Il sera nécessaire de vérifier beaucoup de demandes et de tester soigneusement le support syntaxique et la sortie spécifique.
  • Vous pouvez transmettre des paramètres aux requêtes SQL. Mais, dans certains cas, les parties des requêtes doivent dépendre de certaines conditions. Bien que les extraits HugSQL permettent de terminer cette tâche, le plus souvent, vous devez le faire en utilisant Clojure.

HoneySQL ne fournit pas une telle séparation du code SQL et du code Clojure. Vous verrez les requêtes sous forme de carte.

HoneySQL pros

  • Il est indépendant d’une implémentation spécifique du SGBD car il évite généralement les requêtes SQL directes. Au lieu d’eux, il utilise une DSL spécifique.
  • Il permet de maintenir votre propre DSL basé sur des fonctions / macros Clojure. Vous pouvez également créer un générateur de requêtes avec l’enregistrement des requêtes intermédiaires du côté Clojure. Par exemple, si vous devez définir un utilisateur par ID ou une autre logique complexe, vous pouvez enregistrer une partie de la structure HoneySQL. Cela montrera que nous avons besoin exactement de l’utilisateur, pas des marchandises ou d’autres données. Ce “fragment” peut être substitué dans les requêtes nécessaires. En conséquence, vous obtiendrez un code plus court.

HoneySQL cons

  • Il peut être difficile d’utiliser les avantages d’un SGBD spécifique, ainsi que d’écrire des requêtes complexes (par exemple, avec des fonctions de fenêtre)
  • Le programmeur Clojure doit séparer le code pour récupérer les données et le code pour traiter ces données. La séparation entraîne des travaux supplémentaires de refactorisation.

danielsz/system

Objectif: prise en charge de l’architecture modulaire

Code: https://github.com/danielsz/system

Technologie utile pour développer des applications hautement modulaires dans Clojure. Le cadre prend en charge une interaction efficace entre les modules et présente une bonne compatibilité avec d’autres parties de l’écosystème varié de Clojure.

Comment fonctionne danielsz/system?

La bibliothèque permet à un programmeur Web d’utiliser une approche basée sur les composants. Ainsi, vous pouvez créer une application à l’aide de modules / composants et des connexions entre eux. Chaque composant est un objet spécial. Il a son propre cycle de vie. Le programmeur décrit comment il démarre, ce dont il a besoin pour démarrer et comment il s’arrête.

Par exemple, notre application se compose d’un serveur web et d’une base de données. Cela n’a aucun sens de démarrer le serveur Web avant l’activation de la base de données. Nous décrivons le composant de base de données, décrivons le composant serveur et la dépendance du serveur à la base de données. Lors du lancement du projet, nous indiquons que nous devons démarrer le serveur Web. La bibliothèque tentera automatiquement d’activer la base de données. Ensuite, si possible, il démarrera le serveur et transférera le composant de base de données activé terminé au composant serveur Web. Ensuite, si nécessaire, le système sera arrêté.

Raisons d’utiliser danielsz/system

Contrairement à la description de l’application entière avec un ensemble de fonctions Clojure ordinaires, la description du projet en tant que composants facilite le remplacement d’un composant par un autre. Par exemple, lors du test d’une application, du remplacement d’une base de données par une autre ou de sa désactivation complète, en la remplaçant par les données actuelles.

Dans le cas des fonctions, vous changeriez les anciennes fonctions par de nouvelles. Ils auront le même nom, ce qui provoque souvent des bugs. danielsz / system est un ensemble de solutions prêtes à l’emploi (pour un serveur Web, une base de données, etc.), organisées sous la forme d’un ensemble de composants.

J’espère que vous comprenez maintenant mieux comment utiliser Clojure et quelles solutions technologiques doivent être implémentées dans votre projet. Mes autres articles comprendront les avantages de ce langage puissant et magnifique, ainsi que quelques conseils sur le développement d’applications Web, de services et d’API. Alors, abonnez-vous au blog FreshCode, si vous voulez en savoir plus sur le monde de la programmation Clojure.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.