Logica del sistema di prestito
Fa parte della sezione Programmazione orientata agli oggetti del percorso C# di Coddy. Lezione 64 di 70.
Sfida
FacileDiamo vita al tuo sistema bibliotecario implementando la logica di base per il prestito! Creerai un sistema centralizzato che coordina libri e utenti, applicando le regole della biblioteca, come i limiti di prestito e verificando che i libri possano essere presi in prestito solo quando sono disponibili.
Continuerai a sviluppare la struttura esistente a quattro file:
Book.cs: Mantieni la tua classe Book con le proprietàId,Title,AuthoreIsAvailable, insieme ai metodiBorrow()eReturn()della lezione precedente.User.cs: Mantieni la tua classe User conName,MemberId,BorrowedCounte i metodi per gestire i libri presi in prestito. Aggiungi una costanteMaxBooksimpostata a 3, che rappresenta il numero massimo di libri che un utente può prendere in prestito contemporaneamente. Aggiungi un metodoCanBorrow()che restituisce true solo se l'utente ha preso in prestito meno diMaxBooks.Library.cs: Qui si riunisce la logica del sistema di prestito. La tua classe Library dovrebbe avere raccolte di libri e utenti, oltre a metodi per aggiungerli. Implementa due metodi chiave:BorrowBook(string bookId, int memberId)- Coordina il processo di prestito. Dovrebbe verificare se il libro esiste, se l'utente esiste, se il libro è disponibile e se l'utente può prendere in prestito altri libri. Restituisci messaggi appropriati per ogni caso di errore o di successo.ReturnBook(string bookId, int memberId)- Gestisce le restituzioni verificando che l'utente abbia effettivamente il libro prima di procedere.
Program.cs: Elabora le operazioni della biblioteca e mostra i risultati.
Il tuo metodo BorrowBook dovrebbe restituire questi messaggi in base alla situazione:
Book not found- quando l'ID del libro non esisteUser not found- quando l'ID del membro non esiste{Title} is not available- quando il libro è già stato preso in prestito{Name} has reached the borrowing limit- quando l'utente ha già 3 libri{Name} borrowed {Title}- in caso di prestito completato correttamente
Il tuo metodo ReturnBook dovrebbe restituire:
Book not foundoUser not found- per gli ID non validi{Name} did not borrow {Title}- quando l'utente prova a restituire un libro che non ha{Name} returned {Title}- in caso di restituzione completata correttamente
Riceverai i seguenti input:
- Nome della biblioteca
- Numero di libri, poi ogni libro nel formato
id|title|author - Numero di utenti, poi ogni utente nel formato
name|memberId - Numero di operazioni, poi ogni operazione nel formato
action|bookId|memberId
Stampa il risultato di ogni operazione su una riga separata.
Ad esempio, se gli input sono:
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|101L'output dovrebbe essere:
Alice borrowed The Hobbit
Alice borrowed 1984
Alice borrowed Dune
Alice has reached the borrowing limit
The Hobbit is not available
Alice returned 1984Nota come la classe Library agisca da coordinatrice: convalida tutte le condizioni prima di consentire le operazioni, lasciando che le classi Book e User si concentrino sulle rispettive responsabilità. Questa separazione rende il codice più facile da mantenere e testare!
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
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);
}
// 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]);
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);
}
}
}
}
}
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