Logique du système d'emprunt
Fait partie de la section Programmation Orientée Objet du Journey C# de Coddy. Leçon 64 sur 70.
Défi
FacileDonnons vie à votre système de bibliothèque en implémentant la logique centrale d’emprunt ! Vous allez créer un système centralisé qui coordonne les livres et les utilisateurs, en faisant respecter les règles de la bibliothèque, comme les limites d’emprunt, et en veillant à ce que les livres ne puissent être empruntés que lorsqu’ils sont disponibles.
Vous allez continuer à développer votre structure existante composée de quatre fichiers :
Book.cs: conservez votre classe Book avec ses propriétésId,Title,AuthoretIsAvailable, ainsi que les méthodesBorrow()etReturn()de la leçon précédente.User.cs: conservez votre classe User avecName,MemberId,BorrowedCountet les méthodes de gestion des livres empruntés. Ajoutez une constanteMaxBooksdéfinie à 3, qui représente le nombre maximum de livres qu’un utilisateur peut emprunter à la fois. Ajoutez une méthodeCanBorrow()qui renvoie true uniquement si l’utilisateur a emprunté moins deMaxBooks.Library.cs: c’est ici que la logique de votre système d’emprunt est regroupée. Votre classe Library doit contenir des collections de livres et d’utilisateurs, ainsi que des méthodes pour les ajouter. Implémentez deux méthodes clés :BorrowBook(string bookId, int memberId): coordonne le processus d’emprunt. Elle doit vérifier que le livre existe, que l’utilisateur existe, que le livre est disponible et que l’utilisateur peut emprunter davantage de livres. Renvoyez des messages appropriés pour chaque cas d’échec ou de réussite.ReturnBook(string bookId, int memberId): gère les retours en vérifiant que l’utilisateur possède effectivement le livre avant de traiter le retour.
Program.cs: traitez les opérations de la bibliothèque et affichez les résultats.
Votre méthode BorrowBook doit renvoyer les messages suivants selon la situation :
Book not found- lorsque l’identifiant du livre n’existe pasUser not found- lorsque l’identifiant du membre n’existe pas{Title} is not available- lorsque le livre est déjà emprunté{Name} has reached the borrowing limit- lorsque l’utilisateur possède déjà 3 livres{Name} borrowed {Title}- en cas d’emprunt réussi
Votre méthode ReturnBook doit renvoyer :
Book not foundouUser not found- pour les identifiants invalides{Name} did not borrow {Title}- lorsque l’utilisateur tente de retourner un livre qu’il ne possède pas{Name} returned {Title}- en cas de retour réussi
Vous recevrez les entrées suivantes :
- Le nom de la bibliothèque
- Le nombre de livres, puis chaque livre au format
id|title|author - Le nombre d’utilisateurs, puis chaque utilisateur au format
name|memberId - Le nombre d’opérations, puis chaque opération au format
action|bookId|memberId
Affichez le résultat de chaque opération sur sa propre ligne.
Par exemple, si les entrées sont :
Central Library
4
B001|The Hobbit|Tolkien
B002|1984|Orwell
B003|Dune|Herbert
B004|Foundation|Asimov
2
Alice|101
Bob|102
6
borrow|B001|101
borrow|B002|101
borrow|B003|101
borrow|B004|101
borrow|B001|102
return|B002|101La sortie doit être :
Alice borrowed The Hobbit
Alice borrowed 1984
Alice borrowed Dune
Alice has reached the borrowing limit
The Hobbit is not available
Alice returned 1984Remarquez comment la classe Library joue le rôle de coordinatrice : elle valide toutes les conditions avant d’autoriser les opérations, laissant ainsi vos classes Book et User se concentrer sur leurs propres responsabilités. Cette séparation rend votre code plus facile à maintenir et à tester !
Essayez vous-même
using System;
using System.Collections.Generic;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// Lire le nom de la bibliothèque
string libraryName = Console.ReadLine();
// Créer une instance de Library avec le nom de la bibliothèque
Library library = new Library(libraryName);
// Lire le nombre de livres
int numBooks = Convert.ToInt32(Console.ReadLine());
// Lire et ajouter des livres
for (int i = 0; i < numBooks; i++)
{
string bookInput = Console.ReadLine();
string[] bookParts = bookInput.Split('|');
string bookId = bookParts[0];
string bookTitle = bookParts[1];
string bookAuthor = bookParts[2];
Book book = new Book(bookId, bookTitle, bookAuthor);
library.AddBook(book);
}
// Lire le nombre d'utilisateurs
int numUsers = Convert.ToInt32(Console.ReadLine());
// Lire et enregistrer des utilisateurs
for (int i = 0; i < numUsers; i++)
{
string userInput = Console.ReadLine();
string[] userParts = userInput.Split('|');
string userName = userParts[0];
int memberId = Convert.ToInt32(userParts[1]);
User user = new User(userName, memberId);
library.RegisterUser(user);
}
// Lire le nombre d'opérations
int numOperations = Convert.ToInt32(Console.ReadLine());
// Traiter les opérations
for (int i = 0; i < numOperations; i++)
{
string operationInput = Console.ReadLine();
string[] opParts = operationInput.Split('|');
string action = opParts[0];
string bookId = opParts[1];
int memberId = Convert.ToInt32(opParts[2]);
if (action == "borrow")
{
string result = library.BorrowBook(bookId, memberId);
Console.WriteLine(result);
}
else if (action == "return")
{
string result = library.ReturnBook(bookId, memberId);
Console.WriteLine(result);
}
}
}
}
}
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesEspaces de noms et directivesIntro aux classes et objetsLe mot-clé 'this'Méthodes et paramètresChamps vs PropriétésConstructeursInitialiseurs d'objetsRécapitulatif - Calculatrice simple4Héritage
Syntaxe de base de l'héritage (:)Le mot-clé 'base'Mots-clés Virtual & OverrideClasses scelléesLa classe de base 'object'Récapitulatif - Hiérarchie des employés7Fonctionnalités avancées
Surcharge d'opérateursIndexeurs (this[])Redéfinition de ToString()Méthodes d'extensionRécapitulatif - Liste personnalisée10Patrons de conception - Partie 1
Introduction aux patrons de conceptionSingleton Thread-SafePatron FabriquePatron Observateur (Événements)Patron Stratégie2Propriétés et membres statiques
Propriétés auto-implémentéesPropriétés en lecture/écriture seuleChamps et méthodes statiquesClasses statiquesMembres à corps d'expression5Polymorphisme & Interfaces
Polymorphisme : Compilation vs ExécutionInterface vs Classe AbstraiteInterfaces MultiplesInterfaces ExplicitesUpcasting & DowncastingRécapitulatif - Calculateur de Formes8Concepts avancés de la POO
Composition plutôt qu'héritageGénériques (Classes et Méthodes)Délégués et ÉvénementsAttributs et RéflexionIDisposable et l'instruction usingBases de l'Injection de Dépendances11Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode TemplatePatron ÉtatPatron Composite3Architecture des classes
Données d'instance vs statiquesMots-clés 'readonly' & 'const'Champs de supportRécapitulatif - Gestionnaire de compte bancaire6Encapsulation
Modificateurs d'accèsPropriétés pour l'encapsulationImplémentation du masquage de donnéesPatterns d'immuabilitéRécapitulatif - Dossiers d'étudiants12Projet : Système de gestion de bibliothèque
Structure du projetModèles Livre et UtilisateurLogique du système d'empruntLINQ pour la rechercheInterface Console / Interface d'administrationTests unitaires (NUnit/xUnit)Entraînez-vous par vous-même : Compilateur C# en ligne