Codigo limpio y refactorización
El Principio de Segregación de Interfaces (ISP) establece que las interfaces no deben obligar a las clases que las implementan a depender de métodos que no utilizan. En otras palabras, es mejor tener múltiples interfaces pequeñas y específicas en lugar de una única interfaz grande y general.
- ¿Por qué es importante?
Evita que las clases implementen métodos irrelevantes o vacíos, lo que reduce la complejidad, mejora la claridad y facilita el mantenimiento.
Ejemplo 1: Una Interfaz con Métodos No Relevantes
Código Malo (Violación del ISP)
Problema: La clase
Cocheestá obligada a implementar el métodovolar, que no tiene sentido para un coche. Esto viola el ISP al hacer queCochedependa de un método que no necesita.
1public interface Vehiculo { 2 void acelerar(); 3 void volar(); 4} 5 6public class Coche implements Vehiculo { 7 @Override 8 public void acelerar() { 9 System.out.println("El coche está acelerando"); 10 } 11 12 @Override 13 public void volar() { 14 throw new UnsupportedOperationException("Un coche no puede volar"); 15 } 16}
Código Bueno (Aplicando el ISP)
Solución: Dividimos la interfaz
Vehiculoen dos:Vehiculo(que incluyeacelerar) yVehiculoVolador(que incluyevolar). Ahora las clases solo implementan los métodos relevantes.
1public interface Vehiculo { 2 void acelerar(); 3} 4 5public interface VehiculoVolador { 6 void volar(); 7} 8 9public class Coche implements Vehiculo { 10 @Override 11 public void acelerar() { 12 System.out.println("El coche está acelerando"); 13 } 14} 15 16public class Avion implements Vehiculo, VehiculoVolador { 17 @Override 18 public void acelerar() { 19 System.out.println("El avión está acelerando"); 20 } 21 22 @Override 23 public void volar() { 24 System.out.println("El avión está volando"); 25 } 26}
Ejemplo 2: Una Interfaz Genérica para Dispositivos
Código Malo (Violación del ISP)
Problema: La interfaz obliga a implementar métodos que no son necesarios, lo que genera código irrelevante y confuso.
1public interface Dispositivo { 2 void imprimir(); 3 void escanear(); 4} 5 6public class Impresora implements Dispositivo { 7 @Override 8 public void imprimir() { 9 System.out.println("Imprimiendo..."); 10 } 11 12 @Override 13 public void escanear() { 14 throw new UnsupportedOperationException("Una impresora no puede escanear"); 15 } 16}
Código Bueno (Aplicando el ISP)
Solución: Se dividen las responsabilidades en dos interfaces independientes (
ImpresorayEscaner). Esto permite que cada clase implemente solo los métodos que necesita.
1public interface Impresora { 2 void imprimir(); 3} 4 5public interface Escaner { 6 void escanear(); 7} 8 9public class ImpresoraBasica implements Impresora { 10 @Override 11 public void imprimir() { 12 System.out.println("Imprimiendo..."); 13 } 14} 15 16public class ImpresoraMultifuncional implements Impresora, Escaner { 17 @Override 18 public void imprimir() { 19 System.out.println("Imprimiendo..."); 20 } 21 22 @Override 23 public void escanear() { 24 System.out.println("Escaneando..."); 25 } 26}
Beneficios de Aplicar el ISP
- Menor complejidad: Las clases no están obligadas a implementar métodos irrelevantes.
- Mayor claridad: Las interfaces específicas son más fáciles de entender y usar.
- Facilidad de mantenimiento: Es más sencillo agregar nuevas funcionalidades sin modificar clases existentes.
Siguiendo el Principio de Segregación de Interfaces, tu código será más modular, limpio y enfocado en las necesidades reales de cada clase. 😊
- Loading...