ISP – Principio de Segregación de Interfaces

En esta cuarto post sobre los principios SOLID vamos a hablar sobre el principio ISP (Interface Segregation Principle).

Lo que nos dice este principio es bastante simple, y es que “los clientes no deberían ser forzados a depender de interfaces que ellos no usan”.

Básicamente lo que nos quiere decir este principio es que las clases que implementen una interfaz o una clase abstracta no deberían estar obligados a utilizar partes que no van a utilizar.

Veamos un ejemplo que esté violando este principio (aclaro que el ejemplo no tiene demasiado sentido, pero es útil para comprender el tema). Supongamos que tenemos la clase abstracta Proceso:

public abstract class Proceso
{
    public abstract void Iniciar();
    public abstract void Suspender();
    public abstract void Reanudar();
    public abstract void Finalizar();
}

Siguiendo con el ejemplo anterior vamos a trabajar con procesos (refiriéndonos con proceso a un tipo de tarea a llevar a cabo). En este definimos cuatro métodos, el primero y el último para iniciar y terminar el proceso, y el segundo y tercero para suspenderlo y reiniciarlo (estos dos últimos suponiendo que quien lo lleva a cabo la tarea es una persona y que debe cortar con la misma para descansar).

Ahora bien, supongamos que tenemos dos tipos de procesos (siguiendo con el ejemplo del post anterior) : unos van a ser manuales (ejecutado por personas) y otros automatizados (ejecutados por máquinas el 100% del tiempo):

public class Manual : Proceso
{
    public override void Iniciar()
    {
        //...
    }
    public override void Suspender()
    {
        //...
    }
    public override void Reiniciar()
    {
        //...
    }
    public override void Finalizar()
    {
        //...
    }
}

public class Automaizado : Proceso
{
    public override void Iniciar()
    {
       //...
    }
    public override void Suspender()
    {
        throw new NotImplementedException();
    }
    public override void Reiniciar()
    {
        throw new NotImplementedException();
    }
    public override void Finalizar()
    {
       //...
    }
}

En el proceso manual todos los métodos son implementados pero en el proceso automatizado los métodos suspender y reiniciar no son implementados, ya que las máquinas no necesitan tomarse un descanso y por lo tanto es necesario suspenderlo.

Como podemos ver en este caso estamos violando el principio ISP, ya que estamos obligando a una clase a implementar métodos que no va a utilizar.

Una solución a este problema es dividir un poco las cosas y crear, por ejemplo, una interfaz que tenga definida las cuestiones propias de los procesos manuales:

public interface IManuable
{
    public abstract void Suspender();
    public abstract void Reiniciar();
}

De esta forma la clase Proceso ahora tiene los métodos que son generales a todos los subtipos de procesos y evitamos a los procesos automatizados a implementar métodos que no les son útiles:

public abstract class Proceso
{
   public abstract void Iniciar();
   public abstract void Finalizar();
}

public class Manual : Proceso, IManuable
{
   public override void Iniciar()
   {
       //...
   }
   public override void Suspender()
   {
       //...
   }
   public override void Reiniciar()
   {
       //...
   }
   public override void Finalizar()
   {
       //...
    }
}

public class Automaizado : Proceso
{
   public override void Iniciar()
   {
       //...
   }
   public override void Finalizar()
   {
       //...
   }
}

En la próxima entrega vamos a estar hablando del último principio que nos queda.

Anuncios

Un comentario en “ISP – Principio de Segregación de Interfaces

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s