Laboratorio Java: file e serializzazione. ‘Gestione autonoleggio’

Descrizione del progetto

Si vuole realizzare un programma in Java per la gestione del noleggio dei veicoli di un autonoleggio. Tra i dati che devono essere registrati di ogni veicolo, ci sono: un codice identificativo, la marca della casa costruttrice, il modello, il numero di posti, la targa. In particolare si richiede che il codice identificativo sia di tipo numerico e sia gestito dal sistema in auto-incremento ogni volta che un nuovo veicolo viene aggiunto all’autonoleggio. I veicoli da gestire sono una cinquantina. Quando un veicolo viene noleggiato bisogna registrare i dati del noleggio comprensivi dei dati del cliente che ha effettuato il noleggio e del veicolo scelto. I noleggi possono essere prenotati in anticipo, con l’indicazione del periodo (date di inizio e di scadenza del noleggio). Per semplificare il problema, supporremo che l’autonoleggio sia interessato a mantenere a sistema le registrazioni dei dati del noleggio e del cliente corrispondente, solo per la durata del noleggio stesso e che, quindi, al rientro nell’autonoleggio del veicolo noleggiato, questi dati debbano essere cancellati dall’applicazione che non potrà così più accedervi. Tuttavia, l’archiviazione persistente dei dati che riguardano ciascun noleggio deve essere realizzata memorizzando i dati in un file di testo nel formato CSV, utilizzando il punto e virgola come carattere delimitatore (ndr. un’introduzione ai file CSV è presente in quest’articolo: link). Ciò renderà lo storico dei noleggi disponibile ad  applicazioni esterne, quali un foglio di calcolo. L’applicazione, infine, deve permettere di esportare tutti i veicoli dell’autonoleggio e di importarne di nuovi, attraverso un file di testo nel formato CSV. In definitiva, le funzionalità che devono essere disponibili nell’applicazione sono:

  1. Gestione noleggi:
    1. Aggiunta di un nuovo noleggio/prenotazione di un veicolo da parte di un cliente, con cui si registrano le date di inizio e fine noleggio, i dati del cliente e un riferimento al veicolo noleggiato (vincolo progettuale per supposti sviluppi futuri: come riferimento al veicolo utilizzare il codVeicolo piuttosto che il riferimento Java dell’oggetto Veicolo).
    2. Rientro del veicolo nell’autonoleggio, con cui il noleggio corrispondente non risulterà più disponibile per il programma (viene eliminato) e tutti i dati del noleggio (data di inizio, data di scadenza, data in cui il veicolo rientra e i dati del cliente e del veicolo corrispondenti) verranno archiviati in maniera persistente in un file di testo nel formato CSV utilizzando il punto e virgola come carattere delimitatore.
  2. Visualizzazioni:
    1. Visualizzazione dell’elenco di tutti i veicoli che appartengono al parco veicoli dell’autonoleggio.
    2. Visualizzazione dell’elenco di tutti i veicoli disponibili per il noleggio in un periodo di tempo indicato.
    3. Visualizzazione dell’elenco di tutti i noleggi/prenotazioni in corso.
  3. Gestione veicoli:
    1. Aggiunta di un nuovo veicolo al parco veicoli dell’autonoleggio.
    2. Cancellazione di un veicolo dal parco veicoli dell’autonoleggio.
  4. Gestione persistenza su file:
    1. Salvataggio su file di tutti i dati caricati a sistema, in modo che essi possano essere ripristinati all’avvio dell’applicazione.
    2. Importazione dei veicoli da un file CSV, con cui è possibile aggiungere nuovi veicoli al parco dei veicoli dell’autonoleggio.
    3. Esportazione di tutti i veicoli dell’autonoleggio in un file CSV.
  5. Uscita dal programma, con cui tutti i dati del sistema vengono salvati su un file (lo stesso del pungo 4.a).

Soluzione proposta

Diagramma UML delle classi

gestione-autonoleggio

La figura precedente mostra il diagramma UML delle classi per la soluzione che viene qui proposta. Le entità elementari individuate analizzando il problema sono: Veicolo, Cliente e Noleggio. I veicoli che fanno parte dell’autonoleggio (da 0 fino a 100) possono pensarsi aggregati nella classe Autonoleggio. Quest’ultima va a comporre la classe Gestione, la quale si occupa di gestire per l’autonoleggio il modo in cui via via è possibile associare i noleggi con i veicoli e i clienti. Ad esempio, quando si inserirà un nuovo noleggio bisognerà associare ad esso un cliente e un veicolo, verificando che il veicolo richiesto sia disponibile per il noleggio nel periodo indicato. Il main() è contenuto nella classe Gestione, che per questo è stata evidenziata in grassetto, ed è in essa che i noleggi vengono aggregati man mano che vengono istanziati.

Il diagramma riporta anche la navigabilità di ciascuna associazione rappresentata con la freccia che, si ricorda, è il modo in cui esprimere in UML la responsabilità della classe di partenza di fornire un collegamento, ossia un riferimento o comunque un modo, che permetta di raggiungere da un oggetto della classe di partenza gli oggetti ad esso associati della classe di arrivo.

Per la definizione delle associazioni diverse dalle composizioni ed aggregazioni descritte sopra, quelle che legano le classi Noleggio, Veicolo e Cliente, si può trovare che ciascun noleggio si associa ad un cliente e la navigabilità è in un solo verso, quello indicato dalla freccia, in quanto il problema non ci richiede di poter risalire a quali sono i noleggi di un fissato cliente a partire direttamente da Cliente. Ciascun noleggio, infine, deve essere associato ad un solo veicolo e, vale la pena sottolineare, che ciascun veicolo può associarsi a più noleggi, in quanto, potendo i noleggi essere prenotati in anticipo, in ogni momento ciascun veicolo può avere più noleggi ad esso associati (prenotati). Per la navigabilità in un solo verso di questa associazione valgono le stesse considerazioni fatte per Cliente e Noleggio.

Documentazione del progetto e codice sorgente delle classi

Qui sotto sono stati inseriti i link alla documentazione Javadoc e al codice Java dell’intero progetto. I sorgenti di tutte le classi sono stati ampiamente commentati per agevolare la loro comprensione.

Javadoc del progetto Veicolo.java  Cliente.java  Noleggio.java  Autonoleggio.java  Gestione.java  Funzioni.java  TestMenu.java