Clojure programming: frameworks and other tools

bár ezek a libek célja a Clojure programozási feladatok egyszerűsítése, megzavarhatják a kezdőt. Néha nehéz megérteni, hogyan lehet mindegyiket összerakni, és optimális megoldást találni egy adott feladatra. Tehát most szeretném megmutatni a kedvenc eszközeimet a Clojure programozásához.

  • munka webkiszolgálóval és végpontokkal
  • interakció webkiszolgálóval és adatbázissal
  • útválasztás szerveren
  • GraphQL használata a Clojure programozásban
  • moduláris architektúra támogatása

kezdjük az utat a Clojure programozás világába!

Megjegyzés: Ha Java-ról és más hasonló nyelvekről indul, tudnia kell, hogy a Clojure-ban nincsenek hagyományos keretek. Minden a libs-en és azok gyűjteményein alapul. Ez rugalmasabbá és többcélúvá teszi a nyelvet.

a Clojure ökoszisztéma különböző összetettségű libeket tartalmaz. Néhány közülük csak egy sor kiegészítő funkció (például egy könyvtár az idővel való munkavégzéshez). Eközben a rendszer libs platformot biztosít a teljes keret létrehozásához. Az ilyen könyvtárak lehetővé teszik a programozó számára, hogy egy alkalmazást komponenskészletként mutasson be, leírja a köztük lévő kapcsolatokat stb. Maga a könyvtár biztosítja a függőségi grafikonok létrehozását. Például átalakíthatja az összetevőket érthetőbb dolgokká, például funkciókká.

cél: kényelmes munka webszerverrel és végpontokkal

Kód: https://github.com/ring-clojure/ring

a HTTP szerver absztrakció kulcsfontosságú eleme Clojure web stack. Lehetővé teszi az egyszerű munkát a webszerverrel és a végpontokkal, ami elengedhetetlen a sikeres alkalmazásfejlesztéshez. A WSGI (Python) és a rack (Ruby) analógiájára létrehozott Ring a HTTP információit egy tiszta, egységes API-ba foglalja. Ennek eredményeként a webfejlesztő komponensekből álló moduláris rendszereket építhet, és megoszthatja ezeket az összetevőket a különböző szerverek és alkalmazások között.

hogyan működik a gyűrű?

HTTP kéréseket kap és HTTP válaszokat ad vissza. Tehát a Ring nem egy úgynevezett webalkalmazás-keretrendszer.

a Ring

mint domináns webes könyvtár használatának okai a Clojure programozásban, a Ring jó választás kezdőknek. Először is, fő feladata, hogy kényelmes felületet biztosítson a webszerverek széles skálájához. Ebből a szempontból a technológia rendkívül hasznos és tökéletesen működik.

egy másik Ring funkció modulkészletet biztosít (‘köztes szoftver’). Tehát lehetővé teszi különböző előre megírt könyvtárak használatát, amelyek kompatibilisek egymással.

a legtöbb Clojure programozó a Ring-et választja a végpontok számára, mert képes használni a köztes programokat. Például ezek a modulok lehetővé teszik a szükséges paraméterek átalakítását egy URL-ről a Clojure kódtérképre. A webfejlesztő könnyen írhat új köztes szoftvert, és integrálhatja azt az ökoszisztémába. Például a cemerick/friend könyvtár használatával teljes mértékben kezelheti az engedélyezési folyamatot, különböző stratégiákat alkalmazhat (a bejelentkezéstől és a jelszótól kezdve, az oAuth-ig) stb. A ring middleware segít a folyamat kényelmes leírásában és elindításában. Bezárja az összes olyan végpontot, amely tilos az illetéktelen felhasználók számára.

a Ring használatával kapcsolatos tapasztalatok fontosak más Clojure technológiákkal való együttműködéshez. Ez az első dolog, amellyel mozoghat egy alkalmazás.

Http-kit

cél: szerver indítása

Kód: https://github.com/http-kit/http-kit

az eseményvezérelt, rendkívül hatékony HTTP szerver / kliens könyvtár magában foglalja a WebSocket-et, valamint az aszinkron támogatást.

hogyan működik a Http-kit?

ez egy könyvtár a megfelelő webszerver-interakció megszervezésére. Http-kit alkalmas erősen egyidejű aszinkron vagy szinkron alkalmazások. Ami a WebSocket-et és a HTTP long polling/streaming-et illeti, jobb, ha egy egységes API-t tartalmaz.

a Http-kit használatának okai

rugalmas megoldás

a Http-kit lehetőséget nyújt mind a szinkron, mind az aszinkron rendszerek használatára. Az első lehetőség egyszerű, míg a második gyorsabban működik. Tehát az Ön konkrét célja alapján választhat. Sőt, a könyvtárat gyűrűvel is használhatja. Szinte úgy működik, mint a móló adapter.

kényelmes használat

a könyvtár biztosítja a Websocketek támogatását, valamint a régóta tárolt HTTP kérések tökéletes kezelését. Így a valós idejű alkalmazás létrehozása könnyebbé válik. Mi több, ez egy nyílt forráskódú projekt. A könyvtár elérhető a Githubon az Apache License 2.0 verzió alatt.

kiváló eredmények

a HTTP-kit nagy teljesítményt mutat, és nagy terhelés ellenére gyorsan működik. Ugyanakkor minden kapcsolat csak néhány kB memóriát igényel. A nulláról írt kliens/szerver egyetlen ~90kB-os JAR-ként érhető el, 0 függőséggel és ~3k tiszta kódsorral.

sok szoftverfejlesztő a HTTP-kit-et a Clojure programozás alapvető eszközének tekinti.

Compojure és Bidi

cél: routing szerveren

Kód: https://github.com/juxt/bidi, https://github.com/weavejester/compojure

mind a Compojure, mind a Bidi technológiák a webes alkalmazások útválasztásához. Az első könyvtár meglehetősen népszerű a közösség körében, míg a második praktikus megoldásként ismert a ClojureScript-ben történő íráshoz.

hogyan működik a Compojure és a Bidi?

ezek a kis könyvtárak biztosítják az útválasztást egy webszerveren. Ennek eredményeként egy szoftverfejlesztő több különálló részből álló alkalmazásokat írhat.

mi a különbség közöttük?

a 2 Könyvtár ugyanazt a funkciót látja el. De, ellentétben Compojure, Bidi:

  • támogatja mind a clj, mind a cljs
  • izomorf és bővíthető

a fő különbség az, hogy a Bidi útvonalak adatstruktúrák. Itt nincsenek makrók. Tehát a könyvtár Kényelmes kétirányú megközelítést és egyéb előnyöket biztosít. Egyes webfejlesztők inkább a Bidi-t részesítik előnyben, mert egy adott kezelő minden útvonalát megmutatja. Sőt, lehetőség van arra, hogy olvassa el az útvonalakat egy konfigurációs fájlból, generálja és átalakítsa őket funkciók és introspect. A kezelt kérésektől függetlenül működnek. Tehát a fejlesztő olyan dolgokra is megfelelhet, amelyek nem feltétlenül kezelők (például kulcsszavak).

Lacinia

cél: a GraphQL megvalósítása a Clojure programozásban

Kód: https://github.com/walmartlabs/lacinia

ez a népszerű Clojure könyvtár hasznos azok számára, akik szeretnék végrehajtani GraphQL munka közben webes API-kat.

hogyan fejti ki hatását a Lacinia?

eredetileg a GraphQL JavaScript-ben íródott. A Lacinia hivatalos hivatkozás erre a megvalósításra. A kezdeti specifikációval analóg módon íródott. Ezt nevezhetjük backend-agnosztikus GraphQL lekérdezés végrehajtó motornak. Tehát a könyvtár kapcsolatot biztosít az adatok és a GraphQL kliens között.

a Lacinia használatának okai

a GraphQL használatával könnyen gazdagabb, bonyolultabb webes API-t kaphat. A Lacinia leegyszerűsíti az API fejlesztését, mivel támogatja az inline / named query fragmentumokat, a GraphQL séma introspekciót, az előfizetéseket, az interfészeket, a szakszervezeteket, az enumokat, a bemeneteket és az egyéni skalárokat.

EDN-alapú sémanyelven írva a könyvtár tökéletesen működik a GraphQL lekérdezésekkel. Az Antlr4-re épül. Lacinia segít gazdag hatékony aszinkron lekérdezés végrehajtását. Csatlakoztathatja bármilyen Clojure HTTP csővezetékhez, és használhatja a lacinia-talapzat társkönyvtárat a HTTP támogatáshoz.

HoneySQL és HugSQL

cél: sikeres adatbázis interakció

Kód: https://github.com/jkk/honeysql, https://github.com/layerware/hugsql

sok webprogramozó kényelmesebben érzi magát az SQL technológiákkal, például az Oracle, az MS SQL, a MySQL, a PostgreSQL, az SQLite stb. A HoneySQL és a HugSQL olyan lekérdezés-építők, amelyek stabil hozzáférést biztosítanak az SQL adatbázisokhoz a Clojure alkalmazásokban.

hogyan működik a HoneySQL és a HugSQL?

mindkét könyvtár biztosítja az SQL befogadását a Clojure programozásban. Tehát képes lesz SQL adatbázis-parancsokat írni még a Clojure webalkalmazásokban is.

mi a különbség közöttük?

a HugSQL használatával külön SQL fájlok írásával és az alkalmazásba helyezésével kezdődik. A lekérdezési konstruktort egy másik népszerű könyvtár, a YeSQL ihlette. Ez nem csak elemzi SQL fájlokat Clojure funkciókat, de az is alkalmas több felhasználási esetek, mint YeSQL. A HugSQL aktívan karbantartott. Protokoll alapú adapterekkel rendelkezik, amelyek több adatbázis-Libet támogatnak.

a HugSQL-nek számos előnye van a 2 alapvető jellemző miatt:

  • a lekérdezések közvetlenül íródnak, minden szükséges függvényhez egy lekérdezés;
  • a lekérdezések SQL-ben vannak írva.

HugSQL pros

a HugSQL elkülöníti a Clojure szintaxist és az SQL szemantikát (mit és hogyan).

  1. leírjuk, mit kell tenni a Clojure-ban

(felhasználó-e-mailek-felhasználónév szerint “Alexandr Petrov”) ;->

  1. leírjuk, hogyan kell ezt megtenni az SQL-ben

— :név get-user-e-mailek-by-felhasználónév 😕 : *

válassza a user_emails lehetőséget.e-mail a user_emails-től, ahol a user_emails.user_id =: id

ennek eredményeként megváltoztathatjuk az adatok közvetlen SQL-ben történő megszerzésének logikáját, a Clojure kód átírása nélkül. Ez akkor hasznos, ha egy adatbázisséma módosul, és a régi lekérdezés nem adja vissza a szükséges struktúrát.

sőt, maga az SQL sokkal hatékonyabb eszköz egy adott DBMS-sel való munkavégzéshez. Lehetővé teszi a nagy összetett lekérdezések írását “join”, aggregációk és Ablakfunkciók segítségével, ami rendkívül nehéz lehet a Clojure-ban.

ezenkívül az SQL lehetővé teszi egy adott DBMS (például Postgres) előnyeinek használatát. Fontos, ha biztos benne, hogy az adatbázis nem változik.

HugSQL cons

  • nehéz megváltoztatni a DBMS-t a projekt közepén. Szükség lesz, hogy ellenőrizze a sok kérést, és gondosan teszt szintaxis támogatás és konkrét kimenet.
  • paramétereket adhat át az SQL lekérdezéseknek. Bizonyos esetekben azonban a lekérdezések részeit bizonyos feltételektől kell függővé tenni. Bár a HugSQL kivonatok lehetővé teszik ennek a feladatnak a elvégzését, gyakrabban ezt a Clojure használatával kell megtennie.

a HoneySQL nem biztosítja az SQL és a Clojure kód ilyen szétválasztását. A lekérdezéseket térképként fogja látni.

HoneySQL pros

  • független a DBMS konkrét megvalósításától, mivel általában elkerüli a közvetlen SQL lekérdezéseket. Ehelyett speciális DSL-t használ.
  • lehetővé teszi a saját DSL fenntartását a Clojure funkciók/makrók alapján. Létrehozhat egy lekérdezés-készítőt is a köztes kérések mentésével a Clojure oldalon. Például, ha egy felhasználót azonosítóval vagy más összetett logikával kell meghatároznia, mentheti a HoneySQL struktúra egy részét. Megmutatja, hogy pontosan a felhasználóra van szükségünk, nem pedig az árukra vagy más adatokra. Ez a” töredék ” helyettesíthető a szükséges lekérdezésekkel. Ennek eredményeként rövidebb kódot kap.

HoneySQL cons

  • kihívást jelenthet egy adott DBMS előnyeinek felhasználása, valamint összetett lekérdezések írása (például Ablakfunkciókkal)
  • a Clojure programozónak külön kell választania az adatok lekérésére szolgáló kódot és az adatok feldolgozására szolgáló kódot. Az elválasztás további munkát eredményez a refaktorálás során.

danielsz / rendszer

cél: moduláris architektúra támogatása

Kód: https://github.com/danielsz/system

hasznos technológia rendkívül moduláris alkalmazások fejlesztéséhez Clojure-ban. A keretrendszer támogatja a modulok közötti hatékony interakciót, és jól kompatibilis a változatos Clojure ökoszisztéma más részeivel.

hogyan működik a danielsz / rendszer?

a könyvtár lehetővé teszi a webprogramozók számára, hogy komponens alapú megközelítést alkalmazzanak. Tehát létrehozhat egy alkalmazást a modulok/komponensek és a köztük lévő kapcsolatok felhasználásával. Minden komponens egy speciális objektum. Saját életciklusa van. A programozó leírja, hogyan kezdődik, mit kell kezdenie, és hogyan áll le.

alkalmazásunk például egy webszerverből és egy adatbázisból áll. Nincs értelme elindítani a webszervert az adatbázis aktiválása előtt. Leírjuk az adatbázis összetevőt, leírjuk a szerver összetevőt, valamint a szerver függőségét az adatbázistól. A projekt elindításakor jelezzük, hogy el kell indítanunk a webszervert. A könyvtár automatikusan megpróbálja aktiválni az adatbázist. Ezután, ha lehetséges, elindítja a kiszolgálót, és átadja a kész aktivált adatbázis-összetevőt a webszerver-összetevőnek. Ezután szükség esetén a rendszer leáll.

a danielsz/system használatának okai

ellentétben a teljes alkalmazás leírásával a szokásos Clojure funkciókkal, a projekt leírása összetevőként megkönnyíti az egyik összetevő cseréjét a másikra. Például egy alkalmazás tesztelésekor, az egyik adatbázis cseréjekor egy másikra, vagy teljesen kikapcsolva, az aktuális adatokkal helyettesítve.

függvények esetén a régi függvényeket újra cserélné. Ugyanaz a neve lesz, ami gyakran hibákat okoz. danielsz / system egy kész készlet megoldások (egy web szerver, adatbázis, és még sok más), szervezett, mint egy sor alkatrészek.

remélem, most már jobban megérted, hogyan kell használni a Clojure-t, és milyen technológiai megoldásokat kell végrehajtani a projektben. További cikkeim tartalmazzák ennek az erőteljes és gyönyörű nyelvnek az előnyeit, valamint néhány tippet a webes alkalmazások, szolgáltatások és API-k fejlesztéséhez. Tehát iratkozzon fel a FreshCode blogra, ha többet szeretne megtudni a Clojure programozási világról.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.