[Buổi 27][Củng cố OOP cơ bản][HW] Bài 3: Thư viện có hạn mức mượn theo độc giả
Thư viện có hạn mức mượn theo độc giả
Bối cảnh
Một thư viện quản lý Book và Member. Book biết id và trạng thái available. Member biết id, limit và danh sách book đang mượn. Quy tắc borrow chỉ thành công khi book tồn tại/available, member tồn tại/chưa đạt limit và chưa giữ book đó. Return chỉ thành công khi member thực sự đang giữ book.
Command thêm book/member, borrow/return và query MEMBER id in số sách đang mượn, AVAILABLE in tổng book available. Manager/Library chịu trách nhiệm phối hợp hai object; Book và Member tự bảo vệ state riêng.
Bài tích hợp B27 cần thể hiện rõ trách nhiệm giữa các class. Object nhỏ bảo vệ state cục bộ; class quản lý/aggregate root chịu trách nhiệm tìm object và phối hợp workflow. Một thao tác liên quan nhiều object phải kiểm tra đủ điều kiện trước khi mutation để tránh trạng thái chỉ cập nhật một nửa.
Yêu cầu
- Classes Book, Member, Library.
- Book available private; Member borrowed private.
- Library phối hợp BORROW/RETURN atomic.
- Queries.
Input
Dòng 1 q; q command.
Output
Mỗi command một dòng.
Ràng buộc
q≤5000, member limit>0.
Ví dụ 1
Input
12
ADDBOOK B1
ADDBOOK B2
ADDMEMBER M1 1
BORROW M1 B1
BORROW M1 B2
AVAILABLE
MEMBER M1
RETURN M1 B1
BORROW M1 B2
AVAILABLE
MEMBER M1
RETURN M1 B1
Output
OK
OK
OK
OK
FAIL
1
1
OK
OK
1
1
FAIL
Giải thích
M1 limit1 mượn B1 thành công; mượn B2 fail do đạt limit. Available còn1 và MEMBER M1=1. Return B1 OK, sau đó borrow B2 OK. Available lại1 và member count1. Return B1 cuối fail vì M1 không còn giữ B1.
Ví dụ này cũng kiểm tra trách nhiệm giữa manager và object domain: lookup/điều phối được thực hiện ở lớp quản lý, còn object tự quyết định mutation hợp lệ của state riêng. Vì vậy sau mỗi lệnh, các query tiếp theo phản ánh một trạng thái nhất quán thay vì các field bị sửa rời rạc.
Ví dụ 2
Input
6
BORROW X B
RETURN X B
MEMBER X
AVAILABLE
ADDMEMBER X 0
ADDBOOK B
Output
FAIL
FAIL
NOT_FOUND
0
FAIL
OK
Giải thích
Borrow/return với object chưa tồn tại fail; MEMBER X NOT_FOUND, AVAILABLE0. AddMember limit0 fail. AddBook B cuối OK.
Ví dụ này cũng kiểm tra trách nhiệm giữa manager và object domain: lookup/điều phối được thực hiện ở lớp quản lý, còn object tự quyết định mutation hợp lệ của state riêng. Vì vậy sau mỗi lệnh, các query tiếp theo phản ánh một trạng thái nhất quán thay vì các field bị sửa rời rạc.
Thông tin học tập
- Module: M07
- Buổi: B27
- Loại bài: HOMEWORK
- Độ khó: Medium
- Concepts: multiple classes, private state, cross-object rules, vector, command simulation
- Giới hạn kiến thức: B01-B27
- Time limit: 1 second(s)
- Memory limit: 256 MB
- Point: 100
Comments