Capstone: SimUDuck refactor toàn diện

Refactor đàn vịt bằng Strategy và Observer, thêm hành vi bay mới lúc chạy và thử thách khách hàng đổi yêu cầu phút chót.
KhóDesign pattern ~120 phút

Giới thiệu

Bạn sửa đàn vịt bị rối code. Mỗi hành vi thành khối riêng dễ thay.

Kiến thức cần nhớ

Strategy là gì

  • Strategy gói mỗi cách làm thành một khối riêng.
  • Định nghĩa: vịt giữ hành vi, muốn đổi thì thay khối.
  • Ví dụ đời thường: giống thay đầu tuốc-nơ-vít cho một cán.
  • Thêm kiểu bay mới không cần sửa code vịt cũ.

Observer là gì

  • Observer là một bên đổi, nhiều bên tự biết.
  • Ví dụ đời thường: giống nhóm chat, một tin cả nhóm thấy.
  • Vịt đăng ký theo dõi rồi nhận tin tự động.
  • Nhớ hủy đăng ký khi không cần nữa.

Refactor an toàn

  • Refactor là sửa cấu trúc mà giữ nguyên cách chạy.
  • Ví dụ đời thường: giống sắp lại tủ mà đồ vẫn đủ.
  • Mỗi bước nhỏ xong phải chạy lại kiểm thử.
  • Yêu cầu đổi phút chót thì chỉ thay khối hành vi.
# strategy bay đơn giản
class BayCanh:  # khối bay bằng cánh
    def bay(self):
        return "vỗ cánh"  # cách bay này
class Vit:
    def __init__(self, cach_bay):
        self.cach_bay = cach_bay  # cắm khối bay vào
    def thuc_hien_bay(self):
        return self.cach_bay.bay()  # dùng khối đã cắm

Ví dụ

  • Vịt cao su không bay -> cắm khối bay "không bay".
  • Muốn bay tên lửa -> chỉ thay khối bay mới.

💻 Bài tập

Ngôn ngữ: C++17 (hoặc Java). Dùng code ngày 6, 9, 108, 116. Nộp vào day-157-capstone/.

Bài 1: SimUDuck hoàn chỉnh

Gộp mọi phần về vịt đã làm thành 1 codebase:

PatternVai trò
StrategyFlyBehavior, QuackBehavior, đổi lúc chạy
ObserverNhà nghiên cứu, bảng đếm nghe tiếng kêu
DecoratorQuackCounter
Abstract FactoryDuckFactory, CountingDuckFactory
AdapterGooseAdapter, PigeonAdapter
Composite + IteratorFlock lồng nhau

Có test cho từng pattern. Độ phủ test (gcov/lcov hoặc JaCoCo) trên 85%.

Bài 2: Yêu cầu đổi phút chót

Thực hiện 4 yêu cầu, mỗi yêu cầu 1 commit, ghi git diff --stat:

  1. Thêm vịt SolarDuck: chỉ bay được khi SunSensor::isDay() trả true.
  2. Nhà nghiên cứu chỉ muốn nghe vịt thuộc đàn "Hồ Tây".
  3. Đếm riêng tiếng kêu theo loại vịt.
  4. Bay bằng tên lửa tiêu tốn nhiên liệu: hết nhiên liệu thì chuyển sang FlyNoWay tự động.

Mỗi yêu cầu chỉ thêm file mới hoặc sửa tối đa 1 file cũ. Nếu phải sửa nhiều hơn, ghi lý do và đề xuất cải thiện thiết kế.

Bài 3: Review và tài liệu (nâng cao)

  1. Nhờ 1 người (bạn học, đồng nghiệp) review code, hoặc tự review sau 1 ngày. Ghi lại 5 góp ý và cách xử lý.
  2. DESIGN.md: sơ đồ lớp đầy đủ, bảng pattern, 3 chỗ bạn cố tình không dùng pattern và vì sao.
  3. So số dòng code và số lớp với bản ngày 6. Giải thích phần tăng thêm mua được gì.

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

  • Độ phủ test trên 85%.
  • 4 yêu cầu đổi, mỗi cái sửa tối đa 1 file cũ (hoặc có giải thích).
  • DESIGN.md có mục "không dùng pattern".
  • Có 5 góp ý review và cách xử lý.

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

  1. Strategy tách cái gì ra?
  2. Observer báo tin cho ai?
  3. Refactor khác viết mới ở đâu?
  4. Thêm hành vi mới sửa chỗ nào?

🌕 Bạn đã hoàn thành ngày 157. 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.