Skip to content

Instantly share code, notes, and snippets.

@ivanopagano
Created February 26, 2016 00:11
Show Gist options
  • Save ivanopagano/358bc67ffe171e2c656c to your computer and use it in GitHub Desktop.
Save ivanopagano/358bc67ffe171e2c656c to your computer and use it in GitHub Desktop.
Infamous Scala Requirements

Infamous Scala - gli obiettivi

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.

Obiettivo 1.

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.

Obiettivo 2.

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

Obiettivo 3.

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.

Obiettivo 4.

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, ...)

Obiettivo 5.

Questo requisito verra' rivelato solo durante l'incontro, in modo da valutare insieme l'impatto di una richiesta completamente incognita sul codice gia' prodotto.

Obiettivo 6.

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.

Pila software e soluzioni

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.

package omdb.client;
/**
* Created by Ivano Pagano on 09/02/16.
*
* Espone i valori presenti nella risposta json delle API
*/
public interface OpenMovie {
public String title();
public String year();
public String rated();
public String released();
public String runtime();
public String genre();
public String director();
public String writer();
public String actors();
public String plot();
public String language();
public String country();
public String awards();
public String poster();
public String type();
}
package omdb.client;
/**
* Created by Ivano Pagano on 09/02/16.
*
* Obiettivo 1.
*
* Implementare un client che accede alle API ReST disponibili al sito
* http://www.omdbapi.com/
*/
public interface OpenMovieClient {
/**
* Utilizza l'endpoint di ricerca generico (cfr. § By Search) per trovare i film
* che contengono il termine di ricerca nel titolo.
* Per ciascun risultato viene caricato il dettaglio tramite l'endpoint specifico
* per ID e il tutto viene restituito in un array
*
* @param title il termine da cercare
* @return l'elenco di oggetti con il dettaglio dei film trovati
*/
public OpenMovie[] listMoviesWithTitleLike(String title);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment