Utilizzo di Kotlin per lo sviluppo back-end: una rapida panoramica
Pubblicato: 2022-03-11Non devo presentare Kotlin agli sviluppatori Android nativi, poiché a maggio 2017 Google ha annunciato che sarebbe stata la lingua ufficiale per lo sviluppo di Android. Da allora, ha guadagnato molta popolarità come lingua principale scelta per lo sviluppo di app Android nuove e brillanti. Risolve molti punti dolenti di Java, quindi le nuove app sono per lo più scritte al suo interno e quelle vecchie vengono riscritte al suo interno.
Non c'è dubbio che sia eccezionale sul lato front-end delle applicazioni e, quando menzioni Kotlin per la prima volta, la maggior parte delle persone lo associa al sistema operativo Android. Tuttavia, in questo articolo, parlerei di Kotlin come linguaggio di back-end e vorrei condividere la mia storia sulla creazione di un back-end Kotlin veloce, affidabile e asincrono per il mio progetto hobby Android. Non discuterò di cosa tratta il progetto, poiché esula dallo scopo di questo articolo; piuttosto, mi concentrerò sulla spiegazione del motivo per cui ho scelto Kotlin e perché penso che sia un ottimo linguaggio per scrivere applicazioni lato server o API REST.
Perché Kotlin?
Vorrei tornare all'inizio del mio viaggio. Ho sempre avuto ambizioni imprenditoriali e ho pensato che il primo passo su questa strada fosse creare qualcosa di mio. Niente di enorme, niente che cambia il mondo, solo qualcosa di piccolo che io e forse la mia famiglia e i miei amici possiamo usare. Dopo aver avuto un'idea ragionevole, ci sono saltato dentro e ho iniziato a implementarla. La prima cosa che fai all'inizio di ogni progetto è scegliere i tuoi strumenti. Dopotutto, il giusto set di strumenti può farti risparmiare un sacco di tempo e denaro a lungo termine. Quindi questo è quello che ho fatto.
Sono principalmente uno sviluppatore Java. Ho scritto diversi sistemi back-end e API REST utilizzando Java e Spring e penso che questi due siano ottimi strumenti per fare queste cose. Java da solo è un linguaggio completo, ma combinato con Spring, non c'è nulla che tu non possa implementare.
Tuttavia, c'è solo un minuscolo capello nella zuppa. Verbosità. Sebbene Spring e le ultime versioni di Java aiutino molto in questo, devi comunque gestire molto codice standard. E come una volta un bravo ragazzo mi ha detto: il codice più sicuro, affidabile e privo di bug è il codice che non viene annotato. Prendi, ad esempio, questa banale classe Java:
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; } }
Secondo me, questo è un sacco di codice per dire semplicemente: "Voglio una classe con due campi di sola lettura". La parte peggiore è che il costruttore e i metodi sono stati generati automaticamente. Tuttavia, quando esamini una richiesta pull, le esamini sempre perché, beh, non sai mai se sono ciò di cui hai bisogno o meno. Certo, questo può essere abbreviato con librerie di terze parti come Lombok, ma non sarebbe bello se potessimo farlo fuori dagli schemi? Vediamo questa stessa classe esatta in Kotlin:
class Person( val name: String, val age: Int )
È decisamente più breve e più semplice. Le variabili sono finali poiché utilizziamo la parola chiave val ; il costruttore e i getter vengono generati in fase di compilazione. Se preferiamo non avere un oggetto persona immutabile, possiamo semplicemente cambiare val in var , e voilà, abbiamo una persona mutevole e tutto ciò che dobbiamo fare è cambiare solo una lettera.
La mia seconda parte preferita in una semplice classe POJO Java è l'override equals()
e hashCode()
. Questi sono di nuovo autogenerati per la maggior parte del tempo, ma devi sempre ripassarli, solo per essere sicuro. La buona notizia è che Kotlin può gestire anche questo. Cambia semplicemente la tua class
in una data class
e otterrai equals()
e hashCode()
fuori dagli schemi.
data class Person( val name: String, val age: Int )
In breve, anche se amo Java, volevo creare un prodotto minimo praticabile per il mio progetto il prima possibile in breve tempo. E nel caso dello sviluppo di software, il modo più semplice per ottenere questo risultato è scrivere meno codice. Pertanto, la mia ricerca di un linguaggio migliore per lo sviluppo di back-end è continuata. Con questo pensiero in mente, mi sono spostato prima su Node.js. Presenta alcuni vantaggi significativi: poche righe e il tuo server Express è attivo e funzionante, è in ascolto sulla porta 8080 e risponde con Hello World! ogni volta che invii una richiesta get.
let express = require('express') let app = express(); app.get('/', (req, res) => res.send('Hello World!')); app.listen(8080);
Facile, semplice e veloce. Proprio quello che ti aspetteresti da uno dei linguaggi di programmazione più popolari in circolazione. Mi piace lavorare con JavaScript e, per un breve momento, ho pensato di aver trovato lo strumento giusto, ma poi sono rimasto perseguitato dal fatto che JavaScript è digitato dinamicamente. Non fraintendermi, penso che la digitazione dinamica sia ottima sul front-end, ma secondo la mia esperienza, avere un back-end digitato staticamente ti dà semplicemente una maggiore sicurezza sul fatto che il tuo server ha meno probabilità di andare in crash in fase di esecuzione a causa di disallineamenti di tipo . E siamo onesti qui, quando il tuo back-end sta servendo diverse centinaia di migliaia di utenti, non vuoi davvero che accada. Node.js, tuttavia, offriva un'ottima funzionalità che volevo mantenere, ovvero la possibilità di scrivere facilmente codice e servizi asincroni.
Con questi requisiti in mente, ho scelto di scrivere il mio back-end Android Kotlin anche in Kotlin.
Kotlin: una rapida panoramica
Per quelli di voi che non ne hanno mai sentito parlare prima, Kotlin è un linguaggio di programmazione open source, tipizzato staticamente che supporta sia la programmazione orientata agli oggetti che quella funzionale. Fornisce sintassi e concetti simili a C#, Java o Scala e si rivolge principalmente alla JVM ma ha anche varianti che prendono di mira JavaScript o codice nativo. È molto simile a Java in quanto Kotlin/JVM si compila in bytecode Java, quindi per quegli ingegneri back-end che hanno un background JVM, Kotlin sarà facile da capire.

Come afferma la sua pagina ufficiale, l'obiettivo di Kotlin non è quello di essere unico, ma di trarre ispirazione e le migliori pratiche da decenni di sviluppo linguistico. Può essere utilizzato con qualsiasi IDE Java o dalla riga di comando, ma personalmente preferisco e consiglio di usarlo con IntelliJ. È attivamente mantenuto e aggiornato dal team di JetBrains e non preoccuparti di acquistare la versione a pagamento: se hai appena iniziato con Kotlin, la versione community di IntelliJ soddisferà ogni tua esigenza. I tre aspetti più importanti di Kotlin che vorrei sottolineare sono che è: a) conciso (riduce drasticamente il codice standard), b) sicuro (per prima cosa, è costruito per evitare eccezioni di puntatore nullo) e c ) interoperabile (è possibile sfruttare le librerie esistenti per JVM, Android o il browser).
Coroutine di Kotlin
Tutti vogliono avere servizi che servano gli utenti velocemente. Per raggiungere la capacità massima del tuo server, la prima cosa che puoi fare è avere un'applicazione multithread. Java è piuttosto ingombrante con quello. Quando impari Java, impari prima che se vuoi un'applicazione multithread, dovresti estendere la classe Thread o implementare l'interfaccia Runnable. I principianti non capiscono mai veramente quale sia la differenza (se ce n'è), ma per aggiungere confusione, viene anche detto loro di iniziare sempre un thread con il metodo run, di non usare mai il metodo start. O aspetta, era il contrario? Dopotutto, non importa, non dovresti comunque avviare un thread manualmente, è troppo costoso, usa piuttosto un pool di thread. Semplice, tranne che non lo è.
Fortunatamente, Kotlin ha una soluzione ancora più semplice chiamata coroutine. In poche parole, le coroutine consentono di scrivere codice asincrono e non bloccante in modo molto fluido. L'idea centrale è avere funzioni che possono essere sospese; in altre parole, il calcolo può essere sospeso a un certo punto e ripreso in seguito. La parte migliore è che quando si scrive codice non bloccante, il modello di programmazione non cambia realmente, quindi scrivere codice non bloccante è essenzialmente lo stesso che scrivere codice bloccante. Vediamo due esempi:
fun sendRequest(): Int { /* do some heavy work */ return 1; }
Questo esempio mostra una funzione di blocco. Il thread che esegue questo frammento di codice non eseguirà nessun altro lavoro fino a quando la funzione non ritorna, che in caso di una chiamata API o database potrebbe durare un paio di secondi. Non vogliamo davvero bloccare il nostro thread in attesa di un altro servizio, quindi trasformiamo questa funzione in una non bloccante.
suspend fun sendRequest(): Int { /* do some heavy work */ return 1; }
Questo esempio mostra come possiamo trasformare il nostro metodo in una funzione non bloccante che può essere sospesa. Ciò significa che se, per semplicità, il lavoro pesante è una semplice chiamata alla funzione delay()
di 10 secondi, il thread in esecuzione continuerà a lavorare su altre attività per quel tempo e riprenderà l'esecuzione della funzione dopo che sono trascorsi 10 secondi. Codice piacevole e non bloccante ottenuto con una sola parola chiave.
Servizio asincrono con Ktor
Quando si tratta di scrivere API REST, è necessario eseguire alcuni passaggi aggiuntivi, come avviare un server incorporato o analizzare la richiesta e, naturalmente, nessuno vuole farlo manualmente. Java ha Spring Boot, che rende le cose davvero facili e, fortunatamente, Kotlin ha un framework chiamato Ktor. Ktor è un framework web per la creazione di server asincroni. Come afferma il suo sito Web, Ktor è "facile da usare, divertente e asincrono". Ora, il divertimento è soggettivo, quindi non vorrei dimostrarlo, tuttavia, vediamo uno snippet che si rivela facile da usare e asincrono.
fun main() { embeddedServer(Tomcat, 8080) { routing { get { call.respond("Hello world!") } } }.start(wait = true) }
L'esempio sopra presenta un server Kotlin Ktor completamente funzionante che è in esecuzione su un server Tomcat incorporato, è in ascolto sulla porta 8080 e risponderà in modo asincrono con "Hello world!" per ricevere richieste. Tutto questo in meno di 10 righe di codice.
Ovviamente Ktor può fare molto di più. Presentare tutte le funzionalità di Ktor richiede un proprio articolo, ma tra le tante cose, rende l'accesso e l'autenticazione facili come una torta. Leggi di più su cosa può fare Ktor sul lato server e come configurarlo qui.
Altri vantaggi di Kotlin sul back-end
Il primo vantaggio che vorrei sottolineare è che puoi utilizzare le librerie Java in Kotlin e, fidati di me, ci sono molte fantastiche librerie di terze parti per Java che possono semplificarti la vita. Perché dovresti scrivere la tua implementazione quando c'è una libreria open source pronta per l'uso che fa il lavoro perfettamente? L'uso di questi con Kotlin funziona perfettamente.
Un altro grande vantaggio di Kotlin e Ktor sono le vaste librerie e framework di test che puoi usare. Il framework Junit funziona alla perfezione con Kotlin e Ktor aggiunge inoltre la propria libreria di test che ti consente di scrivere test end-to-end e test di integrazione in pochissimo tempo. Puoi utilizzare un motore di test personalizzato che eseguirà l'intera applicazione e sarà in grado di gestire le richieste proprio come farebbe l'applicazione live.
Conclusione
Come accennato in precedenza, sono principalmente uno sviluppatore back-end Java con diverse applicazioni lato server e API REST dietro di me. Anche se adoro programmare in Java, penso che non esista un unico linguaggio o framework migliore che sia perfetto per qualsiasi lavoro e possa risolvere qualsiasi problema. Il mio approccio è quello di acquisire familiarità con il maggior numero di strumenti possibile e, quando si presenta un problema, scegliere lo strumento migliore in grado di risolvere quel particolare problema in modo impeccabile.
Come afferma il sito di Kotlin, lo scopo di Kotlin non è quello di essere unico; invece, trae ispirazione e le migliori pratiche da decenni di sviluppo del linguaggio, e credo che quando si tratta di sviluppo back-end, Kotlin, Coroutines e Ktor costituiscano un trio straordinario per fare il lavoro. Puoi leggere di più su Kotlin e la sua utilità come linguaggio di programmazione qui.