Interface Segregation Principle - PHP

Ejemplo de principio de segregación de interfaz con PHP.

Rodríguez Patiño, Eduardo
2020-10-01 | 278 lecturas

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
    }
}