SOLID - Segregación de Interfaces

El Interface Segregation Principle (ISP) o Principio de Segregación de Interfaces establece que “ningún cliente debería verse forzado a depender de métodos que no utiliza”.

En términos más simples, el ISP sugiere que en lugar de tener una interfaz grande que todos los clientes deben implementar, es mejor tener varias interfaces pequeñas específicas para cada cliente.

¿Segregación y Dependencia?

Segregación: Dividir interfaces grandes en más pequeñas y específicas.

Dependencia: Los clientes solo deben conocer las partes que realmente necesitan y usan.

El Interface Segregation Principle apunta a reducir las dependencias innecesarias entre los clientes y las abstracciones, lo que lleva a sistemas más desacoplados y fáciles de refactorizar, cambiar y desplegar.

¿Por qué es importante entonces el Interface Segregation Principle?

Flexibilidad: Menos dependencias lleva a un sistema más flexible.

Mantenibilidad: Las modificaciones son más fáciles ya que los cambios en una interfaz no afectan a clientes que no la usan.

Claridad: Las interfaces pequeñas y bien definidas son más fáciles de entender y usar correctamente.

Síntomas de que no se cumple

Podemos identificar cuándo no estamos respetando el Interface Segregation Principle:

  • Clases que implementan interfaces pero solo usan algunos de los métodos proporcionados.
  • Cambios en una interfaz afecta a clientes que no usan los métodos modificados.
  • Dificultad para entender qué métodos de una interfaz son relevantes para un cliente.

Ejemplo

Imaginemos un sistema para gestionar trabajadores en una empresa.

Sin Interface Segregation Principle:

Tenemos una interfaz Worker que incluye todo lo que un trabajador podría hacer.


    public interface Worker {
      void work();
      void eat();
      void takeBreak();
      // … otros métodos
    }
                    

Algunos trabajadores no necesitan todos estos métodos, pero están forzados a implementarlos de todos modos.

Con Interface Segregation Principle:

Dividimos Worker en varias interfaces más pequeñas y específicas.


    public interface Workable {
        void work();
    }
    
    public interface Eatable {
        void eat();
    }
    
    public interface Breakable {
        void takeBreak();
    }
                      

Ahora, cada tipo de trabajador solo implementa las interfaces que corresponden a sus responsabilidades.

Conclusiones:

Al implementar el Interface Segregation Principle, aseguramos que los clientes solo dependan de las interfaces que realmente utilizan, lo que reduce el acoplamiento y mejora la cohesión del sistema.

Esto facilita cambios y mejoras, y hace que el sistema sea más comprensible y mantenible.

Resumen:

El Principio de Segregación de Interfaces es crucial para crear sistemas flexibles y mantenibles. Promueve la creación de interfaces pequeñas y específicas que los clientes pueden implementar sin verse sobrecargados por métodos innecesarios. Al seguir el Interface Segregation Principle, mejoramos la claridad y reducimos el riesgo de efectos secundarios no deseados ante cambios, haciendo que el sistema sea más fácil de entender, extender y modificar.