SOLID #4: Interface Segregation Principle con C#

En esta publicación veremos como implementar Interface Segregation Principle usando el lenguaje C#.

autor Rodríguez Patiño, Eduardo
publicado
visitas 9,217

Muchas interfaces especificas son mejores que una sola interfaz.

Explicación

Un problema muy común es tener una interfaz obsesa, es decir con mucha funcionalidad y el problema radica cuando queremos hacer uso de esta tenemos métodos que no vamos a poder usar.

Ejemplo

Hagamos un ejemplo práctico con una clase repositorio para realizar tareas básicas de CRUD.

public interface IRepository 
{
    void Update();
    void Create();
    void Remove(int id);
    void Get(int id);
    void GetAll();
}
public class UserRepository : IRepository
{
    public void Create()
    {
        // ToDo
    }

    public void Remove(int id) 
    {
        // ToDo
    }

    public void Update()
    {
        // ToDo
    }

    public void Get(int id)
    {
        // ToDo
    }

    public void GetAll()
    {
        // ToDo
    }
}

¿Qué pasaría si? ..

Queremos implementar otro repositorio pero esta limitado a implementar métodos de lectura solo para lectura.

public class ReportRepository : IRepository
{
    public void Create()
    {
        throw new System.NotImplementedException();
    }

    public void Update()
    {
        throw new System.NotImplementedException();
    }

    public void Remove(int id) 
    {
        throw new System.NotImplementedException();
    }

    public void Get(int id)
    {
        // ToDo
    }

    public void GetAll()
    {
        // ToDo
    }
}

La solución

La solución es pensar en pequeñas piezas para construir componentes más modulares.

public interface IReadable 
{
    void Get(int id);
    void GetAll();

}

public interface IWriteable
{
    void Update();
    void Create();
}

public interface IRemovable
{
    void Remove(int id);
}
public class UserRepository : IReadable, IWriteable, IRemovable
{
    public void Create() { }
    public void Update() { }
    public void Remove(int id) { }
    public void Get(int id) { }
    public void GetAll() { }
}

public class ReportRepository : IReadable
{
    public void Get(int id) { }
    public void GetAll() { }
}

- Nuestros cursos -

Curso de programación orientada a objetos y principios SOLID
Curso de Azure DevOps
Curso de C# desde cero
Curso de Expresiones Regulares
Curso de Microservicios con .Net Core 3+
Curso de TypeScript desde cero