Logic 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 C# của Coddy. Bài học 64 trên 70.
Thử thách
DễHãy hoàn thiện Hệ thống thư viện bằng cách triển khai logic cốt lõi để mượn sách! Bạn sẽ tạo một hệ thống tập trung điều phối giữa sách và người dùng, áp dụng các quy tắc của thư viện như giới hạn số sách được mượn và đảm bảo chỉ có thể mượn sách khi sách còn sẵn.
Bạn sẽ tiếp tục xây dựng trên cấu trúc bốn tệp hiện có:
Book.cs: Giữ lớp Book với các thuộc tínhId,Title,AuthorvàIsAvailable, cùng với các phương thứcBorrow()vàReturn()từ bài học trước.User.cs: Giữ lớp User với các thuộc tínhName,MemberId,BorrowedCountvà các phương thức quản lý sách đã mượn. Thêm hằng sốMaxBookscó giá trị 3, biểu thị số sách tối đa mà một người dùng có thể mượn cùng lúc. Thêm phương thứcCanBorrow(), chỉ trả về true nếu người dùng đã mượn ít hơnMaxBookscuốn sách.Library.cs: Đây là nơi kết hợp logic của hệ thống cho mượn sách. Lớp Library cần có các tập hợp sách và người dùng, cùng với các phương thức thêm sách và người dùng. Triển khai hai phương thức chính:BorrowBook(string bookId, int memberId)- Điều phối quy trình mượn sách. Phương thức cần kiểm tra sách có tồn tại không, người dùng có tồn tại không, sách có sẵn không và người dùng có thể mượn thêm sách không. Trả về thông báo phù hợp cho từng trường hợp thất bại hoặc thành công.ReturnBook(string bookId, int memberId)- Xử lý việc trả sách bằng cách xác minh người dùng thực sự có sách đó trước khi xử lý việc trả sách.
Program.cs: Xử lý các thao tác của thư viện và hiển thị kết quả.
Phương thức BorrowBook cần trả về các thông báo sau tùy theo tình huống:
Book not found- khi ID sách không tồn tạiUser not found- khi ID thành viên không tồn tại{Title} is not available- khi sách đã được mượn{Name} has reached the borrowing limit- khi người dùng đã có 3 cuốn sách{Name} borrowed {Title}- khi mượn sách thành công
Phương thức ReturnBook cần trả về:
Book not foundhoặcUser not found- khi ID không hợp lệ{Name} did not borrow {Title}- khi người dùng muốn trả một cuốn sách mà họ không có{Name} returned {Title}- khi trả sách thành công
Bạn sẽ nhận các đầu vào sau:
- Tên thư viện
- Số lượng sách, sau đó là thông tin từng cuốn sách theo định dạng
id|title|author - Số lượng người dùng, sau đó là thông tin từng người dùng theo định dạng
name|memberId - Số lượng thao tác, sau đó là thông tin từng thao tác theo định dạng
action|bookId|memberId
In kết quả của từng thao tác trên một dòng riêng.
Ví dụ, nếu đầu vào là:
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|101Đầu ra sẽ là:
Alice borrowed The Hobbit
Alice borrowed 1984
Alice borrowed Dune
Alice has reached the borrowing limit
The Hobbit is not available
Alice returned 1984Lưu ý cách lớp Library đóng vai trò điều phối: lớp này xác thực tất cả điều kiện trước khi cho phép thao tác, giúp các lớp Book và User tập trung vào trách nhiệm riêng. Cách phân tách này giúp bạn dễ bảo trì và kiểm thử code hơn!
Tự làm thử
using System;
using System.Collections.Generic;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// Đọc tên thư viện
string libraryName = Console.ReadLine();
// Tạo một instance của Library với tên thư viện
Library library = new Library(libraryName);
// Đọc số lượng sách
int numBooks = Convert.ToInt32(Console.ReadLine());
// Đọc và thêm sách
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);
}
// Đọc số lượng người dùng
int numUsers = Convert.ToInt32(Console.ReadLine());
// Đọc và đăng ký người dùng
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);
}
// Đọc số lượng thao tác
int numOperations = Convert.ToInt32(Console.ReadLine());
// Xử lý các thao tác
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);
}
}
}
}
}
Tất cả bài học trong Lập trình hướng đối tượng
1Các khái niệm cơ bản về lập trình hướng đối tượng
Tệp bên ngoàiKhông gian tên và chỉ thịGiới thiệu về lớp và đối tượngTừ khóa thisPhương thức và tham sốTrường và thuộc tínhHàm khởi tạoKhởi tạo đối tượngÔn tập: Máy tính đơn giản4Kế thừa
Cú pháp kế thừa cơ bản (:)Từ khóa 'base'Từ khóa virtual và overrideLớp sealedLớp cơ sở 'object'Ôn tập: hệ phân cấp nhân viên7Tính năng nâng cao
Nạp chồng toán tửBộ lập chỉ mục (this[])Ghi đè ToString()Phương thức mở rộngÔn tập: Danh sách tùy chỉnh10Các mẫu thiết kế phần 1
Giới thiệu về mẫu thiết kếSingleton an toàn với luồngMẫu FactoryMẫu Observer (sự kiện)Mẫu Strategy2Thuộc tính và thành viên tĩnh
Thuộc tính tự độngThuộc tính chỉ đọc hoặc chỉ ghiTrường và phương thức tĩnhLớp tĩnhThành viên có thân biểu thức5Đa hình và interface
Đa hình lúc biên dịch và lúc chạyInterface và lớp trừu tượngNhiều interfaceInterface tường minhUpcasting và downcastingÔn tập: bộ tính toán hình học8Các khái niệm OOP nâng cao
Ưu tiên composition hơn kế thừaGenerics (lớp và phương thức)Delegate và sự kiệnAttribute và reflectionGiao diện IDisposable và câu lệnh usingKiến thức cơ bản về dependency injection11Các mẫu thiết kế phần 2
Mẫu lệnhMẫu bộ chuyển đổiMẫu trang tríMẫu phương thức khuôn mẫuMẫu trạng tháiMẫu tổ hợp3Kiến trúc lớp
Dữ liệu instance và dữ liệu tĩnhTừ khóa 'readonly' và 'const'Trường lưu trữÔn tập: Trình quản lý tài khoản ngân hàng6Đóng gói
Bộ điều chỉnh quyền truy cậpThuộc tính để đóng góiTriển khai ẩn dữ liệuCác mẫu bất biếnÔn tập: hồ sơ học sinh12Dự án: hệ thống thư viện
Cấu trúc dự ánMô hình sách và người dùngLogic hệ thống mượn sáchLINQ để tìm kiếmGiao diện console / giao diện quản trịKiểm thử đơn vị (NUnit/xUnit)Tự luyện tập: Trình biên dịch C# online