Logika systemu wypożyczeń
Część sekcji Programowanie obiektowe ścieżki C# w Coddy. Lekcja 64 z 70.
Wyzwanie
ŁatwyOżywmy Twój system biblioteczny, implementując podstawową logikę wypożyczania! Utworzysz scentralizowany system, który koordynuje działanie książek i użytkowników, egzekwuje zasady biblioteki, takie jak limity wypożyczeń, oraz pilnuje, by książki można było wypożyczać tylko wtedy, gdy są dostępne.
Będziesz kontynuować pracę nad istniejącą strukturą złożoną z czterech plików:
Book.cs: Zachowaj klasę Book z właściwościamiId,Title,AuthoriIsAvailableoraz metodamiBorrow()iReturn()z poprzedniej lekcji.User.cs: Zachowaj klasę User z właściwościamiName,MemberId,BorrowedCountoraz metodami zarządzającymi wypożyczonymi książkami. Dodaj stałąMaxBookso wartości 3, która określa maksymalną liczbę książek, jakie użytkownik może wypożyczyć jednocześnie. Dodaj metodęCanBorrow(), która zwraca true tylko wtedy, gdy użytkownik wypożyczył mniej niżMaxBooksksiążek.Library.cs: To tutaj łączy się logika systemu wypożyczeń. Klasa Library powinna zawierać kolekcje książek i użytkowników oraz metody ich dodawania. Zaimplementuj dwie kluczowe metody:BorrowBook(string bookId, int memberId)- koordynuje proces wypożyczania. Powinna sprawdzać, czy książka istnieje, czy użytkownik istnieje, czy książka jest dostępna oraz czy użytkownik może wypożyczyć więcej książek. Zwracaj odpowiednie komunikaty dla każdego przypadku niepowodzenia lub powodzenia.ReturnBook(string bookId, int memberId)- obsługuje zwroty, sprawdzając przed ich przetworzeniem, czy użytkownik rzeczywiście ma tę książkę.
Program.cs: Przetwarzaj operacje biblioteczne i wyświetlaj wyniki.
Metoda BorrowBook powinna zwracać następujące komunikaty w zależności od sytuacji:
Book not found- gdy identyfikator książki nie istniejeUser not found- gdy identyfikator użytkownika nie istnieje{Title} is not available- gdy książka jest już wypożyczona{Name} has reached the borrowing limit- gdy użytkownik ma już 3 książki{Name} borrowed {Title}- po pomyślnym wypożyczeniu
Metoda ReturnBook powinna zwracać:
Book not foundlubUser not found- dla nieprawidłowych identyfikatorów{Name} did not borrow {Title}- gdy użytkownik próbuje zwrócić książkę, której nie ma{Name} returned {Title}- po pomyślnym zwrocie
Otrzymasz następujące dane wejściowe:
- Nazwę biblioteki
- Liczbę książek, a następnie dane każdej książki w formacie
id|title|author - Liczbę użytkowników, a następnie dane każdego użytkownika w formacie
name|memberId - Liczbę operacji, a następnie każdą operację w formacie
action|bookId|memberId
Wyświetl wynik każdej operacji w osobnym wierszu.
Na przykład, jeśli dane wejściowe to:
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|101Wynik powinien być następujący:
Alice borrowed The Hobbit
Alice borrowed 1984
Alice borrowed Dune
Alice has reached the borrowing limit
The Hobbit is not available
Alice returned 1984Zwróć uwagę, jak klasa Library pełni funkcję koordynatora — sprawdza wszystkie warunki przed zezwoleniem na wykonanie operacji, dzięki czemu klasy Book i User mogą skupiać się na własnych zadaniach. Taki podział ułatwia utrzymanie i testowanie kodu!
Spróbuj swoich sił
using System;
using System.Collections.Generic;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// Wczytaj nazwę biblioteki
string libraryName = Console.ReadLine();
// Utwórz instancję Library z nazwą biblioteki
Library library = new Library(libraryName);
// Wczytaj liczbę książek
int numBooks = Convert.ToInt32(Console.ReadLine());
// Wczytaj i dodaj książki
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);
}
// Wczytaj liczbę użytkowników
int numUsers = Convert.ToInt32(Console.ReadLine());
// Wczytaj i zarejestruj użytkowników
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);
}
// Wczytaj liczbę operacji
int numOperations = Convert.ToInt32(Console.ReadLine());
// Przetwórz operacje
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);
}
}
}
}
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrznePrzestrzenie nazw i dyrektywyWprowadzenie do klas i obiektówSłowo kluczowe „this”Metody i parametryPola a właściwościKonstruktoryInicjalizatory obiektówPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawowa składnia dziedziczenia (:)Słowo kluczowe 'base'Słowa kluczowe virtual i overrideKlasy sealedBazowa klasa 'object'Powtórzenie – hierarchia pracowników7Zaawansowane funkcje
Przeciążanie operatorówIndeksery (this[])Nadpisywanie ToString()Metody rozszerzającePodsumowanie – własna lista2Właściwości i składowe statyczne
Właściwości automatyczneWłaściwości tylko do odczytu i zapisuPola i metody statyczneKlasy statyczneSkładowe z ciałem wyrażeniowym5Polimorfizm i interfejsy
Polimorfizm czasu kompilacji a czasu wykonaniaInterfejs a klasa abstrakcyjnaWiele interfejsówJawne implementowanie interfejsówRzutowanie w górę i w dółPowtórka — kalkulator kształtów8Zaawansowane koncepcje OOP
Kompozycja zamiast dziedziczeniaTypy generyczne (klasy i metody)Delegaty i zdarzeniaAtrybuty i refleksjaIDisposable i instrukcja usingPodstawy wstrzykiwania zależności11Wzorce projektowe, część 2
Wzorzec poleceniaWzorzec adapteraWzorzec dekoratoraWzorzec metody szablonowejWzorzec stanuWzorzec kompozytu3Architektura klas
Dane instancji a dane statyczneSłowa kluczowe 'readonly' i 'const'Pola zapasowePowtórzenie — menedżer kont bankowych6Hermetyzacja
Modyfikatory dostępuWłaściwości w hermetyzacjiImplementacja ukrywania danychWzorce niezmiennościPowtórka — dane studentów9Argumenty zmiennej liczby
Słowo kluczowe „params”Parametry opcjonalneArgumenty nazwanePrzeciążanie metod12Projekt: System biblioteczny
Struktura projektuModele książki i użytkownikaLogika systemu wypożyczeńWyszukiwanie za pomocą LINQInterfejs konsolowy / interfejs administratoraTesty jednostkowe (NUnit/xUnit)Poćwicz samodzielnie: Kompilator C# online