Utilizarea Kotlin pentru dezvoltarea back-end: o privire de ansamblu rapidă
Publicat: 2022-03-11Nu trebuie să prezint Kotlin dezvoltatorilor nativi Android, deoarece în mai 2017, Google a anunțat că va fi limba oficială pentru dezvoltarea Android. De atunci, a câștigat multă tracțiune ca fiind alegerea principală a limbii pentru dezvoltarea de aplicații Android noi și strălucitoare. Rezolvă multe probleme ale Java, așa că noile aplicații sunt în mare parte scrise în el, iar cele vechi sunt rescrise în el.
Nu există nicio îndoială că este grozav pe partea de front-end a aplicațiilor și când menționezi prima dată Kotlin, majoritatea oamenilor îl asociază cu sistemul de operare Android. Cu toate acestea, în acest articol, aș vorbi despre Kotlin ca limbaj back-end și aș dori să împărtășesc povestea mea despre crearea unui back-end Kotlin rapid, fiabil și asincron pentru proiectul meu de hobby Android. Nu voi discuta despre ce este proiectul, deoarece este în afara domeniului acestui articol; mai degrabă, mă voi concentra pe explicarea de ce am ales Kotlin și de ce cred că este un limbaj grozav pentru scrierea aplicațiilor pe server sau a API-urilor REST.
De ce Kotlin?
Lasă-mă să mă întorc la începutul călătoriei mele. Întotdeauna am avut ambiții antreprenoriale și m-am gândit că primul pas pe acest drum este să creez ceva pe cont propriu. Nimic uriaș, nimic care să schimbe lumea, doar ceva mic pe care eu și poate familia și prietenii mei îl putem folosi. După ce am avut o idee rezonabilă, am sărit direct în ea și am început să o implementez. Primul lucru pe care îl faceți la începutul oricărui proiect este să vă alegeți instrumentele. La urma urmei, setul potrivit de instrumente vă poate economisi mult timp și bani pe termen lung. Deci asta am făcut.
Sunt în primul rând un dezvoltator Java. Am scris mai multe sisteme back-end și API-uri REST folosind Java și Spring și cred că acestea două sunt instrumente grozave pentru a face astfel de lucruri. Java în sine este un limbaj cuprinzător, dar combinat cu Spring, nu există nimic ce să nu poți implementa.
Cu toate acestea, în supă există doar un păr mic. Verbositate. Deși Spring și cele mai recente versiuni de Java ajută foarte mult la asta, totuși trebuie să gestionați o mulțime de coduri standard. Și așa cum mi-a spus odată un tip grozav - cel mai sigur, mai de încredere și fără erori este codul care nu este scris. Luați, de exemplu, această clasă Java banală:
public class Person { private final String name; private final int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } }
În opinia mea, acesta este o mulțime de cod pentru a spune pur și simplu: „Vreau o clasă cu două câmpuri numai pentru citire”. Partea cea mai proastă este că constructorul și metodele au fost autogenerate. Totuși, atunci când revizuiți o solicitare de extragere, le parcurgeți întotdeauna pentru că, ei bine, nu știți niciodată dacă sunt ceea ce aveți nevoie sau nu. Sigur, acest lucru poate fi scurtat cu biblioteci terțe, cum ar fi Lombok, dar nu ar fi frumos dacă am putea face acest lucru imediat? Să vedem exact aceeași clasă în Kotlin:
class Person( val name: String, val age: Int )
Cu siguranță este mai scurt și mai simplu. Variabilele sunt finale deoarece folosim cuvântul cheie val ; constructorul și getter-urile sunt generate în timpul compilării. Dacă preferăm să nu avem un obiect de persoană imuabil, putem pur și simplu să schimbăm val în var și voilà, avem o persoană mutabilă și tot ce trebuie să facem este să schimbăm doar o literă.
A doua parte preferată dintr-o clasă Java POJO simplă este equals()
și hashCode()
suprascrise. Acestea sunt din nou generate automat de cele mai multe ori, dar trebuie să le analizați întotdeauna, doar pentru a vă asigura. Vestea bună este că și Kotlin se poate descurca cu asta. Pur și simplu schimbați class
într-o data class
și obțineți equals()
și hashCode()
din cutie.
data class Person( val name: String, val age: Int )
Pe scurt, deși iubesc Java, am vrut să creez un produs minim viabil pentru proiectul meu cât mai curând posibil și într-un timp scurt. Și în cazul dezvoltării de software, cel mai simplu mod de a realiza acest lucru este să scrieți mai puțin cod. Astfel, căutarea mea pentru un limbaj mai bun pentru dezvoltarea back-end a continuat. Având în vedere acest gând, m-am îndreptat mai întâi către Node.js. Are câteva avantaje semnificative — câteva linii și serverul dvs. Express este în funcțiune, ascultă pe portul 8080 și răspunde cu Hello World! de fiecare dată când trimiteți o cerere de obținere.
let express = require('express') let app = express(); app.get('/', (req, res) => res.send('Hello World!')); app.listen(8080);
Ușor, simplu și rapid. Exact ceea ce v-ați aștepta de la unul dintre cele mai populare limbaje de programare de acolo. Îmi place să lucrez cu JavaScript și, pentru un scurt moment, m-am gândit că am găsit instrumentul potrivit, dar apoi am fost bântuit de faptul că JavaScript este tastat dinamic. Nu mă înțelege greșit, cred că scrierea dinamică este grozavă pe front-end, dar din experiența mea, a avea un back-end tip static vă oferă pur și simplu mai multă încredere că serverul dvs. este mai puțin probabil să se blocheze în timpul rulării din cauza nepotrivirilor de tip. . Și să fim sinceri aici, când back-end-ul tău servește câteva sute de mii de utilizatori, chiar nu vrei să se întâmple asta. Node.js, totuși, a oferit o caracteristică grozavă pe care am vrut să o păstrez, și anume posibilitatea de a scrie cu ușurință cod și servicii asincrone.
Având în vedere aceste cerințe, am ales să scriu back-end-ul meu Android Kotlin și în Kotlin.
Kotlin: O privire de ansamblu rapidă
Pentru cei dintre voi care nu ați auzit niciodată de el până acum, Kotlin este un limbaj de programare open-source, tip static, care acceptă atât programarea orientată pe obiecte, cât și programarea funcțională. Oferă sintaxă și concepte similare ca C#, Java sau Scala și vizează în principal JVM, dar are și variante care vizează JavaScript sau codul nativ. Este foarte asemănător cu Java prin faptul că Kotlin/JVM se compilează până la codul de octeți Java, așa că pentru acei ingineri back-end care au un fundal JVM, Kotlin va fi ușor de înțeles.

După cum afirmă pagina sa oficială, scopul Kotlin nu este să fie unic, ci să se inspire și să se inspire din cele mai bune practici din decenii de dezvoltare a limbii. Poate fi folosit cu orice IDE Java sau din linia de comandă, dar eu personal prefer și recomand să-l folosesc cu IntelliJ. Este întreținut și actualizat în mod activ de echipa JetBrains și nu vă faceți griji cu privire la cumpărarea versiunii plătite - dacă tocmai ați început cu Kotlin, versiunea comunitară a IntelliJ vă va satisface toate nevoile. Cele mai importante trei aspecte ale lui Kotlin pe care aș dori să le subliniez sunt că este: a) concis (reduce drastic codul standard), b) sigur (în primul rând, este construit pentru a evita excepțiile pointerului nul) și c ) interoperabil (puteți folosi bibliotecile existente pentru JVM, Android sau browser).
Kotlin Coroutines
Toată lumea vrea să aibă servicii care să servească rapid utilizatorii. Pentru a atinge capacitatea maximă a serverului tău, primul lucru pe care îl poți face este să ai o aplicație multithreaded. Java este destul de greoaie cu asta. Când înveți Java, înveți mai întâi că, dacă vrei o aplicație cu mai multe fire, ar trebui fie să extinzi clasa Thread, fie să implementezi interfața Runnable. Începătorii nu înțeleg niciodată cu adevărat care este diferența (dacă există), dar pentru a adăuga confuzie, li se spune, de asemenea, să înceapă întotdeauna un thread cu metoda run, să nu folosească niciodată metoda start. Sau stai, a fost invers? La urma urmei, nu contează, oricum nu ar trebui să porniți un thread manual, este prea scump, mai degrabă utilizați un pool de fire. Simplu, doar că nu este.
Din fericire, Kotlin are o soluție și mai simplă numită coroutine. Mai simplu spus, coroutinele fac posibilă scrierea codului asincron, neblocant într-un mod foarte fluent. Ideea de bază este de a avea funcții care pot fi suspendate; cu alte cuvinte, calculul poate fi suspendat la un moment dat și reluat mai târziu. Cea mai bună parte este că atunci când scrieți cod neblocant, modelul de programare nu se schimbă cu adevărat, așa că scrierea codului neblocant este în esență aceeași cu scrierea codului de blocare. Să vedem două exemple:
fun sendRequest(): Int { /* do some heavy work */ return 1; }
Acest exemplu arată o funcție de blocare. Firul care execută acest fragment de cod nu va face nicio altă activitate până când funcția revine, ceea ce în cazul unui apel API sau bază de date poate dura câteva secunde. Chiar nu vrem să ne blocăm firul în timp ce așteptăm un alt serviciu, așa că haideți să transformăm această funcție într-una neblocante.
suspend fun sendRequest(): Int { /* do some heavy work */ return 1; }
Acest exemplu arată cum ne putem transforma metoda într-o funcție neblocante care poate fi suspendată. Aceasta înseamnă că dacă, pentru simplitate, munca grea este un simplu apel al funcției delay()
de 10 secunde, firul de execuție va continua să lucreze la alte sarcini pentru acel timp și va relua execuția funcției după trecerea celor 10 secunde. Cod frumos, fără blocare, realizat cu un singur cuvânt cheie.
Serviciu asincron cu Ktor
Când vine vorba de scrierea API-urilor REST, trebuie să faceți câțiva pași suplimentari, cum ar fi pornirea unui server încorporat sau analizarea cererii și, desigur, nimeni nu dorește să o facă manual. Java are Spring Boot, ceea ce face lucrurile foarte ușoare și, din fericire, Kotlin are un cadru numit Ktor. Ktor este un cadru web pentru construirea de servere asincrone. După cum afirmă site-ul său, Ktor este „ușor de utilizat, distractiv și asincron”. Acum, distracția este subiectivă, așa că nu aș dori să demonstrez că, totuși, să vedem un fragment care se dovedește ușor de utilizat și asincron.
fun main() { embeddedServer(Tomcat, 8080) { routing { get { call.respond("Hello world!") } } }.start(wait = true) }
Exemplul de mai sus prezintă un server Kotlin Ktor complet funcțional care rulează pe un server Tomcat încorporat, ascultă pe portul 8080 și va răspunde asincron cu „Hello world!” pentru a primi cereri. Toate acestea în mai puțin de 10 linii de cod.
Ktor poate face, evident, mult mai mult decât atât. Prezentarea tuturor funcțiilor Ktor necesită propriul articol, dar printre multe lucruri, face autentificarea și autentificarea ușoară. Citiți mai multe despre ce poate face Ktor pe partea de server și despre cum să-l configurați aici.
Alte beneficii ale Kotlin pe partea din spate
Primul beneficiu pe care aș dori să-l subliniez este că puteți utiliza biblioteci Java în Kotlin și, credeți-mă, există o mulțime de biblioteci uimitoare de la terți pentru Java care vă pot face viața mai ușoară. De ce ați scrie propria implementare când există o bibliotecă open-source, gata de utilizare, care face treaba perfect? Folosirea acestora cu Kotlin funcționează impecabil.
Un alt avantaj major al Kotlin și Ktor este bibliotecile și cadrele de testare extinse pe care le puteți utiliza. Cadrul Junit funcționează de minune cu Kotlin, iar Ktor adaugă peste aceasta propria bibliotecă de testare care vă permite să scrieți teste end-to-end și teste de integrare în cel mai scurt timp. Puteți utiliza un motor de testare personalizat care va rula întreaga aplicație și poate gestiona solicitările exact așa cum ar face aplicația live.
Concluzie
După cum am menționat mai devreme, sunt în primul rând un dezvoltator Java back-end, având în spate mai multe aplicații pe partea de server și API-uri REST. Deși îmi place să programez în Java, cred că nu există un singur limbaj sau cadru care să fie perfect pentru orice loc de muncă și să poată rezolva orice problemă. Abordarea mea este să mă familiarizez cu cât mai multe instrumente posibil și, atunci când apare o problemă, să alegi cel mai bun instrument care poate rezolva perfect acea problemă.
După cum afirmă site-ul Kotlin, scopul Kotlin nu este să fie unic; în schimb, se inspiră și se inspiră din cele mai bune practici din decenii de dezvoltare a limbajului și cred că atunci când vine vorba de dezvoltarea back-end, Kotlin, Coroutines și Ktor formează un trio uimitor pentru a face treaba. Puteți citi mai multe despre Kotlin și utilitatea sa ca limbaj de programare aici.