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

  1. Ổ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.
  2. Dễ mở rộng: Thêm tính năng mới chỉ cần viết class mới (plug-and-play).
  3. 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ỡ.
  4. Hỗ trợ testing: Dễ mock/replace khi dùng interface hoặc abstraction.

Bất cập khi sử dụng

  1. 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ề.
  2. 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.
  3. 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ý.
  4. 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ì.
Pages: 1 2 3 4 5 6