SOLID Principal
September 8, 2025
O – Open/Closed Principle (Nguyên tắc mở/đóng)
Mở cho việc mở rộng, đóng cho việc chỉnh sửa.
- Bạn có thể thêm chức năng mới mà không cần sửa code cũ.
- Đạt được điều này nhờ kế thừa hoặc interface.
interface Shape {
public function area(): float;
}
class Circle implements Shape {
private $radius;
public function __construct($r) { $this->radius = $r; }
public function area(): float { return pi() * $this->radius ** 2; }
}
class Square implements Shape {
private $side;
public function __construct($s) { $this->side = $s; }
public function area(): float { return $this->side ** 2; }
}
Muốn thêm Triangle thì chỉ cần implement Shape mà không sửa code cũ.
Lợi ích của việc sủ dụng OCP
- Ổn định cho code cũ: Code đã chạy ổn thì không cần sửa → giảm rủi ro phát sinh bug.
- Dễ mở rộng: Thêm tính năng mới chỉ cần viết class mới (plug-and-play).
- Tái sử dụng code tốt hơn: Phần cũ đóng vai trò nền tảng, phần mới xây dựng thêm mà không phá vỡ.
- Hỗ trợ testing: Dễ mock/replace khi dùng interface hoặc abstraction.
Bất cập khi sử dụng
- Over-Engineering: Nếu áp dụng OCP quá sớm, code có thể bị “nhiều abstraction thừa”, làm phức tạp dự án nhỏ.
- Ví dụ: Một project nhỏ chỉ có 1–2 loại Shape thì tạo Shape interface là hơi nặng nề.
- Nhiều class/file: Việc luôn “mở để mở rộng” tạo ra rất nhiều class nhỏ → khó quản lý nếu không có convention rõ ràng.
- Khó đọc cho người mới: Người mới vào team sẽ thấy code “toàn interface và abstract class”, khó theo dõi luồng xử lý.
- Trade-off giữa đơn giản và linh hoạt:
- Với hệ thống nhỏ, code “đóng” (sửa trực tiếp) có thể nhanh hơn.
- Với hệ thống lớn, OCP cực kỳ quan trọng để scale và bảo trì.

