La serie "The Pragmatic Programmers" ha un approccio diretto e pragmatico, anche se non esaustivo, nell'affrontare i più nuovi linguaggi di programmazione. In questo senso "
Programming Scala" non fa eccezione; scritto in un semplice e colloquiale stile che non affatica la lettura, è la perfetta introduzione a Scala, dedicato a programmatori Java con poco tempo a disposizione per lo studio di nuove tecnologie.
Il
primo capitolo, "Getting Up to Speed with Scala", introduce il linguaggio e le modalità di installazione, sia su Windows che su UNIX, e come lanciarlo da linea di comando, da script o tramite il proprio editor preferito. A seguire, "Classes in Scala" mostra le prime differenze con Java: inizialmente non è necessario lasciare il proprio stile di sviluppo
imperativo, ma la potenza di un approccio più funzionale e ad oggetti appare subito evidente.
Molti esempi permettono di capire che in Scala non esistono tipi primitivi, ma tutto è un oggetto; l'utilizzo delle
tuple, gli assegnamenti multipli e la flessibilità della ridefinizione degli operatori, metodi a tutti gli effetti, permettono a un codice Java di avere una marcia in più.
Nel
terzo capitolo, "Sensible Typing", viene introdotta l'elegante gestione dei tipi: Scala è un linguaggio staticamente tipizzato, ma il modo in cui desume il tipo di una variabile, senza necessariamente dichiararlo esplicitamente, lo rende estremamente conciso; ad aumentare la densità del linguaggio, anche il tipo dei metodi viene dedotto dal contesto.
Come Java, Scala è un linguaggio multiparadigmatico, ma con una propensione all'approccio funzionale; nel
quarto capitolo vengono mostrate le
function value, funzioni come oggetti di prima classe, che si possono assegnare a variabili, passare a metodi, essere passate come valore di ritorno e anche annidate come parametri. A queste si affiancano le
closure, una forma speciale di
function value che si lega a variabili definite altrove. Usando questi costrutti come blocchi di base si ottiene velocemente codice conciso e riusabile.
Nel
quinto capitolo si mostrano i
Trait, che possono essere considerate interfacce con una parziale implementazione, che permettono di aggiungere molteplici comportamenti ad altre classi; infatti i
Trait vengono usati per
decorare oggetti, aggiungendo funzionalità senza dover ricorrere all'ereditarietà. In questo capitolo viene anche mostrata la capacità di Scala di effettuare conversione di tipi in modo implicito, permettendo di estendere il linguaggio e creando un vocabolario o una sintassi specifica alla propria applicazione o
DSL. Nel
sesto capitolo viene introdotta la seconda più utilizzata funzionalità di Scala, dopo le
function value, e cioè il
pattern matching. In questa sezione si vede come utilizzare questo meccanismo per sintetizzare ulteriormente il proprio codice.
Come promette il sottotitolo del libro, "Tackle Multi-Core Complexity On The Java Virtual Machine", nel capitolo settimo l'autore non manca di trattare l'elegante approccio alla
concorrenza fornita. Ispirandosi al modello ad attori di Erlang, Scala utilizza un sistema di sincronismo tra thread, basato su scambio di eventi composto da messaggi immutabili. Diversamente dalla concorrenza in Java, non è necessario preoccuparsi del sincronismo, regioni critiche, semafori e risorse contese: grazie ai messaggi e all'immutabilità degli stessi, possiamo dimenticarci dei più comuni problemi della concorrenza, così come ci siamo dimenticati dei problemi della gestione della memoria, una volta fatto il passaggio a linguaggi con
garbage collector.
Il compilatore Scala produce bytecode esattamente uguale a quanto generato dal compilatore, pertanto è estremamente banale integrare progetti Java già esistenti con le moderne funzionalità di Scala. Il
nono capitolo, infatti, si rivolge agli sviluppatori Java, che vogliono estendere codice e librerie già esistenti, in modo da utilizzare parte della potenza di Scala, come ad esempio la gestione della concorrenza.
Un libro di programmazione non può dirsi completo e moderno se non tratta l'aspetto dello
unit test. Nel [/b]decimo capitolo[/b] viene mostrato come sia semplice integrare
JUnit con il proprio codice Scala e viene illustrato
Scalatest, una elegantissima libreria, che segue sia la filosofia di test alla
JUnit o TestNg, che la più attuale
BDD, con un approccio a specifiche come
RSpec e a storie come
Cucumber o
JBehave.
Come
più volte fatto notare, le
checked exception non si sono rivelate una idea molto utile, pertanto in Scala non è necessario né dichiararle né catturarle. Per tutto l'
undicesimo capitolo viene mostrata una strategia per la gestione delle eccezioni estremamente concisa ed elegante.
Nel
capitolo finale, viene mostrata una completa applicazione, sviluppata a partire dai test, che mostra tutti i punti di forza di Scala a cominciare dalla concorrenza, passando per il supporto al processamento dell'XML e finendo con l'integrazione con componenti Swing.
In conclusione, un libro assolutamente consigliato a tutti gli sviluppatori, che permette di avere un'infarinatura sufficiente dell'argomento; nel caso, si voglia approfondire si può passare al più corposo volume di riferimento "
Programming in Scala".