Buch- und Benutzermodelle
Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy — Lektion 63 von 70.
Aufgabe
EinfachLass uns dein Bibliothekssystem erweitern, indem wir die Book- und User-Modelle mit umfangreicheren Funktionalitäten ausstatten. Du wirst eine Statusverfolgung für Bücher, Ausleihfunktionen für Benutzer und eine ordnungsgemäße Kapselung hinzufügen, um deine Daten zu schützen.
Du arbeitest weiterhin mit deiner Struktur aus vier Dateien:
Book.cs: Erweitere deine Book-Klasse um eine eindeutige Kennung und eine Statusverfolgung. Jedes Buch sollte eineId(string), einenTitle(string), einenAuthor(string) und einIsAvailable(bool, Standardwert true) besitzen. Füge die MethodenBorrow()undReturn()hinzu, die den Verfügbarkeitsstatus ändern und eine Nachricht zurückgeben, die den Erfolg oder Fehlschlag anzeigt. Wenn jemand versucht, ein nicht verfügbares Buch auszuleihen, gib"{Title} is not available"zurück. Wenn versucht wird, ein bereits verfügbares Buch zurückzugeben, gib"{Title} was not borrowed"zurück. Erfolgreiche Operationen sollten"{Title} has been borrowed"oder"{Title} has been returned"zurückgeben.User.cs: Erweitere deine User-Klasse, um ausgeliehene Bücher zu verfolgen. FügeName(string),MemberId(int) und eine private Liste zum Speichern von ausgeliehenen Buch-IDs hinzu. Füge eine schreibgeschützte EigenschaftBorrowedCounthinzu, die zurückgibt, wie viele Bücher der Benutzer derzeit hat. Füge die MethodenAddBorrowedBook(string bookId)undRemoveBorrowedBook(string bookId)hinzu, um die ausgeliehenen Bücher des Benutzers zu verwalten. Füge außerdem eine MethodeHasBook(string bookId)hinzu, die true zurückgibt, wenn der Benutzer dieses spezifische Buch ausgeliehen hat.Library.cs: Deine Library-Klasse sollte Sammlungen von Büchern und Benutzern verwalten. Füge die MethodenAddBook(Book book)undRegisterUser(User user)hinzu, um die Bibliothek zu füllen. Füge eine MethodeGetBookById(string id)hinzu, die das Buch mit dieser ID zurückgibt (oder null, falls nicht gefunden), sowieGetUserById(int memberId), die für Benutzer ähnlich funktioniert.Program.cs: Führe alles zusammen, indem du Bibliotheksoperationen basierend auf der Eingabe verarbeitest.
Du erhältst die folgenden Eingaben:
- Name der Bibliothek
- Anzahl der hinzuzufügenden Bücher
- Für jedes Buch:
id|title|author - Anzahl der zu registrierenden Benutzer
- Für jeden Benutzer:
name|memberId - Anzahl der auszuführenden Operationen
- Für jede Operation:
action|bookId|memberId, wobei action entwederborrowoderreturnist
Gib für jede Operation das Ergebnis der Ausleih- oder Rückgabeaktion aus. Gib nach allen Operationen eine Zusammenfassung für jeden Benutzer aus, die seinen Namen zeigt und wie viele Bücher er derzeit ausgeliehen hat, im Format {Name}: {BorrowedCount} book(s).
Wenn die Eingaben beispielsweise wie folgt aussehen:
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|101Sollte die Ausgabe wie folgt sein:
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)Beachte, wie Alice erfolgreich zwei Bücher ausleiht, aber wenn Bob versucht, Clean Code auszuleihen (was Alice bereits hat), schlägt die Operation fehl. Nachdem Alice Clean Code zurückgibt, sinkt ihre Anzahl auf 1. Dies zeigt, wie deine Modelle zusammenarbeiten, um die Bibliotheksregeln durchzusetzen!
Probier es selbst
using System;
using System.Collections.Generic;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// Bibliotheksnamen lesen
string libraryName = Console.ReadLine();
// Eine Library-Instanz mit dem Bibliotheksnamen erstellen
Library library = new Library(libraryName);
// Anzahl der Bücher lesen
int numBooks = Convert.ToInt32(Console.ReadLine());
// Bücher lesen und hinzufügen
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);
}
// Anzahl der Benutzer lesen
int numUsers = Convert.ToInt32(Console.ReadLine());
// Benutzer lesen und registrieren
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);
}
// Anzahl der Operationen lesen
int numOperations = Convert.ToInt32(Console.ReadLine());
// Operationen verarbeiten
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);
}
}
}
// Zusammenfassung für jeden Benutzer ausgeben
foreach (User user in usersList)
{
Console.WriteLine($"{user.Name}: {user.BorrowedCount} book(s)");
}
}
}
}Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienNamespaces & DirektivenEinführung in Klassen & ObjekteDas 'this'-SchlüsselwortMethoden und ParameterFelder vs. EigenschaftenKonstruktorenObjekt-InitialisiererZusammenfassung - Einfacher Taschenrechner4Vererbung
Grundlagen der Vererbung (:) SyntaxDas 'base'-SchlüsselwortVirtual & Override SchlüsselwörterVersiegelte KlassenDie 'object'-BasisklasseZusammenfassung – Mitarbeiter-Hierarchie7Fortgeschrittene Funktionen
OperatorüberladungIndexer (this[])ToString() überschreibenErweiterungsmethodenZusammenfassung - Benutzerdefinierte Liste2Eigenschaften & Statische Member
Automatisch implementierte EigenschaftenRead-Only- & Write-Only-EigenschaftenStatische Felder & MethodenStatische KlassenExpression-Bodied Member5Polymorphismus & Interfaces
Compile- vs. Runtime-PolymorphismusInterface vs. abstrakte KlasseMehrfache InterfacesExplizite InterfacesUpcasting & DowncastingRecap – Shape Calculator3Klassenarchitektur
Instanz- vs. statische Daten'readonly' & 'const' SchlüsselwörterBacking FieldsZusammenfassung - Bankkonto-Manager6Kapselung
ZugriffsmodifikatorenProperties zur KapselungImplementierung von Data HidingImmutability-MusterRückblick – Studierendendaten9Variable Argumente
Das 'params'-SchlüsselwortOptionale ParameterBenannte ArgumenteMethodenüberladung12Projekt: Bibliothekssystem
ProjektstrukturBuch- und BenutzermodelleLogik des AusleihsystemsLINQ für die SucheKonsolen-UI / Admin-InterfaceUnit Testing (NUnit/xUnit)