SOLID Principal
September 8, 2025
I – Interface Segregation Principle (Nguyên tắc phân tách interface)
👉 Không ép client phụ thuộc vào những method mà nó không dùng.
Thay vì tạo một interface lớn, nên tách thành nhiều interface nhỏ, chuyên biệt.
Wrong
interface Worker {
public function work();
public function eat();
}
class Human implements Worker {
public function work() { /* ... */ }
public function eat() { /* ... */ }
}
class Robot implements Worker {
public function work() { /* ... */ }
public function eat() {
// Robot không ăn → nhưng vẫn phải implement
throw new Exception("Robot không cần ăn");
}
}
Right
interface Workable {
public function work();
}
interface Eatable {
public function eat();
}
class Human implements Workable, Eatable {
public function work() { /* ... */ }
public function eat() { /* ... */ }
}
class Robot implements Workable {
public function work() { /* ... */ }
}
Lợi ích của ISP
- Interface gọn gàng, rõ ràng: Mỗi interface chỉ phục vụ một mục đích → dễ hiểu, dễ áp dụng.
- Tăng tính linh hoạt: Class có thể implement đúng cái nó cần, không bị “gánh” code thừa.
- Giảm coupling: Thay đổi ở một interface nhỏ ít ảnh hưởng đến nhiều class khác.
- Hỗ trợ unit test tốt hơn: Mock một interface nhỏ dễ dàng hơn so với một interface khổng lồ.
- Tái sử dụng dễ hơn: Một interface nhỏ có thể dùng lại trong nhiều context khác nhau.
Bất cập / Khó khăn
- Quá nhiều interface nhỏ: Nếu tách quá mức → sinh ra cả “rừng interface”, khó quản lý.
- Khó hiểu cho người mới: Người mới vào dự án có thể thấy “interface nhiều quá”, không biết nên dùng cái nào.
- Dễ nhầm lẫn với SRP: Vì ISP cũng nhấn mạnh việc “chia nhỏ trách nhiệm”, dễ khiến dev mới nhầm nó với Single Responsibility Principle.
- Điểm khác biệt:
- SRP nói về class (mỗi class một trách nhiệm).
- ISP nói về interface (mỗi interface chuyên biệt, không ép client cài đặt thừa).
- Điểm khác biệt:
- Tốn effort thiết kế: Với dự án nhỏ hoặc đơn giản, việc tạo nhiều interface có thể không cần thiết, gây chậm tiến độ.

