Project: rạp hát Facade và Command macro

Đề xây mặt tiền rạp hát hai nút và remote macro mở tiệc có hoàn tác, kèm rubric chấm bốn mức.
Chuyên giaDesign pattern ~120 phút

Giới thiệu

Bài này xây mặt tiền rạp hát 2 nút và remote mở tiệc. Làm xong bạn sẽ gom thao tác rối thành nút bấm gọn.

Kiến thức cần nhớ

Đề bài rạp hát

  • Có 6 thiết bị: máy chiếu, màn, âm thanh, đầu đĩa, đèn, bỏng ngô.
  • Yêu cầu 1: xem phim chỉ còn 2 nút xem và kết thúc.
  • Yêu cầu 2: 1 nút mở tiệc bật cả phòng, 1 nút hoàn tác.
  • Ví dụ đời thường: 1 nút bấm mở cả rạp phim mini tại nhà.

Facade gom 10 bước thành 2 nút

  • Facade là mặt tiền gọi đúng thứ tự 10 bước giúp bạn.
  • Bấm xem: bật tuần tự từ bỏng ngô tới đầu đĩa rồi chạy.
  • Bấm kết thúc: tắt theo thứ tự ngược lại.
  • Cửa tinh chỉnh vẫn mở để người sành chỉnh tay từng máy.

Macro và hoàn tác

  • Macro giữ danh sách lệnh nhỏ, chạy tuần tự như 1 lệnh.
  • Mỗi lệnh nhỏ lưu trạng thái cũ trước khi chạy.
  • Hoàn tác chạy ngược thứ tự để trả về đúng ban đầu.
  • Ví dụ đời thường: 1 nút mở tiệc bật đèn nhạc máy lạnh cùng lúc.
Tiêu chíĐạtChưa đạt
Mặt tiền2 nút đủ 10 bước đúng thứ tựNgười dùng vẫn gọi thẳng máy
MacroDanh sách lệnh nhỏ chạy tuần tự1 lệnh khổng lồ ôm hết
Hoàn tácLưu cũ, trả ngược thứ tựĐoán ngược không lưu gì

Ví dụ

  • Input: bấm xem khi tất cả đang tắt. Output: 6 thiết bị lên đúng thứ tự, phim chạy.
  • Giải thích: mặt tiền gọi đủ 10 bước không sót bước nào.
  • Input: chạy macro mở tiệc rồi hoàn tác. Output: cuối cùng 6 máy về đúng trạng thái trước tiệc.
  • Giải thích: hoàn tác ngược thứ tự dùng trạng thái đã lưu.

💻 Bài tập

Ngôn ngữ: C++17 (hoặc Java). Đây là project, dành 90 phút. Dùng lại code ngày 31 và 81. Nộp vào day-125-hometheater/.

Bài 1: Facade cho rạp hát

6 thiết bị: PopcornPopper, TheaterLights, Screen, Projector, Amplifier, StreamingPlayer. Mỗi thiết bị có trạng thái đọc được (bật/tắt, âm lượng, độ sáng...).

HomeTheaterFacade::watchMovie(movie) và endMovie() như ngày 31. Thêm:

  • listenToMusic(playlist): chỉ bật đèn 60%, amp, player.
  • Gọi watchMovie khi đang nghe nhạc: chuyển đúng, không bật lại thiết bị đang bật.
  • Người dùng vẫn gọi thẳng amp.setVolume(20) được.

Bài 2: Macro tiệc có hoàn tác

  1. partyOn là MacroCommand gồm: đèn dim 30%, amp bật âm lượng 11, player bật playlist, bỏng ngô bật.
  2. Mỗi lệnh nhỏ lưu trạng thái trước khi chạy. Hoàn tác chạy ngược thứ tự và trả về đúng trạng thái đó.
  3. Remote có 4 khe: movie (lệnh gọi Facade), music, party, off. Có undo nhiều bước.
Trạng thái ban đầu: đèn 80%, amp tắt
partyOn; undo -> đèn 80%, amp tắt (không phải "đèn 100%")
movie; party; undo; undo -> mọi thiết bị về trạng thái ban đầu

Bài 3: Nhật ký và báo cáo (nâng cao)

  1. Mọi lệnh bọc bằng LoggingCommand (ngày 28). In nhật ký 1 buổi tối: 10 thao tác.
  2. snapshot() của cả rạp trả chuỗi trạng thái 6 thiết bị. Test so snapshot trước và sau mỗi cặp execute/undo.
  3. Viết README.md: sơ đồ lớp, vai trò Facade và Command, và giải thích vì sao lệnh movie gọi Facade thay vì gọi 10 thiết bị.

✅ Tiêu chí hoàn thành

  • Test chuyển từ nghe nhạc sang xem phim không bật lại thiết bị.
  • Undo trả đúng trạng thái trước, kiểm bằng snapshot().
  • Nhật ký 10 thao tác.
  • README.md có sơ đồ và giải thích.

❓ Câu hỏi ôn tập

  • Facade gom 10 bước thành 2 nút thế nào?
  • Macro chạy nhiều lệnh như 1 lệnh ra sao?
  • Hoàn tác đúng cần lưu gì?
  • Vì sao không dồn macro vào mặt tiền?

🌕 Bạn đã hoàn thành ngày 125. Làm hết bài tập phía trên rồi sang ngày tiếp theo.

Bớt paste mù, hiểu sâu từng dòng mình viết.

180 Days Challenge. 180 ngày cai nghiện vibe code.