[Buổi 27][Củng cố OOP cơ bản][HW] Bài 1: Quản lý khóa học có giới hạn đăng ký
Quản lý khóa học có giới hạn đăng ký
Bối cảnh
Một hệ thống nhỏ quản lý các khóa học. Mỗi Course có id, capacity và danh sách mã sinh viên đã đăng ký. Course chịu trách nhiệm kiểm soát invariant: số người đăng ký không vượt capacity và một Student ID không được đăng ký trùng.
Hệ thống hỗ trợ:
ADD courseId capacity: thêm khóa học mới nếu ID chưa tồn tại và capacity>0.ENROLL courseId studentId: đăng ký nếu course tồn tại, student chưa có và còn chỗ.DROP courseId studentId: hủy đăng ký nếu student đang có trong course.COUNT courseId: in số đang đăng ký hoặcNOT_FOUND.FULL courseId: inYES/NOhoặcNOT_FOUND.
Bài Medium yêu cầu phân chia trách nhiệm: main/manager tìm Course phù hợp; chính Course quyết định enroll/drop/full. Không dùng inheritance hay exception.
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 Course có private state và methods enroll/drop/count/full.
- Quản lý nhiều Course bằng vector.
- ID course duy nhất.
- Mutation in OK/FAIL; query theo format.
Input
Dòng 1 q; q command.
Output
Mỗi command một dòng.
Ràng buộc
1≤q≤5000, capacity≤5000.
Ví dụ 1
Input
10
ADD C1 2
ENROLL C1 S1
ENROLL C1 S2
FULL C1
ENROLL C1 S3
COUNT C1
DROP C1 S1
FULL C1
COUNT C1
DROP C1 X
Output
OK
OK
OK
YES
FAIL
2
OK
NO
1
FAIL
Giải thích
C1 capacity2. Enroll S1,S2 đều OK và FULL trả YES. Enroll S3 fail vì hết chỗ. COUNT=2. Drop S1 thành công làm course còn1 người, FULL đổi thành NO, COUNT=1. Drop X fail vì không có student này.
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
ADD C1 1
ADD C1 2
ENROLL C2 S1
COUNT C2
FULL C1
COUNT C1
Output
OK
FAIL
FAIL
NOT_FOUND
NO
0
Giải thích
ADD C1 lần đầu OK, lần hai fail vì trùng ID. ENROLL vào C2 fail vì course không tồn tại; COUNT C2 là NOT_FOUND. C1 chưa có student nên FULL NO và COUNT0.
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: class responsibility, private state, vector, lookup, enrollment invariant, command simulation
- Giới hạn kiến thức: B01-B27
- Time limit: 1 second(s)
- Memory limit: 256 MB
- Point: 100
Comments