programare Clojure: cadre și alte instrumente
deși toate aceste lib-uri vizează simplificarea sarcinilor de programare Clojure, acestea pot confunda un începător. Uneori, este dificil să înțelegeți cum să le puneți pe toate împreună și să găsiți o soluție optimă pentru o anumită sarcină. Deci, acum vreau să vă arăt instrumentele mele preferate pentru programare în Clojure.
- lucrul cu serverul web și punctele finale
- interacțiunea cu serverul web și baza de date
- rutare pe server
- utilizarea GraphQL în Clojure programare
- suport de arhitectura modulara
să începem călătoria în lumea de programare Clojure!
Notă: Când treceți de la Java și alte limbi similare, trebuie să știți că nu există cadre tradiționale în Clojure. Totul se bazează pe libs și colecțiile lor. Acest lucru face ca limba să fie mai flexibilă și mai multifuncțională.
ecosistemul Clojure include lib-uri de complexitate diferită. Unele dintre ele sunt doar un set de funcții suplimentare (de exemplu, o bibliotecă pentru lucrul cu timpul). Între timp, lib-urile de sistem oferă o platformă pentru crearea întregului cadru. Astfel de biblioteci permit programatorului să prezinte o aplicație ca un set de componente, să descrie conexiunile dintre ele și așa mai departe. Biblioteca în sine asigură crearea de grafice de dependență. De exemplu, poate converti componentele în lucruri mai ușor de înțeles, cum ar fi funcțiile.
scop: lucru convenabil cu serverul web și punctele finale
Cod: https://github.com/ring-clojure/ring
abstractizarea serverului HTTP este un element cheie al stivei Web Clojure. Permite lucrul simplu cu serverul web și punctele finale, ceea ce este esențial pentru dezvoltarea cu succes a aplicațiilor. Creat în analogie cu WSGI (Python) și Rack (Ruby), Ring abstractizează informațiile HTTP într-un API clar și unificat. Ca rezultat, dezvoltatorul web poate construi sisteme modulare a constat din componente și partaja aceste componente între diferite servere și aplicații.
- cum funcționează inelul?
- motive pentru utilizarea Ring
- Http-kit
- cum funcționează Http-kit?
- motive pentru utilizarea Http-kit
- Compojure și Bidi
- cum funcționează Compojure și Bidi?
- care este diferența dintre ele?
- Lacinia
- cum acționează Lacinia?
- motive pentru utilizarea Lacinia
- HoneySQL și HugSQL
- cum funcționează HoneySQL și HugSQL?
- care este diferența dintre ele?
- HugSQL Pro
- HugSQL cons
- HoneySQL Pro
- HoneySQL cons
- danielsz / sistem
- cum funcționează danielsz/system?
- motive pentru utilizarea danielsz/system
cum funcționează inelul?
primește cereri HTTP și returnează răspunsuri HTTP. Deci, Ring nu este un așa-numit cadru de aplicații web.
motive pentru utilizarea Ring
ca bibliotecă web dominantă în programarea Clojure, Ring este o alegere plăcută pentru începători. În primul rând, funcția sa principală este de a oferi o interfață convenabilă pentru o gamă largă de servere web. Din acest punct de vedere, tehnologia este extrem de utilă și funcționează perfect.
o altă caracteristică Ring este furnizarea unui set de module (‘middleware’). Deci, vă permite să utilizați diferite biblioteci pre-scrise, compatibile între ele.
majoritatea programatorilor Clojure aleg Ring pentru endpoints datorită capacității sale de a utiliza middlewares. De exemplu, aceste module permit transformarea parametrilor necesari dintr-o adresă URL în harta codului Clojure. Un dezvoltator web poate scrie cu ușurință middleware nou și îl poate integra în ecosistem. De exemplu, folosind biblioteca cemerick/friend, puteți gestiona complet procesul de autorizare, puteți aplica diferite strategii (începând de la login și parolă, terminând cu oAuth) etc. Ring middleware ajută la descrierea și începerea convenabilă a procesului. Închide toate punctele finale interzise utilizatorilor neautorizați.
Experiența în utilizarea inelului este importantă pentru lucrul cu alte tehnologii Clojure. Acesta este primul lucru pe care îl puteți utiliza pentru a obține o aplicație în mișcare.
Http-kit
scop: server de pornire
Cod: https://github.com/http-kit/http-kit
biblioteca HTTP server/client bazată pe evenimente, extrem de eficientă, include WebSocket, precum și suport asincron.
cum funcționează Http-kit?
este o bibliotecă pentru organizarea unei interacțiuni adecvate cu serverul web. Http-kit este potrivit pentru aplicații asincrone sau sincrone foarte concurente. În ceea ce privește WebSocket și HTTP long polling/streaming, este mai bine să prezentați un API unificat.
motive pentru utilizarea Http-kit
soluție flexibilă
Http-kit oferă o oportunitate de a lucra atât cu sisteme de sincronizare și asincron. Prima opțiune este simplă, în timp ce a doua funcționează mai repede. Deci, puteți face o alegere pe baza scopului dvs. specific. Mai mult, puteți utiliza biblioteca cu inel. Funcționează aproape ca adaptorul de debarcader.
utilizare convenabilă
biblioteca asigură suport pentru WebSockets, precum și manipularea perfectă a cererilor HTTP de lungă durată. Deci, crearea unei aplicații în timp real devine mai ușoară. Mai mult, este un proiect open source. Biblioteca este disponibilă pe GitHub sub Licența Apache versiunea 2.0.
rezultate excelente
HTTP-kit prezinta de înaltă performanță și funcționează rapid, în ciuda sarcini mari. În același timp, fiecare conexiune necesită doar câteva kB de memorie. Un client / server care este scris de la zero este disponibil ca un singur borcan ~90kb cu 0 dependențe și ~3K linii de cod clar.
mulți dezvoltatori de software consideră HTTP-kit ca un instrument de bază pentru programarea Clojure.
Compojure și Bidi
scop: rutare pe server
Cod: https://github.com/juxt/bidi, https://github.com/weavejester/compojure
atât Compojure, cât și Bidi sunt tehnologii pentru rutare în aplicațiile web. Prima bibliotecă este destul de populară în rândul comunității, în timp ce a doua este cunoscută ca o soluție la îndemână pentru scrierea în ClojureScript.
cum funcționează Compojure și Bidi?
aceste biblioteci mici asigură rutarea pe un server web. Ca rezultat, un dezvoltator de software poate scrie aplicații care sunt compuse din mai multe părți separate.
care este diferența dintre ele?
cele 2 biblioteci îndeplinesc aceeași funcție. Dar, spre deosebire de Compojure, Bidi:
- suportă atât clj și cljs
- este izomorfă și extensibil
principala diferență este că în rutele Bidi sunt structuri de date. Nu există macrocomenzi aici. Deci, Biblioteca oferă o abordare bidirecțională convenabilă și alte avantaje. Unii dezvoltatori web preferă Bidi, deoarece arată fiecare traseu al unui anumit handler. Mai mult, există posibilitatea de a citi rutele dintr-un fișier de configurare, de a le genera și transforma prin funcții și introspecție. Ei lucrează independent de cererile tratate. Deci, dezvoltatorul se poate potrivi cu lucruri care nu sunt neapărat manipulatoare (de exemplu, cuvinte cheie).
Lacinia
scop: implementarea GraphQL în programarea Clojure
Cod: https://github.com/walmartlabs/lacinia
această bibliotecă populară Clojure este utilă pentru cei care doresc să implementeze GraphQL în timp ce lucrează cu API-uri web.
cum acționează Lacinia?
inițial, GraphQL este scris în JavaScript. Lacinia este o referință oficială la această implementare. Este scris în analogie cu specificația inițială. Acesta poate fi numit un backend-agnostic GraphQL motor de execuție interogare. Deci, Biblioteca oferă contact între datele dvs. și clientul GraphQL.
motive pentru utilizarea Lacinia
folosind GraphQL, puteți obține cu ușurință un API Web mai bogat și mai complicat. Lacinia simplifică dezvoltarea API, deoarece acceptă fragmente de interogare inline/numite, introspecție schemă GraphQL, abonamente, interfețe, uniuni, enums, intrări și scalare personalizate.
scris într-un limbaj de schemă bazat pe EDN, biblioteca funcționează perfect cu interogări GraphQL. Este construit pe Antlr4. Lacinia ajută la bogat execuție eficientă interogare asincron. Puteți să-l conectați la orice conductă HTTP Clojure și de a folosi biblioteca companion lacinia-piedestal pentru suport HTTP.
HoneySQL și HugSQL
scop: interacțiunea cu succes a bazei de date
Cod: https://github.com/jkk/honeysql, https://github.com/layerware/hugsql
mulți programatori web se simt mai confortabil să lucreze cu tehnologii SQL, cum ar fi Oracle, MS SQL, MySQL, PostgreSQL, SQLite etc. HoneySQL și HugSQL sunt constructori de interogări care oferă acces stabil la bazele de date SQL în aplicațiile Clojure.
cum funcționează HoneySQL și HugSQL?
ambele biblioteci asigură îmbrățișarea SQL în programarea Clojure. Deci, veți putea scrie comenzi de baze de date SQL chiar și în aplicațiile Web Clojure.
care este diferența dintre ele?
folosind HugSQL, începeți să scrieți fișiere SQL separate și să le puneți în aplicația dvs. Constructorul de interogări este inspirat de o altă bibliotecă populară, YeSQL. Nu numai că analizează fișierele SQL în funcțiile Clojure, dar este potrivit și pentru mai multe cazuri de utilizare decât YeSQL. HugSQL este menținut în mod activ. Are adaptoare bazate pe protocol care acceptă mai multe lib-uri de baze de date.
HugSQL are mai multe avantaje datorită 2 caracteristici fundamentale:
- interogările sunt scrise direct, o interogare pentru fiecare funcție necesară;
- interogările sunt scrise în SQL.
HugSQL Pro
HugSQL oferă separarea sintaxei Clojure și semantica SQL (CE și cum).
- descriem ce să facem în Clojure
(get-user-emails-by-username “Alexandru Petrov”) ;->
- descriem cum se face acest lucru în SQL
— :nume get-user-emails-by-username 😕 : *
selectați user_emails.e-mail de la user_emails unde user_emails.user_id=: id
ca rezultat, putem schimba logica obținerii datelor direct în SQL, fără a rescrie codul Clojure. Este util atunci când o schemă de bază de date este modificată, iar interogarea veche nu returnează structura necesară.
mai mult, SQL în sine este un instrument mult mai puternic pentru lucrul cu un anumit DBMS. Permite scrierea unor interogări complexe mari cu” Alăturați-vă”, agregări și funcții de ferestre, care pot fi extrem de dificile în Clojure.
mai mult, SQL permite utilizarea beneficiilor unui anumit SGBD (de exemplu, Postgres). Este important dacă sunteți sigur că baza de date nu va fi modificată.
HugSQL cons
- este dificil de a schimba SGBD în mijlocul proiectului. Va fi necesar să verificați o mulțime de solicitări și să testați cu atenție suportul sintaxei și ieșirea specifică.
- puteți trece parametrii la interogări SQL. Dar, în unele cazuri, părțile interogărilor trebuie să depindă de anumite condiții. Deși fragmentele HugSQL permit finalizarea acestei sarcini, mai des trebuie să faceți acest lucru folosind Clojure.
HoneySQL nu oferă o astfel de separare a codului SQL și Clojure. Veți vedea interogările ca o hartă.
HoneySQL Pro
- este independent de o implementare specifică a SGBD, deoarece evită, de obicei, interogări SQL directe. În locul lor, folosește DSL specific.
- acesta permite menținerea propriul DSL bazat pe funcții Clojure/macro-uri. De asemenea, puteți crea un constructor de interogări cu salvarea cererilor intermediare pe partea Clojure. De exemplu, dacă trebuie să definiți un utilizator după ID sau altă logică complexă, puteți salva o parte din structura HoneySQL. Acesta va arăta că avem nevoie exact de utilizator, nu de bunuri sau de alte date. Acest “fragment” poate fi înlocuit în interogările necesare. Ca rezultat, veți obține un cod mai scurt.
HoneySQL cons
- poate fi dificil să folosiți beneficiile unui anumit SGBD, precum și să scrieți interogări complexe (de exemplu, cu funcții de fereastră)
- programatorul Clojure trebuie să separe codul pentru preluarea datelor și Codul pentru prelucrarea acestor date. Separarea duce la lucrări suplimentare de refactorizare.
danielsz / sistem
scop: suport pentru arhitectura modulară
Cod: https://github.com/danielsz/system
tehnologie utilă pentru dezvoltarea aplicațiilor extrem de modulare în Clojure. Cadrul sprijină interacțiunea eficientă între module și are o bună compatibilitate cu alte părți ale ecosistemului Clojure variat.
cum funcționează danielsz/system?
Biblioteca Permite unui programator web să utilizeze o abordare bazată pe componente. Deci, puteți construi o aplicație folosind module/componente și conexiunile dintre ele. Fiecare componentă este un obiect special. Are propriul ciclu de viață. Programatorul descrie cum începe, ce trebuie să înceapă și cum se oprește.
de exemplu, aplicația noastră constă dintr-un server web și o bază de date. Nu are sens să porniți serverul web înainte ca baza de date să fie activată. Descriem componenta bazei de date, descriem componenta serverului și dependența serverului de baza de date. La lansarea proiectului, indicăm că trebuie să pornim serverul web. Biblioteca va încerca automat să activeze baza de date. Apoi, dacă este posibil, va porni serverul și va transfera componenta de bază de date activată finalizată pe componenta serverului web. Apoi, dacă este necesar, sistemul va fi oprit.
motive pentru utilizarea danielsz/system
spre deosebire de descrierea întregii aplicații cu un set de funcții Clojure obișnuite, descrierea proiectului ca componente facilitează înlocuirea unei componente cu alta. De exemplu, atunci când testați o aplicație, înlocuiți o bază de date cu alta sau opriți-o complet, înlocuind-o cu datele curente.
în cazul funcțiilor, ați schimba funcțiile vechi cu altele noi. Ei vor avea același nume, care cauzează adesea bug-uri. danielsz / system este un set de soluții gata făcute (pentru un server web, o bază de date și multe altele), organizate ca un set de componente.
sper, acum înțelegeți mai bine cum să utilizați Clojure și ce soluții tehnologice ar trebui implementate în proiectul dvs. Articolele mele suplimentare vor include beneficiile acestui limbaj puternic și frumos, precum și câteva sfaturi despre dezvoltarea de aplicații web, servicii și API-uri. Deci, abonați-vă la freshcode blog, dacă doriți să aflați mai multe despre Clojure programming world.