Logik des Ausleihsystems
Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy. Lektion 64 von 70.
Aufgabe
EinfachBringen wir dein Bibliothekssystem zum Leben, indem wir die zentrale Ausleihlogik implementieren! Du erstellst ein zentralisiertes System, das Bücher und Benutzer koordiniert, Bibliotheksregeln wie Ausleihlimits durchsetzt und sicherstellt, dass Bücher nur ausgeliehen werden können, wenn sie verfügbar sind.
Du baust weiterhin auf deiner bestehenden Struktur aus vier Dateien auf:
Book.cs: Behalte deine Book-Klasse mit den EigenschaftenId,Title,AuthorundIsAvailablesowie den MethodenBorrow()undReturn()aus der vorherigen Lektion bei.User.cs: Behalte deine User-Klasse mitName,MemberId,BorrowedCountund den Methoden zur Verwaltung ausgeliehener Bücher bei. Füge eine auf 3 gesetzte KonstanteMaxBookshinzu, die die maximale Anzahl von Büchern angibt, die ein Benutzer gleichzeitig ausleihen kann. Füge eine MethodeCanBorrow()hinzu, die nur dann true zurückgibt, wenn der Benutzer weniger alsMaxBooksBücher ausgeliehen hat.Library.cs: Hier kommt die Logik deines Ausleihsystems zusammen. Deine Library-Klasse sollte Sammlungen von Büchern und Benutzern sowie Methoden zu deren Hinzufügen enthalten. Implementiere zwei wichtige Methoden:BorrowBook(string bookId, int memberId)– Koordiniert den Ausleihvorgang. Sie sollte prüfen, ob das Buch existiert, ob der Benutzer existiert, ob das Buch verfügbar ist und ob der Benutzer weitere Bücher ausleihen kann. Gib für jeden Fehlerfall oder bei Erfolg eine passende Nachricht zurück.ReturnBook(string bookId, int memberId)– Verarbeitet Rückgaben, indem sie überprüft, ob der Benutzer das Buch tatsächlich ausgeliehen hat, bevor die Rückgabe verarbeitet wird.
Program.cs: Verarbeite Bibliotheksvorgänge und zeige die Ergebnisse an.
Deine Methode BorrowBook sollte je nach Situation diese Nachrichten zurückgeben:
Book not found– wenn die Buch-ID nicht existiertUser not found– wenn die Mitglieds-ID nicht existiert{Title} is not available– wenn das Buch bereits ausgeliehen ist{Name} has reached the borrowing limit– wenn der Benutzer bereits 3 Bücher hat{Name} borrowed {Title}– bei erfolgreicher Ausleihe
Deine Methode ReturnBook sollte Folgendes zurückgeben:
Book not foundoderUser not found– bei ungültigen IDs{Name} did not borrow {Title}– wenn der Benutzer versucht, ein Buch zurückzugeben, das er nicht besitzt{Name} returned {Title}– bei erfolgreicher Rückgabe
Du erhältst die folgenden Eingaben:
- Name der Bibliothek
- Anzahl der Bücher, danach jedes Buch als
id|title|author - Anzahl der Benutzer, danach jeder Benutzer als
name|memberId - Anzahl der Vorgänge, danach jeder Vorgang als
action|bookId|memberId
Gib das Ergebnis jedes Vorgangs in einer eigenen Zeile aus.
Wenn die Eingaben beispielsweise folgendermaßen aussehen:
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|101Die Ausgabe sollte folgendermaßen aussehen:
Alice borrowed The Hobbit
Alice borrowed 1984
Alice borrowed Dune
Alice has reached the borrowing limit
The Hobbit is not available
Alice returned 1984Beachte, wie die Library-Klasse als Koordinator fungiert: Sie überprüft alle Bedingungen, bevor sie Vorgänge zulässt, und hält dadurch deine Book- und User-Klassen auf ihre jeweiligen Verantwortlichkeiten fokussiert. Diese Trennung macht deinen Code leichter zu warten und zu testen!
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
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);
}
// 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]);
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);
}
}
}
}
}
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