Interface Segregation Principle (ISP - Nguyên tắc Phân tách Giao diện)

“Client chỉ nên phụ thuộc vào những gì mà nó CẦN.”

Khi triển khai interface, đừng làm nó quá “rộng” cover mọi trường hợp. Thu hẹp sao cho các class con không cần triển khai các hành vi mà nó không cần. Mục đích: sửa một phương thức ở interface không gây lỗi tới các class con không đụng tới phương thức đó.

Ví dụ: động vật di chuyển

Mèo và cá đều bơi được(?), nhưng cá không chạy được; mèo và chim chạy được, nhưng mèo không bay được. Nếu triển khai một Interface lớn Moveable gồm swim(), fly(), run() → Cat phải implement cả fly(), Fish phải implement run(). Rủi ro khi interface thay đổi khiến Cat/Fish gặp lỗi.

<?php
// ❌ Trước: một interface "rộng"
interface Moveable {
    public function move();
}
class Cat implements Moveable {
    public function move() { echo "Cat runs"; }
}
class Fish implements Moveable {
    public function move() { echo "Fish swims"; }
}
 
// ✅ Sau: chia nhỏ thành ba interface
interface Flyable  { public function fly(); }
interface Runnable { public function run(); }
interface Swimmable { public function swim(); }
 
class Cat implements Runnable {
    public function run() { echo "Cat runs"; }
}
class Fish implements Swimmable {
    public function swim() { echo "Fish swims"; }
}
class Bird implements Flyable {
    public function fly() { echo "Bird flies"; }
}

Giờ mỗi class con chỉ implement interface mà nó cần - hạn chế tối đa rủi ro.

Liên quan