Este principio lo que nos dice es que divide y conquistarás pero aplicado a las interfaces.
Ejemplo
Veamos un caso en el cual tener interfaces obesas o con mucha definición de métodos sería un problema.
interface IRepository
{
function update();
function create();
function remove(int $id);
function get(int $id);
function getAll();
}
Y nuestra clase que implementará dicha interfaz será una clase de repositorio.
class UserRepository implements IRepository
{
public function create(object $obj)
{
// ToDo
}
public function remove(int $id)
{
// ToDo
}
public function update(int $id, object $obj)
{
// ToDo
}
public function get(int $id)
{
// ToDo
}
public function getAll()
{
// ToDo
}
}
¿Qué pasaría sino necesitamos todos los métodos?
Ahora supongamos que queremos un repositorio de solo lectura.
class UserReadbleRepository implements IRepository
{
public function create(object $obj)
{
throw new Exception("Cannont implemented");
}
public function remove(int $id)
{
throw new Exception("Cannont implemented");
}
public function update(int $id, object $obj)
{
throw new Exception("Cannont implemented");
}
public function get(int $id)
{
// ToDo
}
public function getAll()
{
// ToDo
}
}
Pues vamos a comenzar a arrojar excepciones para los métodos que no vamos a utilizar.
Solución
Separemos la interfaz en interfaces más pequeñas.
interface IReadable
{
public function get(int $id);
public function getAll();
}
interface IWriteable
{
public function update($id, object $obj);
public function create(object $obj);
}
interface IRemovable
{
public function remove(int $id);
}
Y nuestra repositorio de solo lectura quedaría de la siguiente manera.
class UserReadbleRepository implements IReadable
{
public function get(int $id)
{
// ToDo
}
public function getAll()
{
// ToDo
}
}