Modèles Livre et Utilisateur
Fait partie de la section Programmation Orientée Objet du Journey C# de Coddy. Leçon 63 sur 70.
Défi
FacileDéveloppons votre système de bibliothèque en enrichissant les modèles Book et User avec davantage de fonctionnalités. Vous ajouterez le suivi de l'état des livres, la possibilité d'emprunter des livres pour les utilisateurs et un encapsulage approprié pour protéger vos données.
Vous continuerez à travailler avec votre structure composée de quatre fichiers :
Book.cs: améliorez votre classe Book avec un identifiant unique et un suivi de l'état. Chaque livre doit avoir unId(string), unTitle(string), unAuthor(string) et unIsAvailable(bool, défini par défaut sur true). Ajoutez les méthodesBorrow()etReturn()qui modifient l'état de disponibilité et renvoient un message indiquant la réussite ou l'échec. Si quelqu'un essaie d'emprunter un livre indisponible, renvoyez"{Title} is not available". S'il essaie de rendre un livre déjà disponible, renvoyez"{Title} was not borrowed". Les opérations réussies doivent renvoyer"{Title} has been borrowed"ou"{Title} has been returned".User.cs: développez votre classe User pour suivre les livres empruntés. IncluezName(string),MemberId(int) et une liste privée permettant de stocker les identifiants des livres empruntés. Ajoutez une propriété en lecture seuleBorrowedCountqui renvoie le nombre de livres que l'utilisateur possède actuellement. Incluez les méthodesAddBorrowedBook(string bookId)etRemoveBorrowedBook(string bookId)pour gérer les livres empruntés par l'utilisateur. Ajoutez également une méthodeHasBook(string bookId)qui renvoie true si l'utilisateur a emprunté ce livre spécifique.Library.cs: votre classe Library doit gérer des collections de livres et d'utilisateurs. Incluez les méthodesAddBook(Book book)etRegisterUser(User user)pour remplir la bibliothèque. Ajoutez une méthodeGetBookById(string id)qui renvoie le livre correspondant à cet identifiant (ou null s'il n'est pas trouvé), ainsi qu'une méthodeGetUserById(int memberId)qui fonctionne de manière similaire pour les utilisateurs.Program.cs: rassemblez tous les éléments en traitant les opérations de la bibliothèque à partir des entrées.
Vous recevrez les entrées suivantes :
- Nom de la bibliothèque
- Nombre de livres à ajouter
- Pour chaque livre :
id|title|author - Nombre d'utilisateurs à inscrire
- Pour chaque utilisateur :
name|memberId - Nombre d'opérations à effectuer
- Pour chaque opération :
action|bookId|memberId, où action est soitborrow, soitreturn
Pour chaque opération, affichez le résultat de l'action d'emprunt ou de retour. Après toutes les opérations, affichez un résumé pour chaque utilisateur indiquant son nom et le nombre de livres qu'il a actuellement empruntés, au format {Name}: {BorrowedCount} book(s).
Par exemple, si les entrées sont les suivantes :
Downtown Library
2
B001|Clean Code|Robert Martin
B002|Design Patterns|Gang of Four
2
Alice|101
Bob|102
4
borrow|B001|101
borrow|B002|101
borrow|B001|102
return|B001|101La sortie devrait être :
Clean Code has been borrowed
Design Patterns has been borrowed
Clean Code is not available
Clean Code has been returned
Alice: 1 book(s)
Bob: 0 book(s)Remarquez qu'Alice emprunte deux livres avec succès, mais lorsque Bob essaie d'emprunter Clean Code (qu'Alice possède déjà), l'opération échoue. Après qu'Alice a rendu Clean Code, son nombre de livres empruntés passe à 1. Cela montre comment vos modèles fonctionnent ensemble pour faire respecter les règles de la bibliothèque !
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 les 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 les utilisateurs
List<User> usersList = new List<User>();
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);
usersList.Add(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]);
Book book = library.GetBookById(bookId);
User user = library.GetUserById(memberId);
if (action == "borrow")
{
string result = book.Borrow();
Console.WriteLine(result);
if (result.Contains("has been borrowed"))
{
user.AddBorrowedBook(bookId);
}
}
else if (action == "return")
{
string result = book.Return();
Console.WriteLine(result);
if (result.Contains("has been returned"))
{
user.RemoveBorrowedBook(bookId);
}
}
}
// Afficher le résumé pour chaque utilisateur
foreach (User user in usersList)
{
Console.WriteLine($"{user.Name}: {user.BorrowedCount} book(s)");
}
}
}
}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