Paola Magillo, Univestita' di Genova, Corso di Programmazione II per SMID, a.a. 2005-2006.

Lezione 12:

CASO DI STUDIO: GESTIONE DI UNA BIBLIOTECA - PARTE I

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

La biblioteca tiene traccia dei libri presenti e dei libri dati in prestito.

Ogni libro ha associate le seguenti informazioni: autore, titolo, numero di copie totali possedute dalla biblioteca, numero di copie attualmente date in prestito (dove il numero di copie date in prestito ovviamente non puo' essere maggiore del numero di copie possedute).
Internamente al sistema un libro ha anche un codice numerico che serve come identificatore.

La biblioteca permette le seguenti operazioni:

Nella lezione 13 la biblioteca avra' anche un'interfaccia grafica, qui non ce ne occupiamo ancora.

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".

Classi per la biblioteca

  1. Classe Libro: tiene le informazioni generali di un libro (titolo, autore).
  2. Classe LibroInBiblioteca: sotto-classe di Libro, aggiunge le informazioni relative alla presenza del libro nella biblioteca (numero di copie totali, numero di copie prestate).
  3. Classe Biblioteca: tiene un insieme di libri implementato ad array, permette operazioni di prestito, restituzione, acquisizione e dismissione di un libro.

Classe Libro

Sorgente

Rappresenta un libro indipendentemente dalla biblioteca.

Attributi pubblici: titolo (stringa), autore (stringa).

Metodi pubblici:

Classe LibroInBiblioteca

Sorgente.

Sotto-classe di libro, rappresenta un libro nella biblioteca.

Attributi (non sono pubblici): numero di copie totali presenti in biblioteca (intero), numero di copie prestate (intero).

Metodi pubblici:

Classe Biblioteca

Sorgente.

All'interno della biblioteca i libri sono tenuti in un array.
Al momento della creazione della biblioteca questo array e' dimensionato a un certa capacita', la quale e' il numero massimo di libri che la biblioteca potra' contenere.
In generale la biblioteca conterra' meno libri della sua capacita' (inizialmente nessuno).
I libri presenti occupano posizioni consecutive nell'array, a partire dall'indice 0 fino all'indice N-1 (dove N = numero di libri presenti). Le posizioni non occupate (dalla posizione N in poi) contengono l'oggetto nullo.

Quando viene acquisito un nuovo libro, questo viene inserito in fondo alla parte di array attualmente usata, cioe' in posizione N (dove N = numero di libri ESCLUSO il nuovo libro da inserire).
Quando viene dismesso un libro, la sua posizione nell'array (sia K) resterebbe libera, creando un "buco" nella parte di array occupata. Per evitare questo, il libro che occupa la posizione N-1 (dove N = numero di libri presenti INCLUSO il vecchio libro da cancellare) viene spostato in posizione K. La posizione da cancellare ora e' N-1, percio' liberandola non si creano buchi nell'array.

Attributi (privati):

Tutti questi attributi sono privati per impedire che vengano modificati in modo incontrollato.

Costruttori:

Metodi (pubblici) che leggono la situazione della biblioteca:

Tutte le informazioni relative al libro si ottengono agendo sull'oggetto restituito da libroPerCodice (dopo aver controllato che non sia null):
Titolo e autore del libri si ottengono accedendo agli attributi pubblici del libro.
Numero di copie del libro totali e prestate si ottengono usando le funzioni della classe LibroInBiblioteca.

Metodi (pubblici) che modificano la situazione della biblioteca:

Lettura e scrittura della biblioteca

Scegliamo di definire noi una sintassi per la biblioteca su file e le relative funzioni di lettura / scrittura.

Sintassi per la biblioteca

I vari elementi sopra elencati sono separati da spazi o ritorni a capo.

Esempio di file biblioteca:

BIBLIO 100
AUT: Publio Virgilio Marone TIT: Eneide NUM: 1 PST: 1
AUT: Dante Alighieri TIT: La Commedia NUM: 2 PST: 0
AUT: Alessandro Manzoni TIT: I Promessi Sposi NUM: 3 PST: 2
AUT: Ludovico Ariosto TIT: Orlando Furioso NUM: 1 PST: 0

Classi per leggere e scrivere biblioteca

BiblioWriter

sorgente.

Metodi pubblici (inclusi i costruttori):

Il main di prova crea una biblioteca, vi mette dei libri e la scrive sul file "pippo.txt".

BiblioReader

sorgente.

Metodi pubblici (inclusi i costruttori):

Il main di prova legge una biblioteca dal file "pippo.txt" e la scrive per verifica su standard output.

Gestione della biblioteca con interfaccia NON grafica

Aggiungiamo alla classe Biblioteca un main che fa le seguenti cose:

  1. Guarda quanti parametri ci sono sulla command line (basta guardare args.length)
  2. Se nessuno, crea biblioteca vuota.
  3. Se almeno uno, lo usa come nome file da cui caricare la biblioteca.
  4. Poi entra in un ciclo infinito (basta scrivere "while (true)") dove ad ogni giro:

Usare le classi BiblioReader e BiblioWriter viste prima per leggere e scrivere la biblioteca da e su file.

Usare la classe MyReader vista in lezione 10 per leggere da standard input. Per semplicita' assumere che autore e titolo siano una sola stringa senza spazi.