Interface Segregation Principle - PHP

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

Rodríguez Patiño, Eduardo
2021-04-19 | 798 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
    }
}

- Nuestros cursos -

Curso de programación orientada a objetos y principios SOLID
Curso de PHP 7 y el patrón repositorio
Curso de Microservicios con .Net Core 3+
Curso de API RESTFul con Lumen
Curso de Entity Framework Core 3+
Curso de ADO.NET, Unit Of Work y patrón repositorio