Test e integrazione
Fa parte della sezione Programmazione orientata agli oggetti del percorso Java di Coddy. Lezione 83 di 87.
Sfida
FacileCongratulazioni per aver creato il tuo sistema di gestione bibliotecaria! È ora di mettere tutto insieme e verificare che tutti i componenti funzionino correttamente come sistema integrato. Creerai uno scenario di test completo che metterà alla prova tutte le funzionalità sviluppate nel corso di questo progetto.
Lavorerai con tutti e sette i file del sistema completato:
Book.java: la tua classe Book con isbn, title, author, isAvailable, borrowedBy e tutti i metodi associati, inclusogetDetails().User.java: la tua classe User con id, name, la lista borrowedBooks e i metodi per prendere in prestito e restituire libri.LibraryException.java: la tua classe base per le eccezioni personalizzate.BookNotAvailableException.java: la tua eccezione per i libri non disponibili.LibraryAdmin.java: la tua interfaccia amministrativa e l'implementazione di AdminService.Library.java: la tua classe Library completa con tutti i metodi: aggiunta e rimozione di libri, registrazione degli utenti, prestito e restituzione, ricerca e gestione delle eccezioni.Main.java: il tuo test di integrazione, che dimostrerà il funzionamento dell'intero sistema.
Nella tua classe Main, elaborerai una serie di comandi che testano tutte le funzionalità principali del sistema bibliotecario. I comandi sono forniti come un'unica stringa separata da virgole, nei seguenti formati:
ADD_BOOK:isbn:title:author- Aggiungi un libro tramite AdminServiceREGISTER_USER:id:name- Registra un utente tramite AdminServiceBORROW:userId:isbn- Prendi in prestito un libro (con gestione delle eccezioni)RETURN:userId:isbn- Restituisci un libroSEARCH_TITLE:keyword- Cerca libri per titoloSEARCH_AUTHOR:keyword- Cerca libri per autoreREMOVE_BOOK:isbn- Rimuovi un libro tramite AdminService
Elabora ogni comando e stampa l'output appropriato:
- ADD_BOOK:
Added: [title] - REGISTER_USER:
Registered: [name] - BORROW: stampa il messaggio di successo oppure
Error: [exception message] - RETURN:
[userName] returned [bookTitle] - SEARCH_TITLE: stampa
Search '[keyword]':seguito dai dettagli di ogni libro corrispondente, oppureNo results - SEARCH_AUTHOR: stesso formato della ricerca per titolo
- REMOVE_BOOK:
Removed: [isbn]oppureCannot remove: [isbn]
Dopo tutti i comandi, stampa un riepilogo finale:
--- Final Status ---Books: [count]Users: [count]- Per ogni utente, stampa
[name]: [borrowedCount] book(s)
Riceverai un input: la stringa di comandi separati da virgole.
Ad esempio, con l'input ADD_BOOK:ISBN-001:Clean Code:Robert Martin,ADD_BOOK:ISBN-002:Effective Java:Joshua Bloch,REGISTER_USER:U001:Alice,REGISTER_USER:U002:Bob,BORROW:U001:ISBN-001,BORROW:U002:ISBN-001,SEARCH_TITLE:java,RETURN:U001:ISBN-001,REMOVE_BOOK:ISBN-001, l'output sarà:
Added: Clean Code
Added: Effective Java
Registered: Alice
Registered: Bob
Alice borrowed Clean Code
Error: Book not available: ISBN-001
Search 'java':
[ISBN-002] Effective Java by Joshua Bloch
Alice returned Clean Code
Removed: ISBN-001
--- Final Status ---
Books: 1
Users: 2
Alice: 0 book(s)
Bob: 0 book(s)Questa sfida finale verifica che tutti i componenti, le classi, le interfacce, le eccezioni e la logica della biblioteca funzionino insieme senza problemi. Hai creato un sistema di gestione bibliotecaria completo e robusto!
Provalo tu
import java.util.Scanner;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Leggi i comandi separati da virgole
String input = scanner.nextLine();
String[] commands = input.split(",");
// Crea Library e AdminService
Library library = new Library();
AdminService adminService = new AdminService(library);
// Elabora ogni comando
for (String command : commands) {
String[] parts = command.split(":");
String operation = parts[0];
if (operation.equals("ADD_BOOK")) {
String isbn = parts[1];
String title = parts[2];
String author = parts[3];
if (adminService.addBook(isbn, title, author)) {
System.out.println("Added: " + title);
}
} else if (operation.equals("REMOVE_BOOK")) {
String isbn = parts[1];
if (adminService.removeBook(isbn)) {
System.out.println("Removed: " + isbn);
} else {
System.out.println("Cannot remove: " + isbn);
}
} else if (operation.equals("REGISTER_USER")) {
String id = parts[1];
String name = parts[2];
if (adminService.registerUser(id, name)) {
System.out.println("Registered: " + name);
}
} else if (operation.equals("BORROW")) {
String userId = parts[1];
String isbn = parts[2];
try {
String result = library.borrowBook(userId, isbn);
System.out.println(result);
} catch (LibraryException e) {
System.out.println("Error: " + e.getMessage());
}
}
// TODO: Aggiungi la gestione del comando RETURN
// TODO: Aggiungi la gestione del comando SEARCH_TITLE
// TODO: Aggiungi la gestione del comando SEARCH_AUTHOR
}
// TODO: Stampa lo stato finale
// --- Final Status ---
// Libri: [count]
// Utenti: [count]
// Per ogni utente: [name]: [borrowedCount] libro/i
System.out.println("Operations completed");
}
}
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione a oggetti
File esterniIntroduzione alla programmazione a oggettiClassi e oggettiLa parola chiave thisMetodiCampi (attributi)Metodo costruttoreSovraccarico dei costruttoriRipasso - Calcolatrice semplice4Ereditarietà
Ereditarietà di base (extends)La parola chiave superSovrascrittura dei metodi (@Override)Concatenamento dei costruttoriLa classe ObjectEreditarietà singola e multilivelloPerché non esiste l'ereditarietà multipla delle classiRiepilogo: gerarchia dei dipendenti7Metodi speciali e classe Object
Metodo toString()equals() e hashCode()Metodo clone()compareTo() e ComparableInterfaccia ComparatorRiepilogo - Ordinamento personalizzato10Gestione delle eccezioni in OOP
Gerarchia delle classi di eccezioneEccezioni personalizzateEccezioni controllate e non controllatePattern try-with-resourcesRiepilogo - Utente validato13Progetto: Gestione della biblioteca
Panoramica del progetto e progettazione UMLClassi Libro e UtenteSistema di prestitoFunzionalità di ricercaInterfaccia amministratoreIntegrazione della gestione delle eccezioniTest e integrazione2Modificatori di accesso e incapsulamento
Panoramica dei livelli di accessoMetodi getter e setterNascondimento delle informazioniLa parola chiave finalRiepilogo - Gestore di conti bancari5Polimorfismo
Nozioni di base sull'overloading dei metodiOverride dei metodi (a runtime)Upcasting e downcastingL'operatore instanceofClassi e metodi astrattiRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàAggregazione vs composizioneClassi interne, annidate e anonimeEnum e metodi degli EnumRecord (Java 16+)Classi sealed (Java 17+)11Modelli di progettazione Parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern BuilderPattern ObserverPattern Strategy3Proprietà di classe e membri statici
Variabili di istanza e staticheMetodi staticiBlocchi staticiCostanti (static final)Riepilogo - Contatore e utility6Interfacce e classi astratte
Introduzione alle interfacceImplementazione delle interfacceImplementazione di più interfacceMetodi default e static nelle interfacceClassi astratte e interfacce a confrontoInterfacce funzionaliRiepilogo: sistema di pagamento9Tipi generici
Introduzione ai tipi genericiClassi genericheMetodi genericiParametri di tipo con limitiCaratteri jolly (?, extends, super)Riepilogo - Contenitore generico12Modelli di progettazione – Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern IteratorEsercitati da solo: Compilatore Java online