Paola Magillo, Univestita' di Genova, Corso di Programmazione II per SMID, a.a. 2008-2009.

Lezione 12:

CASO DI STUDIO: GESTIONE DI UN DATA BASE TURISTICO - PARTE I

Vediamo un esempio che verra' poi usato nell'esame.

Supponiamo di essere un'agenzia turistica che ha un data base di gite da proporre ai clienti. Costruiremo un'applicazione (programma con interfaccia utente grafica) che gestisce questo data base.

L'interfaccia e' destinata a un cliente dell'agenzia turistica: un turista che puo' scegliere una gita. Permette di guardare quali gite ci sono, di prenotarne una, di cancellare una prenotazione fatta.

Cosa contiene il data base

Il data base gestisce un insieme di gite memorizzate su disco, ciascuna in un file. Quando l'utente chiede una gita o piu' gite (per es. impostando un criterio di ricerca), queste vengoni caricate e memorizzate ciascuna in un oggetto di apposita classe Java.

Una gita e' descritta dalle seguenti informazioni:

Esempio: Gita a Portofino
titolo = "Portofino e le sue meraviglie"
tipo = natura e paesaggio
mezzo di trasporto = battello
descrizione = PortofinoMerav.html
periodo dell'anno inizio = 1 maggio 2009
periodo dell'anno fine = 15 settembre 2009
giorni della settimana = sabato domenica
costo pro capite = 50 euro

Rudimenti sui file HTML

Il linguaggio HTML (Hyper Text Markup Language) e' la particolare sintassi con sui sono scritte le pagine web.

Sono file di testo con intercalati dei comandi chiamati "tag" (marcature) che possono specificare:

  • Per quello che interessa a noi qui: cambi di stile di scrittura, inclusione di figure...
  • Altro (che non ci interessa): elenchi puntati o numerati, tabelle, collegamento ad altre pagine (link)... Per esempio il file che state leggendo e' scritto in HTML.

    I file HTML si possono scrivere a mano scrivendo il testo e i tag, si sapra' l'aspetto finale al momento di caricare la pagina nel browser.
    Esistono anche editor di tipo grafico dove vedo direttamente quello che verra' fuori e i tag li genera l'editor. Di solito questi producono file HTML che sono poi illeggibili per un umano, e molto piu' grandi in numero di byte.

    Il browser ha un'opzione "view source" che fa vedere il sorgente testo della pagina HTML corrente. Se e' una pagina scritta a mano la si puo' guardare per imparare.

    Se vogliamo scriverli a mano, tutti i tag sono racchiusi tra parentesi acute < > e hanno le seguenti forme.

    1) Comando che influsisce su una sezione di testo (es. cambiandone la formattazione):

    <NOMECOMANDO>testo che subisce il comando</NOMECOMANDO>

    Esempio:<B>ciao</B> <I>ciao</I>
    scrive la stringa ciao in grassetto e poi in corsivo.

    Esempio:<P>testo testo testo...</P>
    Racchiude un paragrafo (viene formattato inserendo una salto linea prima e dopo.

    I tag possono essere annidati. In questo caso il tag di apertura <NOMECOMANDO> deve essere sempre accompagnato dal corrispondente tag di chiusura </NOMECOMANDO>, nell'ordine giusto.
    Esempio scritta in grassetto e corsivo: <B><I>ciao</I></B>
    Esempio tutto il file HTML deve essere racchiuso tra i due tag annidati:
    <HTML><BODY>
    ...testo del file...
    </BODY></HTML>

    2) Comando che non agisce su testo, ma inserisce un elemento:

    <NOMECOMANDO>

    In pratica non ha un tag di chiusura.

    Esempio per inserire andata a capo: <BR>

    3) Comandi con parametri:

    Entrambi i tipi di comandi possono avere parametri. Ogni comando prevede un insieme di parametri possibili, posso specificarne un sottoinsieme.

    Si specificano inserendo dentro al tag di apertura, dopo il nome del comando, un elemento della forma:
    NOMEPARAMETRO="valoreparametro"
    tutti i valori, anche numerici, sono messi tra "" come stringhe.

    Esempio comando che ha influenza su testo: <FONT SIZE="+3">ciao</FONT>
    scrive la stringa ciao in carattere di 3 misure piu' grande del normale.

    Esempio comando che inserisce un'immagine: <IMG SRC="pippo.gif">
    il parametro specifica il file da cui caricarla (sono accettati i formati immagine jpg, gif, png).

    Che cosa permette di fare l'applicazione

    L'utente cliente (turista) puo' fare le seguenti operazioni:

    I criteri di ricerca impongono condizioni che devono essere soddisfatte dalle informazioni presenti nella gita:

    Nella lezione 13 il data base avra' anche un'interfaccia grafica, qui non ce ne occupiamo ancora.

    Classi Java per il data base

    Tutte le classi che costituiscono questo esempio sono predisposte per essere documentate con Javadoc (vedere lezione 11). Scaricare tutti i file java nella directory corrente e poi digitare "javadoc *.java", genera documentazione per tutte le classi, il file da cui partire (con l'indice) e' poi quello di nome "index.html".

    Qui diamo solo un inquadramento generale delle classi, a che cosa servono, che collegamenti hanno fra loro. Per tutti gli altri dettagli si rimanda alla documentazione javadoc.

    Classe UtilitaStringhe

    UtilitaStringhe.java

    Classe di utilita' il cui scopo principale e' realizzare il controllo se una parola chiave sia presente all'interno di una frase, e far questo prescindendo dal tipo e numero di caratteri separatori fra le parole, dal maiuscolo/minuscolo delle lettere, e tralasciando i tag HTML (ovvero tutto cio' che sta tra < >).

    Classe GiornoMeseAnno

    GiornoMeseAnno.java

    Descrive una data nella forma "giorno, mese, anno" con con le necessarie operazioni di conversione da/a la rappresentazione a stringa della data. Contiene anche costanti per i giorni della settimana.

    Classe ParteComuneGitaRicerca

    ParteComuneGitaRicerca.java

    Superclasse di Gita e di Ricerca, contiene gli elementi comuni alle due sotto-classi, cioe': tipo, mezzo di trasporto, costo pro capite.

    Definisce costanti numeriche per i tipi e i mezzi di trasporto e varie funzioni di utilita': quelle che dal valore numerico restituiscono la rappresentazione a stringa, in lingua italiana, del tipo o del mezzo di trasporto.

    I tipi e i mezzi di trasporto sono costanti numeriche con valori interi che in rappresentazione binaria hanno un solo 1 in posizioni diverse tra loro. Questa caratteristica sara' sfruttata nella sotto-classe Ricerca per memorizzare piu' tipi in una variabile sola (ved. sotto).

    Classe Gita

    Gita.java

    Descrive una gita, con le informazioni: titolo, tipo, mezzo di trasporto, date di inizio e fine del periodo in cui e' disponibile la gita, giorni della settimana in cui si fa la gita, descrizione della gita (caricata da file HTML), costo pro capite.

    Agli attributi tipo, mezzo di trasporto, costo, ereditati dalla super-classe ParteComuneGitaRicerca, aggiunge i nuovi attributi titolo della gita, date di inizio e fine del periodo in cui e' disponibile la gita, giorni della settimana in cui si fa la gita, descrizione della gita (caricata da file HTML).

    L'informazione sui giorni della settimana in cui c'e' la gita e' tenuta con un array di booleani in cui le posizioni da 1 a 7 corrispondono ai giorni della settimana, per un certo giorno l'array contiene true se la gita si fa quel giorno e false altrimenti. L'array ha 8 posizioni, da 0 a 7, non e' usata la posizione zero.

    Sono memorizzati separatamente il nome del file HTML con la descrizione, la URL (indirizzo in rete - qui sulla macchina locale per cui inizia con "file:" invece che con "http:") di tale file, e il contenuto (come stringa) letto dal file.

    Una gita puo' leggere se stessa da un file che rispetti una certa sintassi. La classe Gita definisce costanti per le parole chiave che devono essere presenti nel file.

    La sintassi e':

    GITA 
    Titolo: titolo della gita
    Descrizione: nome file html
    Tipo: uno tra natura e paesaggio, arte e cultura, svago e divertimento
    Mezzo: uno tra treno, pullman, battello
    Inizio: una data con mese in numeri o lettere (ved. classe GiornoMeseAnno)
    Fine: idem come sopra
    Giorni: uno o piu' tra lunedi martedi mercoledi giovedi venerdi sabato domenica
    Costo: un intero
    STOP
    

    Classe Ricerca

    Ricerca.java

    Descrive un criterio per la ricerca, con le informazioni: parola chiave, tipo, mezzo di trasporto, giorno, costo pro capite.

    Agli attributi tipo, mezzo di trasporto, costo, ereditati dalla super-classe ParteComuneGitaRicerca, aggiunge i nuovi attributi parola chiave e giorno.

    Negli attributi mezzo e tipo, riesco a memorizzare valori multipli sfruttando il fatto che le costanti per tipo e mezzo di trasporto sono numeri interi che in rappresentazione binaria hanno un solo 1 in posizioni diverse tra loro.
    I valori muklipli si ottengono facendo OR bit a bit sulla rappresentazione binaria, es. mezzo = TRENO | PULLMAN (ottengo un numero che ha due 1: dove uno o l'altro aveva 1). Per vedere se due valori multipli hanno intersezione non vuota, facciamo AND bit a bit, es. mezzo1 & mezzo2, e guardiamo se e' non zero (ottengo un numero che ha 1 dove entrambi avevano 1).

    Definisce un metodo che controlla se i valori di due codici hanno intersezione non vuota.

    Classe DataBase

    DataBase.java

    Descrive il data base di tutte le gite. Su disco il data base e' una directory che contiene i file con le informazioni sulle gite. La singola gita viene caricata da file solo se e quando serve (es. e' tra i risultati della ricerca che devo visualizzare all'utente). La classe per il data base contiene l'elenco delle gite e un array di oggetti Gita, che viene riempito ogni volta coi risultati della ricerca.

    Ogni gita ha un file principale con estensione ".gita" ed eventuali altri file (il file HTML ed eventuali immagini usate al suo interno). La classe per il data base memorizza delle informazioni generali che ricava guardando il contenuto della directory (es. quante gite ci sono, i nomi dei file) e in ogni momento il suo array di gite caricate contiene non tutte le gite, ma solo quelle risultanti dall'ultima operazione di ricerca.

    Questa classe realizza anche il motore di ricerca che esegue le ricerche sul data base.

    Contiene metodi per caricare le gite (tutte o quelle che soddisfano un criterio di ricerca), e per restituire le gite caricate.

    Altre classi

    Inoltre la classe gia' vista MyReader (vedere lezione 10).

    E le classi per l'interfaccia utente grafica che vedremo la prossima volta.