System wypożyczeń
Część sekcji Programowanie obiektowe ścieżki Java w Coddy. Lekcja 79 z 87.
Wyzwanie
ŁatwyKontynuujmy budowanie systemu zarządzania biblioteką, tworząc odpowiedni system wypożyczeń z klasą Library, która zarządza zbiorami książek i użytkowników. To właśnie tutaj Twój system zaczyna przypominać prawdziwą bibliotekę: śledzi, kto ma którą książkę, i egzekwuje zasady wypożyczania!
Rozmieścisz swój kod w czterech plikach:
Book.java: Zachowaj klasę Book z poprzedniego wyzwania wraz z całą jej funkcjonalnością: isbn, title, author, isAvailable, borrowedBy, getDetails() oraz odpowiednimi metodami pobierającymi i ustawiającymi.User.java: Zachowaj klasę User z id, name, tablicą ArrayList borrowedBooks oraz metodami borrowBook(), returnBook(), getBorrowedCount() i toString().Library.java: Utwórz centralną klasęLibrary, która zarządza wszystkim. Twoja biblioteka powinna przechowywać dwie kolekcje ArrayList: jedną dla obiektówBooki jedną dla obiektówUser. Uwzględnij następujące metody:addBook(Book book)— dodaje książkę do zbiorów biblioteki.registerUser(User user)— dodaje użytkownika do zarejestrowanych użytkowników biblioteki.findBookByIsbn(String isbn)— przeszukuje książki i zwraca obiekt Book o pasującym ISBN lubnull, jeśli go nie znaleziono.findUserById(String id)— przeszukuje użytkowników i zwraca obiekt User o pasującym ID lubnull, jeśli go nie znaleziono.borrowBook(String userId, String isbn)— znajduje użytkownika i książkę, a następnie, jeśli oboje istnieją i książka jest dostępna, wypożycza ją użytkownikowi i wyświetla[userName] borrowed [bookTitle]. Jeśli książka nie jest dostępna, wyświetlBook not available. Jeśli nie znaleziono użytkownika lub książki, wyświetlInvalid user or book.returnBook(String userId, String isbn)— znajduje użytkownika i książkę, a następnie zwraca książkę przez użytkownika i wyświetla[userName] returned [bookTitle]. Jeśli nie znaleziono użytkownika lub książki, wyświetlInvalid user or book.Main.java: Połącz wszystkie elementy systemu bibliotecznego! Otrzymasz dane wejściowe dla dwóch książek (dla każdej: ISBN, tytuł, autor), jednego użytkownika (ID, imię), a następnie serię operacji.Utwórz obiekt Library, dodaj obie książki i zarejestruj użytkownika. Następnie przetwórz operacje: otrzymasz ciąg rozdzielony przecinkami, w którym każda operacja ma format
borrow:userId:isbnlubreturn:userId:isbn.Po przetworzeniu wszystkich operacji wyświetl podsumowanie pokazujące status każdej książki w formacie
[isbn]: [Available/Borrowed].
Dane wejściowe otrzymasz w następującej kolejności: ISBN książki book1, tytuł książki book1, autor książki book1, ISBN książki book2, tytuł książki book2, autor książki book2, ID użytkownika, imię użytkownika, a na końcu ciąg operacji.
Na przykład dla danych wejściowych ISBN-001, Clean Code, Robert Martin, ISBN-002, Design Patterns, Gang of Four, U001, Alice i borrow:U001:ISBN-001,borrow:U001:ISBN-002,return:U001:ISBN-001 wynikiem byłoby:
Alice borrowed Clean Code
Alice borrowed Design Patterns
Alice returned Clean Code
ISBN-001: Available
ISBN-002: BorrowedTo wyzwanie łączy kompozycję, hermetyzację i projektowanie metod, aby stworzyć spójny system. Klasa Library pełni rolę koordynatora, delegując właściwą logikę wypożyczania do klas User i Book, a jednocześnie zarządzając całą kolekcją!
Spróbuj swoich sił
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Wczytaj informacje o książce 1
String isbn1 = scanner.nextLine();
String title1 = scanner.nextLine();
String author1 = scanner.nextLine();
// Wczytaj informacje o książce 2
String isbn2 = scanner.nextLine();
String title2 = scanner.nextLine();
String author2 = scanner.nextLine();
// Wczytaj informacje o użytkowniku
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// Wczytaj ciąg operacji (oddzielonych przecinkami, format: borrow:userId:isbn lub return:userId:isbn)
String operationsStr = scanner.nextLine();
// TODO: Utwórz obiekty Book dla book1 i book2
// TODO: Utwórz obiekt User
// TODO: Utwórz obiekt Library, dodaj obie książki i zarejestruj użytkownika
// TODO: Podziel operationsStr według "," i przetwórz każdą operację
// Dla każdej operacji podziel ją według ":", aby uzyskać action, userId i isbn
// Wywołaj odpowiednio library.borrowBook() lub library.returnBook()
// TODO: Wypisz podsumowanie dla każdej książki w formacie "[isbn]: [Available/Borrowed]"
}
}Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe thisMetodyPola (atrybuty)Metoda konstruktoraPrzeciążanie konstruktoraPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawy dziedziczenia (extends)Słowo kluczowe superPrzesłanianie metod (@Override)Łańcuch wywołań konstruktorówKlasa ObjectDziedziczenie jedno- i wielopoziomoweDlaczego Java nie obsługuje wielodziedziczenia klasPodsumowanie – hierarchia pracowników7Metody specjalne i klasa Object
Metoda toString()equals() i hashCode()Metoda clone()compareTo() i ComparableInterfejs ComparatorPodsumowanie — własne sortowanie10Obsługa wyjątków w programowaniu obiektowym
Hierarchia klas wyjątkówWłasne wyjątkiBłędy sprawdzane a niesprawdzaneWzorzec try-with-resourcesPodsumowanie – zweryfikowany użytkownik13Projekt: System zarządzania biblioteką
Przegląd projektu i projekt UMLKlasy książki i użytkownikaSystem wypożyczeńFunkcja wyszukiwaniaInterfejs administratoraIntegracja obsługi wyjątkówTestowanie i integracja2Modyfikatory dostępu i enkapsulacja
Przegląd poziomów dostępuMetody pobierające i ustawiająceUkrywanie informacjiSłowo kluczowe finalPodsumowanie — menedżer kont bankowych5Polimorfizm
Podstawy przeciążania metodPrzesłanianie metod (w czasie wykonywania)Rzutowanie w górę i w dółOperator instanceofKlasy i metody abstrakcyjnePowtórka — kalkulator figur8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieAgregacja a kompozycjaKlasy wewnętrzne, zagnieżdżone i anonimoweEnumy i metody enumówRekordy (Java 16+)Klasy zapieczętowane (Java 17+)11Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec BuilderWzorzec ObserverWzorzec Strategy3Właściwości klas i składowe statyczne
Zmienne instancji a zmienne statyczneMetody statyczneBloki statyczneStałe (static final)Powtórka – Counter i Utility6Interfejsy i klasy abstrakcyjne
Wprowadzenie do interfejsówImplementowanie interfejsówImplementacja wielu interfejsówMetody domyślne i statyczne w interfejsieKlasy abstrakcyjne a interfejsyInterfejsy funkcyjnePodsumowanie — system płatnościPoćwicz samodzielnie: Kompilator Java online