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 de prêt principale ! Vous allez créer un système centralisé qui coordonne les livres et les utilisateurs, en appliquant les règles de la bibliothèque comme les limites de prêt et en garantissant que les livres ne peuvent être empruntés que lorsqu'ils sont disponibles.
Vous continuerez à construire sur votre structure existante de quatre fichiers :
Book.cs: Conservez votre classe Book avec les 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 constanteMaxBooksfixée à 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 de prêt se rejoint. Votre classe Library doit avoir 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 de prêt. Elle doit vérifier si le livre existe, si l'utilisateur existe, si le livre est disponible et si l'utilisateur peut emprunter plus de livres. Renvoyez les messages appropriés pour chaque cas d'échec ou de succès.ReturnBook(string bookId, int memberId)- Gère les retours en vérifiant que l'utilisateur possède réellement le livre avant de traiter le retour.
Program.cs: Traite les opérations de la bibliothèque et affiche les résultats.
Votre méthode BorrowBook doit renvoyer ces messages selon la situation :
Book not found- quand l'ID du livre n'existe pasUser not found- quand l'ID du membre n'existe pas{Title} is not available- quand le livre est déjà emprunté{Name} has reached the borrowing limit- quand l'utilisateur a déjà 3 livres{Name} borrowed {Title}- lors d'un prêt réussi
Votre méthode ReturnBook doit renvoyer :
Book not foundouUser not found- pour des IDs invalides{Name} did not borrow {Title}- quand l'utilisateur essaie de rendre un livre qu'il n'a pas{Name} returned {Title}- lors d'un retour réussi
Vous recevrez les entrées suivantes :
- Nom de la bibliothèque
- Nombre de livres, puis chaque livre sous la forme
id|title|author - Nombre d'utilisateurs, puis chaque utilisateur sous la forme
name|memberId - Nombre d'opérations, puis chaque opération sous la forme
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 devrait ê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 agit comme coordinateur - elle valide toutes les conditions avant d'autoriser les opérations, gardant vos classes Book et User concentrées 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 Utilisateur