Buongiorno.
Lo scopo di questo esercizio e' di confrontare le potenzialita' del linguaggio Scala rispetto ad una tradizionale soluzione Java. Approfitto quindi della buona volonta' e dell'entusiasmo dei membri del JUG-Roma per proporvi di affrontare assieme a me un problema di semplice risoluzione da implementare in java. Durante l'incontro potremo confrontare la soluzione che svilupperemo in scala con le alternative proposte, con l'obiettivo di rendere evidenti le differenze fra i due approcci.
Le seguenti istruzioni per la realizzazione del servizio andranno analizzate in sequenza, valutando un requisito per volta.
L'intento e' di simulare uno sviluppo iterativo che somigli ad una reale situazione professionale, in modo da valutare l'impatto del linguaggio e le librerie su questo modello di sviluppo.
Pertanto vi invito a raggiungere ciascun obiettivo prima di passare ad analizzare il successivo. Questo dovrebbe aiutare a comprendere come e quanto il refactoring e l'evoluzione del codice siano piu' o meno complessi da gestire.
Implementare un client che accede alle API ReST disponibili al sito http://www.omdbapi.com/
Si tratta di un sito che espone dati pubblicati sul noto database dei film IMDB.
Le classi da realizzare sono semplici: un client con un unico metodo per la ricerca a partire dal titolo.
Usando le API verra' restituito un elenco di risultati ciascuno dei quali andra' usato per ottenere i dettagli dei film.
I dettagli si ottengono con una seconda chiamata che identifica il film tramite il suo ID.
Per l'utilizzo delle API si rimanda al sito. Le interfacce da implementare sono a disposizione: OpenMovie
e OpenMovieClient
.
Creare un sistema elementare di validazione dei parametri di configurazione del servizio
- protocollo
- host
- coppie di parametri e valori fissi (query parameters previsti dalle API)
- parametri variabili (i.e. il termine di ricerca, nome del query parameter previsto dalle API)
L'istanza del client ottiene questi parametri nel costruttore ed essi andranno controllati secondo i semplici criteri elencati, falliti i quali il client non restituira' risultati o genera un errore di creazione.
- protocollo: http o https
- host: formato separato da punti contenente lettere/numeri
- parametri: alfanumerici
Usare gli header di Cache-Control
nella risposta http per fare caching delle risposte.
In pratica bisogna seguire le indicazioni di caching esposte nella risposta del servizio ReST
per mantenere una copia nel client delle risposte precedenti.
Rendere il codice asincrono in modo sufficientemente efficacie, in modo da ridurre i tempi di esecuzione delle chiamate.
Per fare questo e' lecito usare qualunque struttura dati o libreria a disposizione della piattaforma java8
.
Si presume che il risultato della chiamata al client non restituisca piu' un risultato sincrono ma una struttura idonea ad una gestione asincrona (e.g. CompletableFuture
, Promise
, ...)
Questo requisito verra' rivelato solo durante l'incontro, in modo da valutare insieme l'impatto di una richiesta completamente incognita sul codice gia' prodotto.
Questa funzionalita' e' a vostra libera immaginazione e siete liberi di realizzarla nella vostra soluzione.
Anche questa verra' condivisa da voi solo durante l'incontro (sempre che lo vogliate) in modo da valutare l'impatto sulla soluzione scala di una richiesta incognita al momento della design originale.
Siete pregati di non scegliere una funzionalita' troppo sofisticata, sperando che avremo cosi' il tempo di implementarne una soluzione in diretta.
La soluzione realizzata in java potra' fare uso di qualunque libreria o framework che siano di facile riperimento. La piattaforma di riferimento sarebbe java8
, se possibile.
Rendetemi disponibile la vostra soluzione con un certo anticipo rispetto all'incontro, in modo che possa cercare di farla funzionare sul mio pc.
Sarebbe interessante se poteste portare degli appunti presi durante lo sviluppo, che mettano in rilievo difficolta' o soluzioni particolari o considerazioni che vi siano venute in mente man mano.