Seguimos con el cuarto de los principios S.O.L.I.D.

Este principio introducido por el propio Robert Martin se define de la siguiente forma:

Clients should not be forced to depend upon interfaces that they do not use. - Clientes no deben ser forzados a depender de interfaces que no usen.

Este principio nos habla de las interfaces pesadas o contaminadas, esas que tienen una gran cantidad de métodos. Si un cliente implementa esa interface pues tendrá que declarar métodos que no necesita y los cuales estarán evidentemente vacíos.

Cuando esto sucede es porque tenemos interfaces que no son cohesivas y lo mejor es dividirlas de manera funcional, es decir vamos a agrupar los métodos según su funcionalidad, así el cliente solo implementara la interface que necesite realmente. Pienso que es mejor hacer un esfuerzo adicional en nuestra fase de diseño a fin de tener un estructura mas funcional y flexible en nuestro software.

Pasemos a un ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
public interface Worker{ 
   void trabajar(); 
   void descansar(); 
} 

public class Trabajador implements Worker {
   public void trabajar() { 
      // Codigo de trabajar 
   }
   
   public void descansar() { 
      // Codigo de descansar 
   } 
}


Aquí la empresa tiene trabajadores que harán operaciones como trabajar y descansar.

Bien que pasaría si ahora la empresa tiene un robot que implementa esta interface Worker, entonces el robot esta obligado a tener un método descansar() que evidentemente no usara. Pues aquí lo que podemos hacer es aplicar este principio de segregar las interfaces.

Usaremos una para trabajar y otra para descansar.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public interface Workable{ 
   void trabajar(); 
} 

public interface Pausable{ 
   void descansar(); 
} 

public class Trabajador implements Workable, Pausable{
   public void trabajar() { 
      // Codigo de trabajar 
   } 
   
   public void descansar() { 
      // Codigo de descansar 
   } 
}

public class Robot implements Workable{
   public void trabajar() { 
      // Codigo de trabajar 
   } 
} 


Como vemos hemos separado las interfaces, nuestro trabajador implementara las dos necesarias para el y el robot solo la que necesita en este caso la de trabajar().


Franky Villadiego

Volando hacia el desarrollo productivo!