Clojure programming: frameworks and other tools

vaikka kaikki nämä libit pyrkivät yksinkertaistamaan Clojure-ohjelmointitehtäviä, ne saattavat hämmentää aloittelijaa. Joskus on vaikea ymmärtää, miten yhdistää ne kaikki ja löytää optimaalinen ratkaisu tiettyyn tehtävään. Nyt haluan näyttää suosikkityökaluni ohjelmointiin Clojuressa.

  • työskentely web-palvelimen ja päätepisteiden kanssa
  • vuorovaikutus web-palvelimen ja tietokannan kanssa
  • reititys palvelimella
  • GraphQL: n käyttäminen Clojure-ohjelmoinnissa
  • modulaarisen arkkitehtuurin tukeminen

aloitetaan matka Clojure-ohjelmointimaailmaan!

Huom: Javasta ja muista vastaavista kielistä siirryttäessä on hyvä tietää, ettei clojuressa ole mitään perinteisiä kehyksiä. Kaikki perustuu libsiin ja heidän kokoelmiinsa. Tämä tekee kielestä joustavamman ja monikäyttöisemmän.

Clojuren ekosysteemiin kuuluu eri kompleksisia libsejä. Osa niistä on vain joukko lisätoimintoja (esimerkiksi ajan kanssa työskentelyyn tarkoitettu kirjasto). Samaan aikaan järjestelmän libs tarjoavat alustan luoda koko kehyksen. Tällaisten kirjastojen avulla ohjelmoija voi esittää sovelluksen komponenttijoukkona, kuvata niiden välisiä yhteyksiä ja niin edelleen. Kirjasto itse varmistaa riippuvuusdiagrammien luomisen. Se voi esimerkiksi muuntaa komponentteja ymmärrettävämmiksi asioiksi, kuten funktioiksi.

kohde: kätevä työskentely WWW-palvelimen ja päätepisteiden kanssa

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

HTTP-palvelimen abstraktio on Clojure web Stackin keskeinen elementti. Se mahdollistaa yksinkertaisen työskentelyn web-palvelimen ja päätepisteiden kanssa, mikä on välttämätöntä onnistuneen sovelluskehityksen kannalta. Luotu analogisesti WSGI: n (Python) ja Rackin (Ruby) kanssa, Ring abstrahoi HTTP: n tiedot selkeäksi, yhtenäiseksi API: ksi. Tämän seurauksena web-kehittäjä voi rakentaa modulaarisia järjestelmiä, jotka koostuvat komponenteista ja jakaa nämä komponentit eri palvelimien ja sovellusten kesken.

miten rengas toimii?

se saa HTTP-pyyntöjä ja palauttaa HTTP-vastauksia. Ring ei siis ole niin sanottu web-sovelluskehys.

syitä käyttää Ring

hallitsevana web-kirjastona Clojure-ohjelmoinnissa Ring on mukava valinta aloittelijoille. Ensinnäkin sen päätehtävä on tarjota kätevä käyttöliittymä monenlaisia web-palvelimia. Tästä näkökulmasta tekniikka on erittäin hyödyllinen ja toimii täydellisesti.

toinen Rengasominaisuus on moduulien (“middleware”) tarjoaminen. Niin, sen avulla voit käyttää erilaisia valmiiksi kirjoitettuja kirjastoja, yhteensopivia keskenään.

suurin osa Clojuren ohjelmoijista valitsee Ringin päätepisteille, koska se osaa käyttää välisarjoja. Nämä moduulit mahdollistavat esimerkiksi tarvittavien parametrien muuntamisen URL-osoitteesta Clojure-koodikartalle. Web-kehittäjä voi helposti kirjoittaa uusia väliohjelmistoja ja integroida ne ekosysteemiin. Esimerkiksi käyttämällä cemerick / friend-kirjastoa voit hallita valtuutusprosessia täysin, soveltaa erilaisia strategioita (alkaen kirjautumisesta ja salasanasta, päättyen oauthiin) jne. Ring middleware auttaa sopivasti kuvaamaan ja aloittaa prosessin. Se sulkee kaikki päätelaitteet, jotka ovat kiellettyjä luvattomilta käyttäjiltä.

kokemus Ringin käytöstä on tärkeää muiden Clojure-teknologioiden kanssa työskentelyssä. Se on ensimmäinen asia, jonka avulla voit saada sovelluksen liikkeelle.

Http-pakki

Purpose: server start up

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

tapahtumapohjainen, erittäin tehokas HTTP-palvelin / asiakaskirjasto sisältää Websocketin sekä asynkronisen tuen.

miten Http-pakki vaikuttaa?

se on kirjasto kunnollisen web-palvelimen vuorovaikutuksen järjestämiseen. Http-kit sopii erittäin samanaikaisiin asynkronisiin tai synkronisiin sovelluksiin. Mitä WebSocket ja HTTP pitkä polling/streaming, se on parempi ominaisuus yhtenäinen API.

syitä Http-kit

joustava ratkaisu

Http-kit tarjoaa mahdollisuuden työskennellä sekä synkronointi-että async-järjestelmien kanssa. Ensimmäinen vaihtoehto on yksinkertainen, kun taas toinen toimii nopeammin. Niin, voit tehdä valinnan perustuu tiettyyn tarkoitukseen. Lisäksi voit käyttää kirjastoa Ringin kanssa. Se toimii melkein kuin Laiturisovitin.

kätevä käyttö

kirjasto varmistaa tuen Websocketeille sekä pitkään säilytettyjen HTTP-pyyntöjen täydellisen käsittelyn. Niin, luoda reaaliaikainen sovellus helpottuu. Lisäksi se on avoimen lähdekoodin projekti. Kirjasto on saatavilla GitHubissa Apache-lisenssiversiolla 2.0.

erinomaiset tulokset

HTTP-pakki osoittaa korkeaa suorituskykyä ja toimii nopeasti suurista kuormista huolimatta. Samalla jokainen yhteys vaatii vain muutaman kB muistia. Asiakas / palvelin, joka on kirjoitettu tyhjästä on saatavana yhtenä ~90kB purkki 0 riippuvuuksia ja ~3k riviä selkeää koodia.

monet ohjelmistokehittäjät pitävät HTTP-pakkia Clojure-ohjelmoinnin perustyökaluna.

Compojure and Bidi

Purpose: reititys palvelimella

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

sekä Compojure että Bidi ovat reititystekniikoita verkkosovelluksissa. Ensimmäinen kirjasto on varsin suosittu yhteisön keskuudessa, kun taas toinen tunnetaan kätevänä ratkaisuna Clojurescriptillä kirjoittamiseen.

miten Compojure ja Bidi vaikuttavat?

nämä pienet kirjastot varmistavat reitityksen www-palvelimella. Tämän seurauksena ohjelmistokehittäjä voi kirjoittaa sovelluksia, jotka koostuvat useista erillisistä osista.

Mitä eroa niillä on?

2 kirjastoa suorittaa saman tehtävän. Mutta toisin kuin Compojure, Bidi:

  • tukee sekä clj: tä että CLJ: ää
  • on isomorfinen ja laajennettavissa

suurin ero on se, että Bidissä reitit ovat tietorakenteita. Täällä ei ole makroja. Niin, kirjasto tarjoaa kätevä kaksisuuntainen lähestymistapa ja muita etuja. Jotkut web-kehittäjät mieluummin Bidi, koska se näyttää kunkin reitin tietyn käsittelijän. Lisäksi on mahdollisuus lukea reitit konfiguraatiotiedostosta, luoda ja muuttaa niitä funktioiden ja itsetutkiskelun avulla. He toimivat itsenäisesti käsitellyistä pyynnöistä. Niin, kehittäjä voi sovittaa asioita, jotka eivät välttämättä käsittelijät (esimerkiksi avainsanat).

Lacinia

Käyttötarkoitus: Grapql: n toteuttaminen Clojure-ohjelmoinnissa

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

tämä suosittu Clojure-kirjasto on hyödyllinen niille, jotka haluavat toteuttaa GraphQL: n työskennellessään verkkoliittymien kanssa.

miten Lacinia vaikuttaa?

alun perin GraphQL on kirjoitettu Javascriptillä. Lacinia on virallinen viittaus tähän täytäntöönpanoon. Se on kirjoitettu analogisesti alkuperäisen eritelmän. Sitä voidaan kutsua backend-agnostiseksi GraphQL-kyselyn suoritusmoottoriksi. Niin, kirjasto tarjoaa yhteyden tietosi ja GraphQL-asiakas.

syitä käyttää Lacinia

käyttämällä GraphQL: ää voit helposti saada rikkaamman ja monimutkaisemman Web API: n. Lacinia yksinkertaistaa API-kehitystä, koska se tukee inline / nimetty kyselyn fragmentit, GraphQL skeema Introspection, tilaukset, rajapinnat, liitot, enums, tulot ja mukautettuja skalaareja.

EDN-pohjaisella skeemakielellä kirjoitettuna kirjasto toimii täydellisesti GraphQL-kyselyiden kanssa. Se on rakennettu Antlr4: lle. Lacinia auttaa rikas tehokas asynkroninen kyselyn suoritus. Voit liittää sen mihin tahansa Clojure HTTP-putkistoon ja käyttää kumppanikirjastoa lacinia-pedestal HTTP-tukeen.

HoneySQL ja HugSQL

Käyttötarkoitus: onnistunut tietokannan vuorovaikutus

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

monet web-ohjelmoijat tuntevat olonsa mukavammaksi työskennellä SQL-teknologioiden kanssa,kuten Oracle, MS SQL, MySQL, PostgreSQL, SQLite jne. Honeysql ja HugSQL ovat kyselyn rakentajia, jotka tarjoavat vakaan pääsyn SQL-tietokantoihin Clojure-sovelluksissa.

miten honeysql ja HugSQL toimivat?

molemmat kirjastot varmistavat SQL: n omaksumisen Clojure-ohjelmoinnissa. Niin, voit kirjoittaa SQL-tietokannan komentoja jopa Clojure web apps.

Mitä eroa niillä on?

Hugsql: n avulla aloitetaan erillisten SQL-tiedostojen kirjoittaminen ja niiden laittaminen sovellukseen. Kyselyn rakentaja on saanut innoituksensa toisesta suositusta kirjastosta, YeSQL: stä. Se ei ainoastaan jäsennä SQL-tiedostoja Clojure-funktioiksi, vaan soveltuu myös useampiin käyttötapauksiin kuin YeSQL. HugSQL: ää ylläpidetään aktiivisesti. Se on protokolla-pohjainen adapterit tukevat useita tietokannan libs.

HugSQL: llä on useita etuja johtuen kahdesta perusominaisuudesta:

  • kyselyt kirjoitetaan suoraan, yksi kysely kutakin vaadittua funktiota kohti;
  • kyselyt on kirjoitettu SQL-kielellä.

HugSQL plussat

HugSQL tarjoaa Clojure-syntaksin ja SQL-semantiikan (mitä ja miten) erottelun.

  1. kuvaillaan, mitä Clojuressa pitää tehdä

(Hanki-käyttäjä-sähköpostit-käyttäjänimen mukaan “Alexandr Petrov”) ;->

  1. kuvaamme, miten tämä tehdään SQL

— :nimi get-user-sähköpostit-by-käyttäjätunnus:? : *

valitse käyttäjä_sähköpostit.Sähköposti user_emails jossa user_emails.user_id =: id

tämän seurauksena voimme muuttaa logiikkaa saada tiedot suoraan SQL: ssä kirjoittamatta Clojure-koodia uudelleen. Se on hyödyllinen, kun tietokannan skeema muutetaan, ja vanha kysely ei palauta tarvittavaa rakennetta.

lisäksi SQL itsessään on paljon tehokkaampi työkalu tietyn DBMS: n kanssa työskentelyyn. Se mahdollistaa suurten monimutkaisten kyselyiden kirjoittamisen “join” -, aggregaatio-ja Ikkunafunktioilla, mikä voi olla erittäin vaikeaa Clojuressa.

lisäksi SQL mahdollistaa tietyn DBMS: n (esimerkiksi Postgres) etujen käyttämisen. On tärkeää, jos olet varma, että tietokantaa ei muuteta.

HugSQL cons

  • DBMS: n vaihtaminen kesken projektin on vaikeaa. On tarpeen tarkistaa paljon pyyntöjä ja testata huolellisesti syntaksituki ja erityinen lähtö.
  • voit siirtää parametreja SQL-kyselyihin. Mutta joissakin tapauksissa, osat kyselyt on riippuvainen tietyin ehdoin. Vaikka HugSQL-pätkät mahdollistavat tämän tehtävän suorittamisen, sinun on tehtävä tämä useammin Clojuren avulla.

HoneySQL ei tarjoa tällaista SQL-ja Clojure-koodin erottelua. Näet kyselyt karttana.

HoneySQL pros

  • se on riippumaton tietystä DBMS-toteutuksesta, koska se yleensä välttää suoria SQL-kyselyjä. Niiden sijaan, se käyttää erityisiä DSL.
  • se mahdollistaa Oman Clojure-funktioihin/makroihin perustuvan DSL: n ylläpitämisen. Clojuren puolella voit myös luoda kyselyrakentajan säästävillä välipyynnöillä. Jos käyttäjä pitää esimerkiksi määritellä tunnuksella tai muulla monimutkaisella logiikalla, voi honeysql-rakenteesta tallentaa osan. Se osoittaa, että tarvitsemme juuri käyttäjän, emme tavaroita tai muita tietoja. Tämä “fragmentti” voidaan korvata tarvittaviin kyselyihin. Tämän seurauksena, saat lyhyempi koodi.

HoneySQL cons

  • voi olla haastavaa käyttää tietyn DBMS: n etuja sekä kirjoittaa monimutkaisia kyselyjä (esimerkiksi Ikkunafunktioilla)
  • Clojuren ohjelmoijan on erotettava koodi tiedon hakemiseen ja koodi tietojen käsittelyyn. Erottaminen johtaa lisätyöhön refactoring.

danielsz / system

Käyttötarkoitus: modulaarisen arkkitehtuurin tukeminen

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

hyödyllinen teknologia erittäin modulaaristen sovellusten kehittämiseen Clojuressa. Kehys tukee tehokasta vuorovaikutusta moduulien välillä ja sopii hyvin yhteen monipuolisen Clojure-ekosysteemin muiden osien kanssa.

miten danielsz / system vaikuttaa?

kirjasto sallii web-ohjelmoijan käyttää komponenttipohjaista lähestymistapaa. Niin, voit rakentaa sovelluksen moduulit / komponentit ja niiden väliset yhteydet. Jokainen komponentti on erityinen objekti. Sillä on oma elinkaarensa. Ohjelmoija kuvaa, miten se alkaa, mitä se tarvitsee käynnistyäkseen ja miten se pysähtyy.

esimerkiksi sovelluksemme koostuu www-palvelimesta ja tietokannasta. Ei ole mitään järkeä käynnistää WWW-palvelin ennen tietokannan aktivointia. Kuvataan tietokantakomponentti, kuvataan palvelinkomponentti ja palvelimen riippuvuus tietokannasta. Kun käynnistämme projektin, osoitamme, että meidän täytyy käynnistää web-palvelin. Kirjasto yrittää automaattisesti aktivoida tietokannan. Sitten, jos mahdollista, se käynnistää palvelimen ja siirtää valmiin aktivoidun tietokannan komponentti web-palvelimen komponentti. Tämän jälkeen järjestelmä tarvittaessa pysäytetään.

syitä käyttää danielsz / system

toisin kuin koko sovelluksen kuvaus, jossa on joukko tavallisia Clojure-funktioita, projektin kuvaus komponentteina tekee yhden komponentin korvaamisesta toisella. Esimerkiksi, kun testaat sovellusta, vaihdat yhden tietokannan toiseen tai sammutat sen kokonaan, korvaat sen nykyisillä tiedoilla.

funktioiden tapauksessa vaihdettaisiin vanhoja funktioita uusilla. Heillä on sama nimi, joka aiheuttaa usein vikoja. danielsz / system on valmis joukko ratkaisuja (web-palvelin, tietokanta, ja paljon muuta), järjestetty joukko komponentteja.

toivon, että nyt ymmärrät paremmin, miten Clojurea käytetään ja mitä teknisiä ratkaisuja projektissasi tulisi toteuttaa. Lisäartikkelini sisältävät tämän voimakkaan ja kauniin kielen edut sekä joitakin vinkkejä verkkosovellusten, palveluiden ja sovellusliittymien kehittämiseen. Joten, tilaa FreshCode blogi, jos haluat oppia lisää Clojure ohjelmointi maailma.

Vastaa

Sähköpostiosoitettasi ei julkaista.