Clojure programmering: rammer og andre værktøjer
selvom alle disse libs sigter mod at forenkle Clojure programmeringsopgaver, kan de forvirre en nybegynder. Nogle gange er det svært at forstå, hvordan man sætter dem alle sammen og finder en optimal løsning til en bestemt opgave. Så nu vil jeg vise dig mine yndlingsværktøjer til programmering i Clojure.
- arbejde med internetserver og slutpunkter
- interaktion med internetserver og database
- routing på server
- brug af Clojure programmering
- understøttelse af modulær arkitektur
lad os starte turen til Clojure programmeringsverdenen!
Bemærk: Når du flytter fra Java og andre lignende sprog, skal du vide, at der ikke er nogen traditionelle rammer i Clojure. Alt er baseret på libs og deres samlinger. Dette gør sproget mere fleksibelt og multifunktionelt.
Clojure økosystem omfatter libs af forskellig kompleksitet. Nogle af dem er kun et sæt ekstra funktioner (for eksempel et bibliotek til at arbejde med tiden). I mellemtiden giver System libs en platform til at skabe hele rammen. Sådanne biblioteker tillader programmereren at præsentere en applikation som et sæt komponenter, beskrive forbindelserne mellem dem og så videre. Biblioteket selv sikrer oprettelsen af afhængighedsgrafer. For eksempel kan det konvertere komponenter til mere forståelige ting, som funktioner.
formål: praktisk arbejde med internetserver og slutpunkter
kode: https://github.com/ring-clojure/ring
HTTP-serverabstraktionen er et centralt element i Clojure-stakken. Det muliggør simpelt arbejde med internetserver og slutpunkter, hvilket er afgørende for en vellykket appudvikling. Ring abstraherer oplysningerne om HTTP i en klar, samlet API. Som følge heraf kan netudvikleren bygge modulære systemer bestod af komponenter og dele disse komponenter mellem forskellige servere og applikationer.
- Hvordan fungerer Ring?
- årsager til at bruge Ring
- Http-kit
- Hvordan fungerer Http-kit?
- årsager til brug af Http-kit
- Compojure og Bidi
- hvordan virker Compojure og Bidi?
- Hvad er forskellen mellem dem?
- Lacinia
- Hvordan virker Lacinia?
- grunde til at bruge Lacinia
- kaprifolium og kram
- hvordan virker det?
- Hvad er forskellen mellem dem?
- Hugskl proffer
- Hugshl cons
- Pros
- Cons
- Daniels/system
- hvordan fungerer systemet?
- årsager til brug af Daniels/system
Hvordan fungerer Ring?
det får HTTP-anmodninger og returnerer HTTP-svar. Så Ring er ikke en såkaldt internet applikationsramme.
årsager til at bruge Ring
som et dominerende internetbibliotek i Clojure-programmering er Ring et godt valg for begyndere. Først og fremmest er hovedfunktionen at give en bekvem grænseflade til en bred vifte af servere. Fra dette synspunkt er teknologien yderst nyttig og fungerer perfekt.
en anden Ringfunktion er at levere et sæt moduler (‘mellemvare’). Så det giver dig mulighed for at bruge forskellige forudskrevne biblioteker, kompatible med hinanden.
de fleste Clojure-programmører vælger Ring til slutpunkter på grund af dets evne til at bruge mellemvarer. For eksempel tillader disse moduler at omdanne nødvendige parametre fra en URL til Clojure-kodekortet. En internetudvikler kan nemt skrive nyt mellemvare og integrere det i økosystemet. Ved hjælp af cemerick/friend-biblioteket kan du for eksempel styre godkendelsesprocessen fuldt ud, anvende forskellige strategier (startende fra login og adgangskode, slutter med oAuth) osv. Ring mellemvare hjælper med nemt at beskrive og starte processen. Det lukker alle slutpunkter, der er forbudt for uautoriserede brugere.
erfaring med at bruge Ring er vigtig for at arbejde med andre Clojure-teknologier. Det er den første ting, du kan bruge til at få en app i bevægelse.
Http-kit
formål: serverstart
kode: https://github.com/http-kit/http-kit
det begivenhedsdrevne, meget effektive HTTP-server / klientbibliotek inkluderer Netbocket samt asynkron support.
Hvordan fungerer Http-kit?
det er et bibliotek til at organisere en ordentlig serverinteraktion. Http-kit er velegnet til meget samtidige asynkrone eller synkrone applikationer. Hvad angår Netbocket og HTTP long polling / streaming, er det bedre at have en samlet API.
årsager til brug af Http-kit
fleksibel løsning
Http-kit giver mulighed for at arbejde både med sync og async systemer. Den første mulighed er enkel, mens den anden fungerer hurtigere. Så du kan træffe et valg baseret på dit specifikke formål. Desuden kan du bruge biblioteket med Ring. Det fungerer næsten som anløbsbro adapter.
praktisk brug
biblioteket sikrer understøttelse af Netbockets samt perfekt håndtering af langvarige HTTP-anmodninger. Så det bliver lettere at oprette en app i realtid. Hvad mere er, det er et open source-projekt. Biblioteket er tilgængeligt på GitHub under Apache-Licensversionen 2.0.
fremragende resultater
HTTP-kit viser høj ydeevne og arbejder hurtigt på trods af store belastninger. Samtidig kræver hver forbindelse kun et par kB hukommelse. En klient / server, der er skrevet fra bunden, er tilgængelig som en enkelt ~90 KB krukke med 0 afhængigheder og ~3K linjer med klar kode.
mange udviklere anser HTTP-kit som et grundlæggende værktøj til Clojure programmering.
Compojure og Bidi
formål: routing på server
kode: https://github.com/juxt/bidi, https://github.com/weavejester/compojure
både Compojure og Bidi er teknologier til routing i Internet-apps. Det første bibliotek er ret populært blandt samfundet, mens det andet er kendt som en praktisk løsning til skrivning i ClojureScript.
hvordan virker Compojure og Bidi?
disse små biblioteker sikrer routing på en internetserver. Som følge heraf kan en programudvikler skrive applikationer, der består af flere separate dele.
Hvad er forskellen mellem dem?
de 2 biblioteker udfører den samme funktion. Men i modsætning til Compojure, Bidi:
- understøtter både clj og cljs
- er isomorf og udvidelig
den største forskel er, at I Bidi-ruter er datastrukturer. Der er ingen makroer her. Så biblioteket giver en bekvem tovejs tilgang og andre fordele. Nogle internetudviklere foretrækker Bidi, fordi det viser hver rute for en bestemt handler. Derudover er der en mulighed for at læse ruterne fra en konfigurationsfil, generere og transformere dem efter funktioner og introspekt. De arbejder uafhængigt af håndterede anmodninger. Så udvikleren kan matche på ting, der ikke nødvendigvis håndterer (for eksempel nøgleord).
Lacinia
formål: implementering af Clojure programmering
kode: https://github.com/walmartlabs/lacinia
dette populære Clojure-bibliotek er nyttigt for dem, der ønsker at implementere
Hvordan virker Lacinia?
oprindeligt er Graphkl skrevet i JavaScript. Lacinia er en officiel henvisning til denne implementering. Det er skrevet i analogi med den oprindelige specifikation. Det kan kaldes en backend-agnostisk Grafisk forespørgselsudførelsesmotor. Så biblioteket giver kontakt mellem dine data og klienten.
grunde til at bruge Lacinia
ved hjælp af Lacinia kan du nemt få en rigere og mere kompliceret API. Lacinia forenkler API-udvikling, fordi den understøtter inline/navngivne forespørgselsfragmenter, Grafskema introspektion, abonnementer, grænseflader, fagforeninger, enums, input og brugerdefinerede skalarer.
skrevet på et EDN-baseret skemasprog, fungerer biblioteket perfekt med Graphkl-forespørgsler. Det er bygget på Antlr4. Lacinia hjælper til rig effektiv asynkron forespørgsel udførelse. Du kan tilslutte den til enhver Clojure HTTP pipeline og bruge companion library lacinia-piedestal til HTTP support.
kaprifolium og kram
formål: vellykket databaseinteraktion
kode: https://github.com/jkk/honeysql, https://github.com/layerware/hugsql
mange internetprogrammerere føler sig mere komfortable med at arbejde med
hvordan virker det?
begge biblioteker sikrer, at de omfatter Clojure programmering. Så du vil være i stand til at skrive DATABASEKOMMANDOER selv i Clojure-apps.
Hvad er forskellen mellem dem?
ved at bruge
Hugsk har flere fordele på grund af 2 grundlæggende funktioner:
- forespørgslerne skrives direkte, en forespørgsel for hver krævet funktion;
- forespørgslerne er skrevet i KVM.
Hugskl proffer
Hugskl giver adskillelse af Clojure syntaks og semantik (hvad og hvordan).
- vi beskriver hvad man skal gøre i Clojure
(få-bruger-e-mails-ved-brugernavn “Aleksandr Petrov”) ;->
- vi beskriver, hvordan du gør dette i KKL
— :navn get-bruger-e-mails-ved-brugernavn:? : *
vælg user_emails.e-mail fra user_emails hvor user_emails.user_id =: id
som følge heraf kan vi ændre logikken for at få dataene direkte i KVM uden at omskrive Clojure-kode. Det er nyttigt, når et databaseskema ændres, og den gamle forespørgsel returnerer ikke den nødvendige struktur.
desuden er KVL i sig selv et meget mere kraftfuldt værktøj til at arbejde med en bestemt DBMS. Det giver mulighed for at skrive store komplekse forespørgsler med” join”, aggregeringer og vinduesfunktioner, hvilket kan være ekstremt vanskeligt i Clojure.
desuden tillader KVL at bruge fordele ved en bestemt DBMS (for eksempel Postgres). Det er vigtigt, hvis du er sikker på, at databasen ikke ændres.
Hugshl cons
- det er svært at ændre DBMS midt i projektet. Det vil være nødvendigt at kontrollere mange anmodninger og omhyggeligt teste syntaks support og specifik output.
- du kan overføre parametre til forespørgsler. Men i nogle tilfælde skal dele af forespørgslerne være afhængige af visse betingelser. Selvom kodestykker tillader at udføre denne opgave, skal du oftere gøre dette ved hjælp af Clojure.
vi giver ikke en sådan adskillelse af os og Clojure kode. Du vil se forespørgslerne som et kort.
Pros
- det er uafhængigt af en specifik implementering af DBMS, fordi det normalt undgår direkte forespørgsler. I stedet for dem bruger den specifik DSL.
- det gør det muligt at opretholde din egen DSL baseret på Clojure Funktioner/Makroer. Du kan også oprette en forespørgselsbygger med at gemme mellemliggende anmodninger på Clojure-siden. Hvis du f.eks. har brug for at definere en bruger efter ID eller anden kompleks logik, kan du gemme en del af strukturen. Det viser, at vi har brug for nøjagtigt brugeren, ikke varerne eller andre data. Dette” fragment ” kan erstattes af de nødvendige forespørgsler. Som følge heraf får du en kortere kode.
Cons
- det kan være udfordrende at bruge fordelene ved en bestemt DBMS samt at skrive komplekse forespørgsler (for eksempel med vinduesfunktioner)
- Clojure-programmøren skal adskille koden til hentning af data og koden til behandling af disse data. Adskillelsen fører til yderligere arbejde med refactoring.
Daniels/system
formål: understøttelse af modulær arkitektur
kode: https://github.com/danielsz/system
nyttig teknologi til udvikling af meget modulære applikationer i Clojure. Rammen understøtter effektiv interaktion mellem moduler og har god kompatibilitet med andre dele af det varierede Clojure-økosystem.
hvordan fungerer systemet?
biblioteket tillader en internetprogrammør at bruge en komponentbaseret tilgang. Så du kan opbygge en applikation ved hjælp af moduler/komponenter og forbindelserne mellem dem. Hver komponent er et specielt objekt. Det har sin egen livscyklus. Programmøren beskriver, hvordan den starter, hvad den skal starte, og hvordan den stopper.
for eksempel består vores applikation af en internetserver og en database. Det giver ingen mening at starte internetserveren, før databasen er aktiveret. Vi beskriver databasekomponenten, beskriver serverkomponenten og serverens afhængighed af databasen. Når vi starter projektet, angiver vi, at vi skal starte internetserveren. Biblioteket forsøger automatisk at aktivere databasen. Derefter starter den, hvis det er muligt, serveren og overfører den færdige aktiverede databasekomponent til internetserverkomponenten. Derefter stoppes systemet om nødvendigt.
årsager til brug af Daniels/system
i modsætning til beskrivelsen af hele applikationen med et sæt almindelige Clojure-funktioner gør projektbeskrivelsen som komponenter det nemt at udskifte en komponent med en anden. For eksempel, når du tester et program, erstatter en database med en anden eller slukker den helt, erstatter den med de aktuelle data.
i tilfælde af funktioner ændrer du gamle funktioner med nye. De vil have samme navn, hvilket ofte forårsager fejl. system er et færdigt sæt af løsninger (til en internetserver, database og meget mere), organiseret som et sæt komponenter.
jeg håber, nu forstår du bedre, hvordan du bruger Clojure, og hvilke tekniske løsninger der skal implementeres i dit projekt. Mine yderligere artikler vil omfatte fordelene ved dette kraftfulde og smukke sprog, samt nogle tip til udvikling af internetapplikationer, tjenester, og API ‘ er. Så, abonnere på FreshCode blog, hvis du ønsker at lære mere om Clojure programmering verden.