Buch- und Benutzermodelle
Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy. Lektion 63 von 70.
Aufgabe
EinfachErweitern wir dein Bibliothekssystem, indem wir die Modelle Book und User mit umfangreicherer Funktionalität ausbauen. Du fügst eine Statusverfolgung für Bücher, Ausleihfunktionen für Benutzer und eine geeignete Kapselung hinzu, 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 über eineId(string), einenTitle(string), einenAuthor(string) undIsAvailable(bool, standardmäßig true) verfügen. Füge die MethodenBorrow()undReturn()hinzu, die den Verfügbarkeitsstatus ändern und eine Meldung zurückgeben, die Erfolg oder Fehlschlag angibt. Wenn jemand versucht, ein nicht verfügbares Buch auszuleihen, gib"{Title} is not available"zurück. Wenn jemand versucht, ein bereits verfügbares Buch zurückzugeben, gib"{Title} was not borrowed"zurück. Erfolgreiche Vorgänge sollten"{Title} has been borrowed"oder"{Title} has been returned"zurückgeben.User.cs: Erweitere deine User-Klasse, damit sie ausgeliehene Bücher verfolgt. FügeName(string),MemberId(int) und eine private Liste zum Speichern der IDs ausgeliehener Bücher hinzu. Füge eine schreibgeschützte EigenschaftBorrowedCounthinzu, die zurückgibt, wie viele Bücher der Benutzer derzeit besitzt. 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 bestimmte 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, wenn es nicht gefunden wurde), sowieGetUserById(int memberId), die entsprechend für Benutzer funktioniert.Program.cs: Führe alles zusammen, indem du Bibliotheksvorgänge 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 Vorgänge
- Für jeden Vorgang:
action|bookId|memberId, wobei action entwederborrowoderreturnist
Gib für jeden Vorgang das Ergebnis der Ausleih- oder Rückgabeaktion aus. Gib nach allen Vorgängen für jeden Benutzer eine Zusammenfassung aus, die seinen Namen und die Anzahl der Bücher zeigt, die er derzeit ausgeliehen hat, und zwar im Format {Name}: {BorrowedCount} book(s).
Wenn die Eingaben beispielsweise folgendermaßen 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|101Die Ausgabe sollte folgendermaßen aussehen:
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 der Vorgang fehlschlägt, als Bob versucht, Clean Code auszuleihen, das Alice bereits besitzt. Nachdem Alice Clean Code zurückgibt, sinkt ihre Anzahl auf 1. Dies zeigt, wie deine Modelle zusammenarbeiten, um die Regeln der Bibliothek 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. EigenschaftenKonstruktorenObjektinitialisiererWiederholung – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbungs-(:)-SyntaxDas „base“-Schlüsselwort„virtual“- und „override“-SchlüsselwörterVersiegelte KlassenDie „object“-BasisklasseWiederholung – Mitarbeiterhierarchie7Erweiterte Funktionen
Überladen von OperatorenIndexer (this[])ToString()-ÜberschreibungErweiterungsmethodenRückblick – Benutzerdefinierte Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterThread-sicheres SingletonFactory-MusterObserver-Muster (Events)Strategy-Muster13Abschließende Herausforderungen
E-Learning-PlattformKomponente für SpielfigurenFahrzeugvermietungsdienst2Eigenschaften & statische Member
Automatisch implementierte EigenschaftenNur lesbare/schreibbare EigenschaftenStatische Felder & MethodenStatische KlassenMember mit Ausdruckskörpern5Polymorphie & Interfaces
Compile- vs. Laufzeit-PolymorphieInterface vs. abstrakte KlasseMehrere InterfacesExplizite InterfacesUpcasting & DowncastingWiederholung – Formenrechner3Klassenarchitektur
Instanz- vs. statische DatenSchlüsselwörter 'readonly' & 'const'Backing FieldsRückblick – Bankkontenverwaltung6Kapselung
ZugriffsmodifikatorenEigenschaften zur KapselungImplementierung der DatenkapselungMuster für UnveränderlichkeitRückblick – Schülerdaten9Variable Argumente
Das Schlüsselwort 'params'Optionale ParameterBenannte ArgumenteMethodenüberladung12Projekt: Bibliothekssystem
ProjektstrukturBuch- und BenutzermodelleLogik des AusleihsystemsLINQ für die SucheKonsolen-UI / AdministrationsoberflächeUnit-Tests (NUnit/xUnit)Übe selbstständig: Online-C#-Compiler