Système d'emprunt
Fait partie de la section Programmation Orientée Objet du Journey Java de Coddy — leçon 79 sur 87.
Défi
FacileContinuons à construire le système de gestion de bibliothèque en créant un véritable système d'emprunt avec une classe Library qui gère la collection de livres et d'utilisateurs. C'est ici que votre système commence à ressembler à une vraie bibliothèque : suivre qui possède quoi et appliquer les règles d'emprunt !
Vous organiserez votre code sur quatre fichiers :
Book.java: Conservez votre classe Book du défi précédent avec toutes ses fonctionnalités — isbn, title, author, isAvailable, borrowedBy, getDetails(), et les getters/setters appropriés.User.java: Conservez votre classe User avec id, name, l'ArrayList borrowedBooks, borrowBook(), returnBook(), getBorrowedCount(), et toString().Library.java: Créez la classe centraleLibraryqui gère tout. Votre bibliothèque doit maintenir deux ArrayLists — une pour les objetsBooket une pour les objetsUser. Incluez ces méthodes :addBook(Book book)- ajoute un livre à la collection de la bibliothèque.registerUser(User user)- ajoute un utilisateur aux utilisateurs enregistrés de la bibliothèque.findBookByIsbn(String isbn)- parcourt les livres et retourne le Book avec l'ISBN correspondant, ounulls'il n'est pas trouvé.findUserById(String id)- parcourt les utilisateurs et retourne l'User avec l'ID correspondant, ounulls'il n'est pas trouvé.borrowBook(String userId, String isbn)- trouve l'utilisateur et le livre, puis si les deux existent et que le livre est disponible, fait emprunter le livre par l'utilisateur et affiche[userName] borrowed [bookTitle]. Si le livre n'est pas disponible, afficheBook not available. Si l'utilisateur ou le livre n'est pas trouvé, afficheInvalid user or book.returnBook(String userId, String isbn)- trouve l'utilisateur et le livre, puis fait retourner le livre par l'utilisateur et affiche[userName] returned [bookTitle]. Si l'utilisateur ou le livre n'est pas trouvé, afficheInvalid user or book.Main.java: Rassemblez votre système de bibliothèque ! Vous recevrez des entrées pour deux livres (ISBN, titre, auteur pour chacun), un utilisateur (ID, nom), puis une série d'opérations.Créez une Library, ajoutez les deux livres et enregistrez l'utilisateur. Traitez ensuite les opérations — vous recevrez une chaîne de caractères séparée par des virgules où chaque opération est formatée comme
borrow:userId:isbnoureturn:userId:isbn.Après avoir traité toutes les opérations, affichez un résumé montrant le statut de chaque livre au format
[isbn]: [Available/Borrowed].
Vous recevrez les entrées dans cet ordre : book1 ISBN, book1 title, book1 author, book2 ISBN, book2 title, book2 author, user ID, user name, et enfin la chaîne des opérations.
Par exemple, avec les entrées ISBN-001, Clean Code, Robert Martin, ISBN-002, Design Patterns, Gang of Four, U001, Alice, et borrow:U001:ISBN-001,borrow:U001:ISBN-002,return:U001:ISBN-001, votre sortie serait :
Alice borrowed Clean Code
Alice borrowed Design Patterns
Alice returned Clean Code
ISBN-001: Available
ISBN-002: BorrowedCe défi rassemble la composition, l'encapsulation et la conception de méthodes pour créer un système cohérent. La classe Library agit comme un coordinateur, déléguant la logique d'emprunt réelle aux classes User et Book tout en gérant l'ensemble de la collection !
Essayez vous-même
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Lire les informations du livre 1
String isbn1 = scanner.nextLine();
String title1 = scanner.nextLine();
String author1 = scanner.nextLine();
// Lire les informations du livre 2
String isbn2 = scanner.nextLine();
String title2 = scanner.nextLine();
String author2 = scanner.nextLine();
// Lire les informations de l'utilisateur
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// Lire la chaîne des opérations (séparées par des virgules, format : borrow:userId:isbn ou return:userId:isbn)
String operationsStr = scanner.nextLine();
// TODO: Créer des objets Book pour book1 et book2
// TODO: Créer un objet User
// TODO: Créer une Library, ajouter les deux livres et enregistrer l'utilisateur
// TODO: Diviser operationsStr par "," et traiter chaque opération
// Pour chaque opération, diviser par ":" pour obtenir action, userId, isbn
// Appeler library.borrowBook() ou library.returnBook() en conséquence
// TODO: Afficher le résumé pour chaque livre au format "[isbn]: [Available/Borrowed]"
}
}Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé thisMéthodesChamps (Attributs)Méthode constructeurSurcharge de constructeurRécapitulatif - Calculatrice simple4Héritage
Héritage de base (extends)Le mot-clé superRedéfinition de méthode (@Override)Chaînage de constructeursLa classe ObjectHéritage simple et multiniveauPourquoi pas d'héritage multiple de classesRécapitulatif - Hiérarchie des employés7Méthodes spéciales et classe Object
Méthode toString()equals() et hashCode()Méthode clone()compareTo() et ComparableInterface ComparatorRécapitulatif - Tri personnalisé10Gestion des exceptions en POO
Hiérarchie des classes d'exceptionExceptions personnaliséesErreurs Checked vs UncheckedPattern Try-with-resourcesRécapitulatif - Utilisateur validé13Projet : Gestion de bibliothèque
Présentation du projet et conception UMLClasses Livre et Utilisateur2Modificateurs d'accès et Encapsulation
Aperçu des niveaux d'accèsMéthodes Getter et SetterMasquage d'informationsLe mot-clé finalRécapitulatif - Gestionnaire de compte bancaire5Polymorphisme
Bases de la surcharge de méthodesRedéfinition de méthodes (Run-Time)Upcasting et DowncastingL'opérateur instanceofClasses et méthodes abstraitesRécapitulatif - Calculateur de formes8Concepts avancés de la POO
Composition vs HéritageAgrégation vs CompositionClasses internes, imbriquées et anonymesEnums et méthodes d'EnumRecords (Java 16+)Classes scellées (Java 17+)11Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron MonteurPatron ObservateurPatron Stratégie3Propriétés de classe et membres statiques
Variables d'instance vs variables statiquesMéthodes statiquesBlocs statiquesConstantes (static final)Récapitulatif - Compteur et utilitaire6Interfaces et Classes Abstraites
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesDefault et Static dans les InterfacesClasses Abstraites vs InterfacesInterfaces FonctionnellesRécapitulatif - Système de Paiement9La généricité
Introduction à la généricitéClasses génériquesMéthodes génériquesParamètres de type bornésWildcards (?, extends, super)Récapitulatif - Conteneur générique12Patrons de conception, partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Template MethodPatron ÉtatPatron CompositePatron Itérateur