Hệ thống mượn sách
Thuộc phần Lập trình hướng đối tượng trong hành trình Java của Coddy. Bài học 79 trên 87.
Thử thách
DễHãy tiếp tục xây dựng Hệ thống quản lý thư viện bằng cách tạo một hệ thống mượn sách hoàn chỉnh với lớp (class) Library để quản lý bộ sưu tập sách và người dùng. Đây là lúc hệ thống của bạn bắt đầu giống một thư viện thực sự: theo dõi ai đang giữ sách nào và áp dụng các quy tắc mượn sách!
Bạn sẽ sắp xếp code trong bốn tệp:
Book.java: Giữ lại lớp Book từ thử thách trước cùng mọi chức năng: isbn, title, author, isAvailable, borrowedBy, getDetails() và các phương thức getter/setter phù hợp.User.java: Giữ lại lớp User với id, name, danh sách borrowedBooks kiểu ArrayList, borrowBook(), returnBook(), getBorrowedCount() và toString().Library.java: Tạo lớpLibrarytrung tâm để quản lý mọi thứ. Thư viện của bạn cần duy trì hai ArrayList: một danh sách chứa các đối tượngBookvà một danh sách chứa các đối tượngUser. Thêm các phương thức sau:addBook(Book book): thêm một quyển sách vào bộ sưu tập của thư viện.registerUser(User user): thêm một người dùng vào danh sách người dùng đã đăng ký của thư viện.findBookByIsbn(String isbn): tìm trong danh sách sách và trả về quyển Book có ISBN trùng khớp, hoặc trả vềnullnếu không tìm thấy.findUserById(String id): tìm trong danh sách người dùng và trả về người dùng User có ID trùng khớp, hoặc trả vềnullnếu không tìm thấy.borrowBook(String userId, String isbn): tìm người dùng và quyển sách, sau đó, nếu tìm thấy cả hai và sách còn, cho người dùng mượn sách rồi in ra[userName] borrowed [bookTitle]. Nếu sách không còn, in raBook not available. Nếu không tìm thấy người dùng hoặc sách, in raInvalid user or book.returnBook(String userId, String isbn): tìm người dùng và quyển sách, sau đó cho người dùng trả sách rồi in ra[userName] returned [bookTitle]. Nếu không tìm thấy người dùng hoặc sách, in raInvalid user or book.Main.java: Kết hợp các phần trong hệ thống thư viện của bạn! Bạn sẽ nhận đầu vào cho hai quyển sách, mỗi quyển gồm ISBN, tiêu đề và tác giả, một người dùng gồm ID và tên, rồi một chuỗi thao tác.Tạo một Library, thêm cả hai quyển sách và đăng ký người dùng. Sau đó, xử lý các thao tác: bạn sẽ nhận một chuỗi được phân tách bằng dấu phẩy, trong đó mỗi thao tác có định dạng
borrow:userId:isbnhoặcreturn:userId:isbn.Sau khi xử lý mọi thao tác, in bản tóm tắt thể hiện trạng thái của từng quyển sách theo định dạng
[isbn]: [Available/Borrowed].
Bạn sẽ nhận đầu vào theo thứ tự sau: ISBN của book1, tiêu đề của book1, tác giả của book1, ISBN của book2, tiêu đề của book2, tác giả của book2, ID người dùng, tên người dùng, cuối cùng là chuỗi thao tác.
Ví dụ, với đầu vào ISBN-001, Clean Code, Robert Martin, ISBN-002, Design Patterns, Gang of Four, U001, Alice và borrow:U001:ISBN-001,borrow:U001:ISBN-002,return:U001:ISBN-001, đầu ra sẽ là:
Alice borrowed Clean Code
Alice borrowed Design Patterns
Alice returned Clean Code
ISBN-001: Available
ISBN-002: BorrowedThử thách này kết hợp tính kết hợp, tính đóng gói và thiết kế phương thức để tạo nên một hệ thống thống nhất. Lớp Library đóng vai trò điều phối, giao phần xử lý việc mượn sách cho các lớp User và Book, đồng thời quản lý toàn bộ bộ sưu tập!
Tự làm thử
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Đọc thông tin sách 1
String isbn1 = scanner.nextLine();
String title1 = scanner.nextLine();
String author1 = scanner.nextLine();
// Đọc thông tin sách 2
String isbn2 = scanner.nextLine();
String title2 = scanner.nextLine();
String author2 = scanner.nextLine();
// Đọc thông tin người dùng
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// Đọc chuỗi thao tác (phân tách bằng dấu phẩy, định dạng: borrow:userId:isbn hoặc return:userId:isbn)
String operationsStr = scanner.nextLine();
// TODO: Tạo các đối tượng Book cho book1 và book2
// TODO: Tạo một đối tượng User
// TODO: Tạo một Library, thêm cả hai cuốn sách và đăng ký người dùng
// TODO: Tách operationsStr theo "," và xử lý từng thao tác
// Với mỗi thao tác, tách theo ":" để lấy action, userId, isbn
// Gọi library.borrowBook() hoặc library.returnBook() tương ứng
// TODO: In ra trạng thái của từng cuốn sách theo định dạng "[isbn]: [Available/Borrowed]"
}
}Tất cả bài học trong Lập trình hướng đối tượng
1Kiến thức cơ bản về lập trình hướng đối tượng
Tệp bên ngoàiGiới thiệu về lập trình hướng đối tượngLớp và đối tượngTừ khóa thisPhương thứcTrường (thuộc tính)Phương thức khởi tạoNạp chồng phương thức khởi tạoÔn tập: Máy tính đơn giản4Kế thừa
Kế thừa cơ bản (extends)Từ khóa superGhi đè phương thức (@Override)Chuỗi gọi hàm khởi tạoLớp ObjectKế thừa đơn và đa cấpVì sao không hỗ trợ kế thừa nhiều lớpÔn tập: Phân cấp lớp Employee7Phương thức đặc biệt và lớp Object
Phương thức toString()equals() và hashCode()Phương thức clone()compareTo() và ComparableGiao diện ComparatorÔn tập: sắp xếp tùy chỉnh10Xử lý ngoại lệ trong OOP
Phân cấp lớp ngoại lệNgoại lệ tùy chỉnhLỗi có kiểm tra và không kiểm traMẫu try-with-resourcesÔn tập: người dùng đã xác thực13Dự án: Quản lý thư viện
Tổng quan dự án và thiết kế UMLLớp sách và người dùngHệ thống mượn sáchChức năng tìm kiếmGiao diện quản trịTích hợp xử lý ngoại lệKiểm thử và tích hợp2Bộ điều chỉnh quyền truy cập và đóng gói
Tổng quan về các mức truy cậpPhương thức getter và setterẨn thông tinTừ khóa finalÔn tập: Trình quản lý tài khoản ngân hàng5Tính đa hình
Kiến thức cơ bản về nạp chồng phương thứcGhi đè phương thức (thời gian chạy)Chuyển kiểu lên và chuyển kiểu xuốngToán tử instanceofLớp và phương thức trừu tượngÔn tập: máy tính hình học8Khái niệm OOP nâng cao
Kết hợp và kế thừaKết tập và hợp thànhLớp bên trong, lớp lồng nhau và lớp ẩn danhKiểu enum và phương thức enumBản ghi (Java 16+)Lớp sealed (Java 17+)3Thuộc tính lớp và thành viên tĩnh
Biến của instance và biến tĩnhPhương thức tĩnhKhối tĩnhHằng số (static final)Ôn tập: bộ đếm và tiện ích6Giao diện và lớp trừu tượng
Giới thiệu về giao diệnTriển khai giao diệnTriển khai nhiều giao diệnPhương thức mặc định và tĩnh trong giao diệnLớp trừu tượng và giao diệnGiao diện hàmÔn tập: hệ thống thanh toán9Kiểu tổng quát
Giới thiệu về kiểu tổng quátLớp tổng quátPhương thức tổng quátTham số kiểu có giới hạnKý tự đại diện (?, extends, super)Ôn tập: vùng chứa tổng quát12Mẫu thiết kế, phần 2
Mẫu CommandMẫu AdapterMẫu DecoratorMẫu Template MethodMẫu StateMẫu CompositeMẫu IteratorTự luyện tập: Trình biên dịch Java online