[Buổi 25][Đóng gói][HW] Bài 2: Ví điện tử có hạn mức
Ví điện tử có hạn mức
Bối cảnh
Một ví điện tử cần giữ hai invariant: balance không âm và tổng tiền đã chi trong ngày không vượt dailyLimit. Object bắt đầu với balance ban đầu và limit. Các lệnh:
ADD x: nạp tiền nếu x>0.PAY x: chỉ thành công nếu x>0, đủ balance vàspent+x≤dailyLimit.RESET: sang ngày mới, đặt spent=0 nhưng balance giữ nguyên.INFO: inbalance spent remainingLimit.
Field phải private; main không được sửa balance/spent trực tiếp. Bài Medium buộc người học nghĩ theo state machine nhỏ và mọi mutation đều phải đi qua interface kiểm soát invariant.
Vì đây là phần encapsulation, mọi field tạo nên invariant cần được đặt sau một interface kiểm soát. Một command thất bại phải là thao tác atomic: state trước và sau phải giống nhau hoàn toàn. Khi có nhiều field liên quan, nên viết rõ điều kiện hợp lệ trước rồi mới thực hiện bất kỳ phép gán nào.
Yêu cầu
- Class Wallet private balance, spent, limit.
- Implement add/pay/reset/info getters.
- Xử lý command.
- PAY fail không đổi state.
Input
Dòng 1 initial limit q; q dòng command.
Output
Mỗi ADD/PAY in OK/FAIL, RESET in OK, INFO in ba số.
Ràng buộc
0≤initial,limit≤1e12, q≤5000.
Ví dụ 1
Input
100 80 7
PAY 50
PAY 40
ADD 30
PAY 30
INFO
RESET
INFO
Output
OK
FAIL
OK
OK
50 80 0
OK
50 0 80
Giải thích
PAY50 hợp lệ: balance50, spent50. PAY40 fail vì spent sẽ90>80. ADD30 làm balance80. PAY30 hợp lệ, balance50 spent80. INFO in 50 80 0. RESET đưa spent về0 nên INFO cuối 50 0 80.
Ví dụ này còn kiểm tra nguyên tắc atomic của interface: khi một điều kiện không đạt, object không được giữ lại thay đổi dở dang. Các dòng output vì vậy không chỉ phản ánh OK/FAIL mà còn xác nhận state sau mỗi command vẫn thỏa invariant của class.
Ví dụ 2
Input
0 10 5
PAY 1
ADD 5
PAY 5
INFO
RESET
Output
FAIL
OK
OK
0 5 5
OK
Giải thích
PAY1 fail vì balance0. ADD5 OK, PAY5 OK làm balance0 spent5. INFO 0 5 5. RESET chỉ đổi spent về0, không ảnh hưởng balance.
Ví dụ này còn kiểm tra nguyên tắc atomic của interface: khi một điều kiện không đạt, object không được giữ lại thay đổi dở dang. Các dòng output vì vậy không chỉ phản ánh OK/FAIL mà còn xác nhận state sau mỗi command vẫn thỏa invariant của class.
Thông tin học tập
- Module: M07
- Buổi: B25
- Loại bài: HOMEWORK
- Độ khó: Medium
- Concepts: class, private state, invariant, daily limit, command simulation
- Giới hạn kiến thức: B01-B25
- Time limit: 1 second(s)
- Memory limit: 256 MB
- Point: 100
Comments