Modelli di libri e utenti
Fa parte della sezione Programmazione orientata agli oggetti del percorso C# di Coddy. Lezione 63 di 70.
Sfida
FacileEspandiamo il tuo sistema bibliotecario arricchendo i modelli Book e User con funzionalità più complete. Aggiungerai il monitoraggio dello stato dei libri, la possibilità per gli utenti di prenderli in prestito e un'adeguata incapsulazione per proteggere i tuoi dati.
Continuerai a lavorare con la struttura composta da quattro file:
Book.cs: potenzia la tua classe Book con un identificatore univoco e il monitoraggio dello stato. Ogni libro dovrebbe avere unId(string), unTitle(string), unAuthor(string) e unIsAvailable(bool, con valore predefinito true). Aggiungi i metodiBorrow()eReturn(), che modificano lo stato di disponibilità e restituiscono un messaggio che indica se l'operazione è riuscita o meno. Se qualcuno prova a prendere in prestito un libro non disponibile, restituisci"{Title} is not available". Se prova a restituire un libro già disponibile, restituisci"{Title} was not borrowed". Le operazioni riuscite dovrebbero restituire"{Title} has been borrowed"oppure"{Title} has been returned".User.cs: espandi la tua classe User per tenere traccia dei libri presi in prestito. IncludiName(string),MemberId(int) e un elenco privato in cui memorizzare gli ID dei libri presi in prestito. Aggiungi una proprietà di sola letturaBorrowedCountche restituisca il numero di libri attualmente in possesso dell'utente. Includi i metodiAddBorrowedBook(string bookId)eRemoveBorrowedBook(string bookId)per gestire i libri presi in prestito dall'utente. Aggiungi anche un metodoHasBook(string bookId)che restituisca true se l'utente ha preso in prestito quel libro specifico.Library.cs: la tua classe Library dovrebbe mantenere raccolte di libri e utenti. Includi i metodiAddBook(Book book)eRegisterUser(User user)per popolare la biblioteca. Aggiungi un metodoGetBookById(string id)che restituisca il libro con quell'ID (oppure null se non viene trovato) e un metodoGetUserById(int memberId)che funzioni allo stesso modo per gli utenti.Program.cs: riunisci tutte le parti elaborando le operazioni della biblioteca in base all'input.
Riceverai i seguenti input:
- Nome della biblioteca
- Numero di libri da aggiungere
- Per ogni libro:
id|title|author - Numero di utenti da registrare
- Per ogni utente:
name|memberId - Numero di operazioni da eseguire
- Per ogni operazione:
action|bookId|memberId, dove action èborrowoppurereturn
Per ogni operazione, stampa il risultato dell'azione di prestito o restituzione. Al termine di tutte le operazioni, stampa un riepilogo per ogni utente, indicando il suo nome e quanti libri ha attualmente preso in prestito, nel formato {Name}: {BorrowedCount} book(s).
Ad esempio, se gli input sono:
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|101L'output dovrebbe essere:
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)Nota come Alice riesca a prendere in prestito due libri, ma quando Bob prova a prendere in prestito Clean Code (che Alice ha già preso), l'operazione fallisce. Dopo che Alice restituisce Clean Code, il suo conteggio scende a 1. Questo dimostra come i tuoi modelli collaborano per far rispettare le regole della biblioteca!
Provalo tu
using System;
using System.Collections.Generic;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// Leggi il nome della biblioteca
string libraryName = Console.ReadLine();
// Crea un'istanza di Library con il nome della biblioteca
Library library = new Library(libraryName);
// Leggi il numero di libri
int numBooks = Convert.ToInt32(Console.ReadLine());
// Leggi e aggiungi i libri
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);
}
// Leggi il numero di utenti
int numUsers = Convert.ToInt32(Console.ReadLine());
// Leggi e registra gli utenti
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);
}
// Leggi il numero di operazioni
int numOperations = Convert.ToInt32(Console.ReadLine());
// Elabora le operazioni
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);
}
}
}
// Stampa un riepilogo per ogni utente
foreach (User user in usersList)
{
Console.WriteLine($"{user.Name}: {user.BorrowedCount} book(s)");
}
}
}
}Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniNamespace e direttiveIntroduzione a classi e oggettiLa parola chiave "this"Metodi e parametriCampi e proprietàCostruttoriInizializzatori di oggettiRiepilogo - Calcolatrice semplice4Ereditarietà
Sintassi di base dell'ereditarietà (:)La parola chiave 'base'Parole chiave virtual e overrideClassi sealedLa classe base 'object'Riepilogo - Gerarchia dei dipendenti7Funzionalità avanzate
Sovraccarico degli operatoriIndicizzatori (this[])Override di ToString()Metodi di estensioneRiepilogo - Lista personalizzata10Pattern di progettazione Parte 1
Introduzione ai pattern di progettazioneSingleton thread-safePattern FactoryPattern Observer (eventi)Pattern Strategy2Proprietà e membri statici
Proprietà implementate automaticamenteProprietà di sola lettura e di sola scritturaCampi e metodi staticiClassi staticheMembri con corpo di espressione5Polimorfismo e interfacce
Polimorfismo a compile time e runtimeInterfaccia o classe astrattaInterfacce multipleInterfacce espliciteUpcasting e downcastingRipasso: calcolatore di forme8Concetti avanzati di programmazione a oggetti
Composizione invece dell'ereditarietàTipi generici (classi e metodi)Delegati ed eventiAttributi e reflectionIDisposable e istruzione usingNozioni di base sull'iniezione delle dipendenze11Pattern di progettazione, parte 2
Pattern del ComandoPattern dell’AdattatorePattern del DecoratorePattern Template MethodPattern dello StatoPattern Composito3Architettura delle classi
Dati di istanza vs staticiParole chiave 'readonly' e 'const'Campi di supportoRiepilogo - Gestore di conti bancari6Incapsulamento
Modificatori di accessoProprietà per l'incapsulamentoImplementazione dell'occultamento dei datiModelli di immutabilitàRiepilogo - Registri degli studenti9Argomenti variabili
La parola chiave 'params'Parametri opzionaliArgomenti con nomeOverloading dei metodi12Progetto: Sistema bibliotecario
Struttura del progettoModelli di libri e utentiLogica del sistema di prestitoRicerca con LINQInterfaccia console / interfaccia amministratoreTest unitari (NUnit/xUnit)Esercitati da solo: Compilatore C# online