[Buổi 25][Đóng gói][WS] Bài 1: Safe Product
Safe Product
Bối cảnh
Một Product object phải luôn giữ price và stock hợp lệ, đồng thời hỗ trợ bán hàng và định giá lại.
Workshop kiểm tra interface nhỏ thay vì public data.
Yêu cầu
- Class Product: private
id,price,stock. - Public behavior:
restock,sell,changePrice,inventoryValue,getStock. - Command
ADD x,SELL x,PRICE x,VALUE. - ADD/SELL/PRICE in OK/FAIL; VALUE in giá trị kho.
- Cuối cùng in
STOCK s PRICE p.
Yêu cầu tổ chức code
Không có public setter trực tiếp cho stock; data phải private.
Online Judge chấm output. Giảng viên có thể review thêm cấu trúc code để xác nhận học viên luyện đúng kỹ năng OOP của buổi.
Input
Dòng 1 id price stock q; q command.
Output
Mỗi query một dòng và state cuối.
Ràng buộc
0≤price,stock≤1e12.
Ví dụ 1
Input
P1 100 5 5
VALUE
SELL 2
VALUE
PRICE 80
VALUE
Output
500
OK
300
OK
240
STOCK 3 PRICE 80
Giải thích
VALUE đầu là 100*5=500. SELL2 thành công làm stock3, VALUE mới 300. PRICE80 hợp lệ làm giá80, VALUE tiếp theo 80*3=240. State cuối STOCK 3 PRICE 80. Mọi state mutation đi qua method chứ main không sửa field private.
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
X 0 0 4
VALUE
ADD 3
SELL 4
PRICE -1
Output
0
OK
FAIL
FAIL
STOCK 3 PRICE 0
Giải thích
X bắt đầu price0 stock0 nên VALUE=0. ADD3 thành công. SELL4 fail vì stock chỉ3; PRICE -1 fail vì giá âm. State cuối giữ stock3 price0, đúng STOCK 3 PRICE 0.
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: WORKSHOP
- Độ khó: Medium
- Concepts: encapsulation, validation, private state, small public interface, object commands
- Giới hạn kiến thức: B01-B25
- Time limit: 1 second(s)
- Memory limit: 256 MB
- Point: 100
Comments