[Buổi 27][Củng cố OOP cơ bản][HW] Bài 2: Sổ chi tiêu theo danh mục
Sổ chi tiêu theo danh mục
Bối cảnh
Một ứng dụng chi tiêu có hai lớp: Expense lưu id, category, amount; ExpenseBook quản lý danh sách Expense. ID giao dịch phải duy nhất và amount>0.
Command:
ADD id category amountREMOVE idTOTAL: tổng toàn bộCATEGORY name: tổng theo categoryTOP: category có tổng chi lớn nhất; tie theo tên tăng. Nếu chưa có expense inEMPTY.
ExpenseBook phải là nơi duy nhất quản lý collection; main chỉ chuyển command. Bài Medium tích hợp class responsibility, validation, aggregate query và tie-break mà chưa cần inheritance.
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
- Class Expense là data object.
- Class ExpenseBook private vector<Expense>.
- ID unique, amount>0.
- Queries TOTAL/CATEGORY/TOP.
Input
Dòng 1 q; q command.
Output
Mỗi command một dòng: ADD/REMOVE OK/FAIL; query kết quả.
Ràng buộc
q≤5000, amount≤1e12.
Ví dụ 1
Input
9
ADD E1 FOOD 100
ADD E2 BOOK 200
ADD E3 FOOD 50
TOTAL
CATEGORY FOOD
TOP
REMOVE E2
TOP
TOTAL
Output
OK
OK
OK
350
150
BOOK 200
OK
FOOD 150
150
Giải thích
Sau ba ADD, total350; FOOD150. TOP là BOOK200 vì lớn hơn FOOD150. Remove E2 làm chỉ còn FOOD150, nên TOP FOOD 150 và TOTAL150.
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
5
TOP
TOTAL
CATEGORY X
REMOVE E1
ADD E1 A 0
Output
EMPTY
0
0
FAIL
FAIL
Giải thích
Khi book rỗng, TOP=EMPTY, TOTAL0, CATEGORY X=0, REMOVE fail. ADD amount0 cũng fail nên state vẫn rỗng.
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, aggregation, command flow, vector, map-like lookup
- Giới hạn kiến thức: B01-B27
- Time limit: 1 second(s)
- Memory limit: 256 MB
- Point: 100
Comments