โ˜• Lezione 15

Progetto Finale - Sistema Gestionale Completo

Progetto Finale: Sistema di Gestione Biblioteca

๐ŸŽฏ Obiettivo del Progetto

Creare un Sistema di Gestione Biblioteca che utilizzi TUTTI i concetti appresi durante il corso:

  • โœ… Classi e Oggetti
  • โœ… Ereditarietร  e Polimorfismo
  • โœ… Interfacce e Classi Astratte
  • โœ… Collezioni (ArrayList, HashMap)
  • โœ… Eccezioni
  • โœ… File I/O
  • โœ… Incapsulamento

๐Ÿ“‹ Specifiche del Progetto

Funzionalitร  richieste:

  1. Gestire libri, riviste e DVD
  2. Aggiungere/rimuovere elementi
  3. Prestiti e restituzioni
  4. Ricerca per titolo/autore
  5. Salvataggio su file
  6. Gestione utenti

๐Ÿ—๏ธ Architettura del Progetto

// ========== INTERFACCE ==========

interface Prestabile {
    boolean prestito(String utente);
    boolean restituzione();
    boolean isDisponibile();
}

// ========== CLASSE ASTRATTA ==========

abstract class ElementoBiblioteca implements Prestabile {
    protected String id;
    protected String titolo;
    protected int anno;
    protected boolean disponibile;
    protected String prestataA;
    
    public ElementoBiblioteca(String id, String titolo, int anno) {
        this.id = id;
        this.titolo = titolo;
        this.anno = anno;
        this.disponibile = true;
        this.prestataA = null;
    }
    
    @Override
    public boolean prestito(String utente) {
        if (disponibile) {
            disponibile = false;
            prestataA = utente;
            return true;
        }
        return false;
    }
    
    @Override
    public boolean restituzione() {
        if (!disponibile) {
            disponibile = true;
            prestataA = null;
            return true;
        }
        return false;
    }
    
    @Override
    public boolean isDisponibile() {
        return disponibile;
    }
    
    public String getId() { return id; }
    public String getTitolo() { return titolo; }
    public int getAnno() { return anno; }
    public String getPrestataA() { return prestataA; }
    
    public abstract String getTipo();
    public abstract String getDettagli();
}

// ========== SOTTOCLASSI ==========

class Libro extends ElementoBiblioteca {
    private String autore;
    private int pagine;
    
    public Libro(String id, String titolo, String autore, int anno, int pagine) {
        super(id, titolo, anno);
        this.autore = autore;
        this.pagine = pagine;
    }
    
    @Override
    public String getTipo() { return "Libro"; }
    
    @Override
    public String getDettagli() {
        return getTipo() + " - " + titolo + " di " + autore + 
               " (" + anno + ") - " + pagine + " pagine";
    }
    
    public String getAutore() { return autore; }
}

class Rivista extends ElementoBiblioteca {
    private int numero;
    private String mese;
    
    public Rivista(String id, String titolo, int numero, String mese, int anno) {
        super(id, titolo, anno);
        this.numero = numero;
        this.mese = mese;
    }
    
    @Override
    public String getTipo() { return "Rivista"; }
    
    @Override
    public String getDettagli() {
        return getTipo() + " - " + titolo + " n." + numero + 
               " (" + mese + " " + anno + ")";
    }
}

class DVD extends ElementoBiblioteca {
    private String regista;
    private int durata;
    
    public DVD(String id, String titolo, String regista, int anno, int durata) {
        super(id, titolo, anno);
        this.regista = regista;
        this.durata = durata;
    }
    
    @Override
    public String getTipo() { return "DVD"; }
    
    @Override
    public String getDettagli() {
        return getTipo() + " - " + titolo + " di " + regista + 
               " (" + anno + ") - " + durata + " min";
    }
}

// ========== GESTIONE BIBLIOTECA ==========

import java.util.*;
import java.io.*;

class Biblioteca {
    private HashMap catalogo;
    private ArrayList storicoOperazioni;
    private String nomeFile;
    
    public Biblioteca(String nomeFile) {
        this.catalogo = new HashMap<>();
        this.storicoOperazioni = new ArrayList<>();
        this.nomeFile = nomeFile;
        caricaDati();
    }
    
    public void aggiungiElemento(ElementoBiblioteca elemento) {
        if (catalogo.containsKey(elemento.getId())) {
            System.out.println("ID giร  esistente!");
            return;
        }
        
        catalogo.put(elemento.getId(), elemento);
        registraOperazione("Aggiunto: " + elemento.getDettagli());
        salvaDati();
        System.out.println("Elemento aggiunto con successo!");
    }
    
    public void rimuoviElemento(String id) {
        ElementoBiblioteca elemento = catalogo.remove(id);
        if (elemento != null) {
            registraOperazione("Rimosso: " + elemento.getDettagli());
            salvaDati();
            System.out.println("Elemento rimosso!");
        } else {
            System.out.println("Elemento non trovato!");
        }
    }
    
    public void prestito(String id, String utente) {
        ElementoBiblioteca elemento = catalogo.get(id);
        if (elemento == null) {
            System.out.println("Elemento non trovato!");
            return;
        }
        
        if (elemento.prestito(utente)) {
            registraOperazione("Prestito: " + elemento.getTitolo() + " a " + utente);
            salvaDati();
            System.out.println("Prestito effettuato!");
        } else {
            System.out.println("Elemento non disponibile!");
        }
    }
    
    public void restituzione(String id) {
        ElementoBiblioteca elemento = catalogo.get(id);
        if (elemento == null) {
            System.out.println("Elemento non trovato!");
            return;
        }
        
        if (elemento.restituzione()) {
            registraOperazione("Restituzione: " + elemento.getTitolo());
            salvaDati();
            System.out.println("Restituzione effettuata!");
        } else {
            System.out.println("Elemento giร  disponibile!");
        }
    }
    
    public void cercaPerTitolo(String titolo) {
        System.out.println("\n=== Risultati Ricerca ===");
        boolean trovato = false;
        
        for (ElementoBiblioteca elemento : catalogo.values()) {
            if (elemento.getTitolo().toLowerCase().contains(titolo.toLowerCase())) {
                stampaElemento(elemento);
                trovato = true;
            }
        }
        
        if (!trovato) {
            System.out.println("Nessun risultato trovato");
        }
    }
    
    public void mostraTutto() {
        if (catalogo.isEmpty()) {
            System.out.println("Catalogo vuoto!");
            return;
        }
        
        System.out.println("\n=== Catalogo Completo ===");
        for (ElementoBiblioteca elemento : catalogo.values()) {
            stampaElemento(elemento);
        }
    }
    
    public void mostraDisponibili() {
        System.out.println("\n=== Elementi Disponibili ===");
        boolean trovato = false;
        
        for (ElementoBiblioteca elemento : catalogo.values()) {
            if (elemento.isDisponibile()) {
                stampaElemento(elemento);
                trovato = true;
            }
        }
        
        if (!trovato) {
            System.out.println("Nessun elemento disponibile");
        }
    }
    
    public void mostraPrestiti() {
        System.out.println("\n=== Elementi in Prestito ===");
        boolean trovato = false;
        
        for (ElementoBiblioteca elemento : catalogo.values()) {
            if (!elemento.isDisponibile()) {
                System.out.println(elemento.getDettagli());
                System.out.println("  โ†’ Prestato a: " + elemento.getPrestataA());
                System.out.println();
                trovato = true;
            }
        }
        
        if (!trovato) {
            System.out.println("Nessun prestito attivo");
        }
    }
    
    public void statistiche() {
        int totale = catalogo.size();
        int disponibili = 0;
        int prestiti = 0;
        
        int numLibri = 0, numRiviste = 0, numDVD = 0;
        
        for (ElementoBiblioteca el : catalogo.values()) {
            if (el.isDisponibile()) disponibili++;
            else prestiti++;
            
            if (el instanceof Libro) numLibri++;
            else if (el instanceof Rivista) numRiviste++;
            else if (el instanceof DVD) numDVD++;
        }
        
        System.out.println("\n=== Statistiche Biblioteca ===");
        System.out.println("Totale elementi: " + totale);
        System.out.println("Disponibili: " + disponibili);
        System.out.println("In prestito: " + prestiti);
        System.out.println("\nPer tipo:");
        System.out.println("  Libri: " + numLibri);
        System.out.println("  Riviste: " + numRiviste);
        System.out.println("  DVD: " + numDVD);
    }
    
    private void stampaElemento(ElementoBiblioteca elemento) {
        System.out.println("ID: " + elemento.getId());
        System.out.println(elemento.getDettagli());
        System.out.println("Stato: " + (elemento.isDisponibile() ? "Disponibile" : "Prestato"));
        if (!elemento.isDisponibile()) {
            System.out.println("Prestato a: " + elemento.getPrestataA());
        }
        System.out.println();
    }
    
    private void registraOperazione(String operazione) {
        String timestamp = new java.util.Date().toString();
        storicoOperazioni.add(timestamp + " - " + operazione);
    }
    
    private void salvaDati() {
        try {
            FileWriter writer = new FileWriter(nomeFile);
            for (ElementoBiblioteca elemento : catalogo.values()) {
                String riga = elemento.getTipo() + ";" + 
                             elemento.getId() + ";" + 
                             elemento.getTitolo() + ";" + 
                             elemento.getAnno() + ";" + 
                             elemento.isDisponibile() + ";" + 
                             (elemento.getPrestataA() != null ? elemento.getPrestataA() : "");
                writer.write(riga + "\n");
            }
            writer.close();
        } catch (IOException e) {
            System.out.println("Errore salvataggio: " + e.getMessage());
        }
    }
    
    private void caricaDati() {
        try {
            File file = new File(nomeFile);
            if (!file.exists()) return;
            
            Scanner scanner = new Scanner(file);
            while (scanner.hasNextLine()) {
                String riga = scanner.nextLine();
                // Parsing semplificato per l'esempio
                // In un progetto reale, ci sarebbe piรน logica qui
            }
            scanner.close();
        } catch (IOException e) {
            System.out.println("Errore caricamento: " + e.getMessage());
        }
    }
}

// ========== MAIN ==========

import java.util.Scanner;

public class SistemaBiblioteca {
    public static void main(String[] args) {
        Biblioteca biblioteca = new Biblioteca("biblioteca.txt");
        Scanner input = new Scanner(System.in);
        
        // Aggiungo dati di esempio
        biblioteca.aggiungiElemento(new Libro("L001", "1984", "George Orwell", 1949, 328));
        biblioteca.aggiungiElemento(new Libro("L002", "Il Signore degli Anelli", "J.R.R. Tolkien", 1954, 1178));
        biblioteca.aggiungiElemento(new Rivista("R001", "Focus", 350, "Gennaio", 2024));
        biblioteca.aggiungiElemento(new DVD("D001", "Inception", "Christopher Nolan", 2010, 148));
        
        while (true) {
            System.out.println("\nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—");
            System.out.println("โ•‘   SISTEMA GESTIONE BIBLIOTECA     โ•‘");
            System.out.println("โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•");
            System.out.println("1. Mostra catalogo completo");
            System.out.println("2. Mostra disponibili");
            System.out.println("3. Mostra prestiti");
            System.out.println("4. Cerca per titolo");
            System.out.println("5. Effettua prestito");
            System.out.println("6. Effettua restituzione");
            System.out.println("7. Aggiungi elemento");
            System.out.println("8. Rimuovi elemento");
            System.out.println("9. Statistiche");
            System.out.println("0. Esci");
            System.out.print("\nScelta: ");
            
            int scelta = input.nextInt();
            input.nextLine();
            
            switch (scelta) {
                case 1:
                    biblioteca.mostraTutto();
                    break;
                case 2:
                    biblioteca.mostraDisponibili();
                    break;
                case 3:
                    biblioteca.mostraPrestiti();
                    break;
                case 4:
                    System.out.print("Titolo da cercare: ");
                    String titolo = input.nextLine();
                    biblioteca.cercaPerTitolo(titolo);
                    break;
                case 5:
                    System.out.print("ID elemento: ");
                    String idPrestito = input.nextLine();
                    System.out.print("Nome utente: ");
                    String utente = input.nextLine();
                    biblioteca.prestito(idPrestito, utente);
                    break;
                case 6:
                    System.out.print("ID elemento: ");
                    String idReso = input.nextLine();
                    biblioteca.restituzione(idReso);
                    break;
                case 7:
                    // Qui andrร  il codice per aggiungere elementi
                    System.out.println("Funzione da implementare");
                    break;
                case 8:
                    System.out.print("ID elemento da rimuovere: ");
                    String idRimosso = input.nextLine();
                    biblioteca.rimuoviElemento(idRimosso);
                    break;
                case 9:
                    biblioteca.statistiche();
                    break;
                case 0:
                    System.out.println("Arrivederci!");
                    input.close();
                    return;
                default:
                    System.out.println("Scelta non valida!");
            }
            
            System.out.print("\nPremi INVIO per continuare...");
            input.nextLine();
        }
    }
}

โœ๏ธ Esercizi di Estensione

Esercizio 1: Menu Aggiunta

FACILE

Completa la funzione "Aggiungi elemento" nel menu principale

Esercizio 2: Date Prestiti

MEDIO

Aggiungi data di prestito e calcola giorni di ritardo

Esercizio 3: Storico Operazioni

MEDIO

Implementa visualizzazione storico operazioni

Esercizio 4: Ricerca Avanzata

DIFFICILE

Aggiungi filtri multipli (tipo, anno, autore, disponibilitร )

Esercizio 5: Report PDF

DIFFICILE

Genera report in formato PDF con statistiche

๐ŸŽฏ Concetti Utilizzati

โœ… Hai usato TUTTO quello che hai imparato!

  • โœ… Classi e Oggetti: Libro, Rivista, DVD, Biblioteca
  • โœ… Ereditarietร : ElementoBiblioteca โ†’ sottoclassi
  • โœ… Polimorfismo: HashMap di ElementoBiblioteca
  • โœ… Interfacce: Prestabile
  • โœ… Classi Astratte: ElementoBiblioteca
  • โœ… Collezioni: HashMap e ArrayList
  • โœ… Eccezioni: try-catch per I/O
  • โœ… File I/O: salvataggio e caricamento
  • โœ… Incapsulamento: private/protected/public

๐Ÿš€ Prossimi Passi

Hai completato il corso! Cosa fare ora?

  • ๐Ÿ“š Rivedi le lezioni per consolidare
  • ๐Ÿ’ป Estendi il progetto con nuove funzionalitร 
  • ๐ŸŽฎ Crea il TUO progetto personale
  • ๐Ÿ“– Studia Java avanzato (thread, networking, GUI)
  • ๐ŸŒ Esplora Spring Boot per applicazioni web
  • ๐Ÿ“ฑ Prova Android per app mobile

๐ŸŽ“ Congratulazioni!

๐Ÿ† HAI COMPLETATO IL CORSO! ๐Ÿ†

Ora sei pronto per sviluppare applicazioni Java complete!

Continua a programmare e sperimentare!
La pratica rende perfetti! ๐Ÿ’ช