[Buổi 27][Củng cố OOP cơ bản][HW] Bài 4: Kho sản phẩm có đơn hàng tạm giữ


LÀM BÀI

Points: 100
Time limit: 1.0s
Memory limit: 256M

Author:
Problem types
Allowed languages
C++

Kho sản phẩm có đơn hàng tạm giữ

Bối cảnh

Một kho có Product(id, stock)Order(id, productId, qty, status). Khi tạo order CREATE oid pid qty, hệ thống phải reserve qty khỏi available stock ngay lập tức nhưng chưa giảm physical stock. CANCEL oid trả phần reserve; SHIP oid giảm stock thật và giải phóng reserve. Order chỉ được cancel/ship một lần. Query PRODUCT pid in stock reserved available; ORDER oid in OPEN/CANCELLED/SHIPPED hoặc NOT_FOUND.

Bài Medium buộc thiết kế lifecycle của Order và invariant 0≤reserved≤stock ở Product. Inventory manager phối hợp hai class mà không cho main sửa field.

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

  1. Classes Product, Order, Inventory.
  2. CREATE reserve atomic.
  3. CANCEL/SHIP chỉ với OPEN.
  4. Queries PRODUCT/ORDER.

Input

Dòng 1 n; n dòng pid stock; dòng q; q command.

Output

Mỗi command một dòng.

Ràng buộc

n,q≤3000, qty>0 trong valid CREATE.

Ví dụ 1

Input

2
P1 10
P2 5
10
CREATE O1 P1 6
PRODUCT P1
CREATE O2 P1 5
SHIP O1
PRODUCT P1
ORDER O1
CREATE O2 P1 4
CANCEL O2
PRODUCT P1
ORDER O2

Output

OK
10 6 4
FAIL
OK
4 0 4
SHIPPED
OK
OK
4 0 4
CANCELLED

Giải thích

CREATE O1 reserve6 nên Product P1 10 6 4. O2 qty5 fail vì available4. SHIP O1 làm stock4 reserved0. ORDER O1=SHIPPED. CREATE O2 qty4 lúc này OK, cancel trả reserve, product trở 4 0 4, order O2=CANCELLED.

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

1
P 0
5
CREATE O P 1
PRODUCT P
ORDER O
CANCEL O
SHIP O

Output

FAIL
0 0 0
NOT_FOUND
FAIL
FAIL

Giải thích

P stock0 nên CREATE fail. PRODUCT 0 0 0, ORDER O NOT_FOUND. CANCEL/SHIP O đều fail vì order chưa tồn tại.

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, inventory reservation, order lifecycle, private state, command simulation
  • Giới hạn kiến thức: B01-B27
  • Time limit: 1 second(s)
  • Memory limit: 256 MB
  • Point: 100

Comments

There are no comments at the moment.

Zalo