#Nguyên tắc cốt lõi
👉 Open for extension – Closed for modification
👉 Rule:
- Không sửa code cũ
- Thêm behavior bằng class mới
#Bad Example (if/else hell)
if ($type === 'credit_card') {}
if ($type === 'paypal') {}
#Vấn đề
- Mỗi lần thêm feature → sửa code cũ
- Dễ gây regression bug
- Vi phạm OCP
#Good Example (Strategy Pattern)
interface PaymentMethod {
public function process(Money $amount): PaymentResult;
}
👉 Mỗi payment = 1 class
#Giải thích sâu (Senior mindset)
#1. OCP thực sự giải quyết vấn đề gì?
👉 Tránh sửa code đã chạy ổn định
#2. Extension point là gì?
👉 Nơi cho phép thêm behavior
#3. OCP + DIP
👉 Interface là nền tảng để mở rộng
#4. Strategy Pattern = OCP điển hình
#5. Plugin architecture
👉 Register dynamic behavior
#Tips & Tricks
#1. Tránh switch/if theo type
#2. Dùng polymorphism
#3. Identify change axis
👉 Thứ nào hay thay đổi → tách ra
#4. Combine với DI container
#5. Không over-engineer
👉 Chỉ áp dụng khi có nhiều variation
#Interview Questions
1. OCP là gì?
Summary:
- Mở rộng không sửa code
Deep: Thêm class mới thay vì modify class cũ
2. Tại sao if/else vi phạm OCP?
Summary:
- Phải sửa code
Deep: Mỗi feature mới → modify
3. Pattern nào thường dùng cho OCP?
Summary:
- Strategy
4. Khi nào không cần OCP?
Summary:
- Code đơn giản
5. OCP liên quan DIP không?
Summary:
- Có
Deep: Phải có abstraction mới mở rộng được
#Kết luận
👉 OCP giúp:
- Giảm bug production
- Dễ mở rộng
- Dễ maintain
👉 Nhưng:
- Tránh over-design