Bỏ qua để đến nội dung
Knowledge Hub

Ghép cặp: chọn design pattern cho từng tình huống Cơ bản

Thời gian đọc ước tính: 1 phút

Phần khó của design pattern không phải là nhớ sơ đồ class, mà là nhận ra tình huống. Kéo pattern vào từng tình huống.

Sai cũng không sao: mỗi lần sai, game giải thích vì sao pattern đó gần đúng nhưng không phải. Những cặp hay nhầm nhất là Strategy với Factory, và Adapter với Facade.

Ghép cặp

Tình huống này cần pattern nào?

Mỗi tình huống dưới đây lấy từ code backend thật. Kéo pattern phù hợp nhất vào từng tình huống. Một pattern có thể dùng cho nhiều tình huống.

Mẹo: hỏi "cái gì đang thay đổi?" trước khi hỏi "pattern nào?".

Chạm Chọn đáp án ở từng tình huống. Trên máy tính có thể kéo thẻ bên dưới thả vào tình huống.

Đã giải 0/8 · sai 0 lần

1Phí ship tính khác nhau cho GHN, GHTK và đội tự giao. Đơn nào dùng hãng nào thì biết lúc runtime. Hiện tại là một switch 200 dòng.

2Code của bạn gọi Notifier.send(to, message). SDK SMS mới mua có API client.messages.create({ phoneNumber, content, brandName }) và ném lỗi theo kiểu riêng.

interface Notifier {
  send(to: string, message: string): Promise<void>;
}

3PriceService.getPrice() chậm. Cần thêm cache, log thời gian và retry, nhưng không muốn sửa PriceService, và có nơi cần bản không cache.

4Khi đơn thanh toán xong: gửi email, cộng điểm thành viên, báo kho, bắn analytics. Mỗi quý lại có team muốn thêm việc. OrderService đang gọi trực tiếp cả 4.

5Config có PAYMENT_PROVIDER=momo|vnpay|stripe. Mỗi provider cần client khởi tạo khác nhau (key, endpoint, timeout). Logic này đang lặp ở 3 nơi.

6Controller checkout phải gọi lần lượt stock, price, voucher, payment, shipping với đúng thứ tự và xử lý lỗi từng bước. Có 3 controller (web, mobile, admin) lặp lại đoạn này.

7Domain gọi FileStorage.put(key, stream). Công ty chuyển từ AWS S3 sang Google Cloud Storage. SDK của GCS có tên hàm, kiểu lỗi và cách upload stream khác hẳn.

8Marketing có giảm theo %, giảm cố định, mua 2 tặng 1, đồng giá. Tháng nào cũng có thêm kiểu mới. Mỗi voucher lưu type trong database.