Клиенты не должны зависить от методов, которые они не используют или много специализированных интерфейсов лучше, чем один универсальный.
Другими словами большие интерфейсы нужно разбивать на мелкие, чтобы клиенты маленьких интерфейсов знали только о тех методах которые необходимы им в работе.
ITransformer.php
interface ISuperTransformer
{
public function toCar();
public function toPlane();
public function toShip();
}
transformers.php
class SuperTransformer implements ISuperTransformer {
public function toCar(){
echo 'transform to car';
}
public function toPlane(){
echo 'transform to plane';
}
public function toShip(){
echo 'transform to ship';
}
}
class CarTransformer implements ISuperTransformer {
public function toCar(){
echo 'transform to car';
}
public function toPlane(){
throw new Exception('i can`t transform to plane');
}
public function toShip(){
throw new Exception('i can`t transform to ship');
}
}
Как видно из кода класс CarTransformer реализует неиспользуемые функции через заглушки. Исправим код чтобы этого избежать.
ITransformer.php
interface ICarTransformer {
public function toCar();
}
interface IPlaneTransformer {
public function toPlane();
}
interface IShipTransformer {
public function toShip();
}
transformers.php
class SuperTransformer implements ICarTransformer, IPlaneTransformer, IShipTransformer {
//...
}
class CarTransformer implements ICarTransformer {
public function toCar(){
echo 'transform to car';
}
}
Теперь в классе CarTransformer ничего лишнего - что нам и ребовалось!