Capstone: home theater Facade và macro
Gom dàn máy rạp hát sau một nút bấm Facade, lập trình macro xem phim bằng Command có undo và xử lý lỗi từng thiết bị.
Chuyên giaDesign pattern ~120 phút
Ôn lại trước khi học
Giới thiệu
Bạn gom dàn máy rạp hát sau một nút. Một nút bấm là phim chạy.
Kiến thức cần nhớ
Facade là gì
- Facade là một mặt tiền đơn giản che dàn máy phức tạp.
- Định nghĩa: một hàm duy nhất gọi đúng thứ tự nhiều máy.
- Ví dụ đời thường: giống nút "xem phim" trên remote.
- Muốn xem phim không cần nhớ thứ tự 6 máy.
Command và macro
- Command gói mỗi thao tác thành một lệnh riêng.
- Macro là chuỗi lệnh chạy liền một lần.
- Ví dụ đời thường: macro như danh sách việc phát một lần.
- Mỗi lệnh biết cách undo của chính nó.
Undo và lỗi giữa chừng
- Undo đưa mọi máy về đúng trạng thái trước đó.
- Ví dụ đời thường: giống nút hoàn tác trong Word.
- Máy lỗi giữa macro thì dừng và báo rõ máy nào.
- Ghi nhật ký để mất điện vẫn chạy lại được.
# lệnh có undo đơn giản
class LenBatDen: # một lệnh cụ thể
def chay(self):
print("tắt đèn") # làm việc
def undo(self):
print("bật đèn lại") # hoàn tác
macro = [LenBatDen()] # chuỗi lệnh xem phim
for lenh in macro:
lenh.chay() # chạy từng lệnh
Ví dụ
- Một nút xem phim -> 6 máy về đúng trạng thái chiếu.
- Undo macro -> mọi máy về trạng thái ban đầu.
💻 Bài tập
Ngôn ngữ: C++17 (hoặc Java). Dùng code ngày 125. Nộp vào day-159-capstone/.
Bài 1: Hoàn thiện rạp hát
Mở rộng project ngày 125:
- Thêm 2 thiết bị:
SmartBlinds(rèm, mở theo %),Thermostat(nhiệt độ). - Facade có 3 chế độ:
movie,music,gaming. Chuyển giữa các chế độ chỉ bật/tắt phần khác biệt. - Mọi thiết bị có thể lỗi (
DeviceError) với xác suất cấu hình được.
Bài 2: Macro an toàn
- Macro lỗi giữa chừng: dừng, hoàn tác các lệnh đã chạy, báo rõ thiết bị lỗi và bước lỗi.
- Nhật ký bền: mỗi lệnh ghi vào
journal.logtrước khi chạy. Mất điện (giết tiến trình) giữa macro: khởi động lại đọc nhật ký, đưa mọi thiết bị về trạng thái nhất quán (hoàn tác nửa macro dở). - Test tính chất: 1000 chuỗi lệnh ngẫu nhiên với lỗi ngẫu nhiên, sau khi hoàn tác hết thì
snapshot()bằng trạng thái ban đầu.
partyOn, thiết bị thứ 3 lỗi -> 2 thiết bị đầu được hoàn tác, báo "Amplifier lỗi ở bước 3/5"
Bài 3: Lịch và remote từ xa (nâng cao)
Scheduler: đặt lệnh chạy lúc giờ cụ thể (ví dụmovielúc 20:00). Dùng đồng hồ giả để test.- Remote từ xa: server TCP nhận lệnh dạng text, chạy qua Command. Gọi được từ 2 client cùng lúc mà không hỏng trạng thái.
DESIGN.md: sơ đồ, vai trò Facade, Command, Memento nếu dùng, cơ chế nhật ký.
✅ Tiêu chí hoàn thành
- Macro lỗi giữa chừng hoàn tác đúng.
- Giết tiến trình giữa macro, khởi động lại về trạng thái nhất quán.
- Test tính chất 1000 chuỗi pass.
- Scheduler test bằng đồng hồ giả.
❓ Câu hỏi ôn tập
- Facade che cái gì?
- Macro gồm những gì?
- Undo phải đưa máy về đâu?
- Nhật ký lệnh để làm gì?
🌕 Bạn đã hoàn thành ngày 159. Làm hết bài tập phía trên rồi sang ngày tiếp theo.