Interface Segregation
El principio de Segregación de Interfaces (ISP, por sus siglas en inglés) es un principio de diseño de programación que se basa en que una clase no debería ser obligada a implementar métodos que no utilizará. Es decir, las interfaces deben ser lo más pequeñas y específicas posibles, de manera que una clase solo tenga que implementar los métodos que realmente necesita.
Ejemplos en Java:
-
Un ejemplo común es el uso de una interfaz Document y una clase PDF. La interfaz Document tiene métodos para imprimir, escribir y leer un archivo, pero la clase PDF solo necesita implementar los métodos de escribir y leer. En este caso, se debería crear una interfaz específica para la escritura y lectura de PDFs en lugar de forzar a la clase PDF a implementar métodos innecesarios.
-
Otro ejemplo seria una interfaz Automovil y una clase Electrico. Automovil tiene metodos como encender, apagar y cambiar velocidad, pero la clase Electrico solo necesita implementar los métodos encender y apagar. En este caso, se debería crear una interfaz específica para los automoviles electricos en lugar de forzar a la clase Electrico a implementar métodos innecesarios.
-
Un último ejemplo es una interfaz Servicio y una clase Mensajeria. Servicio tiene métodos para enviar correos, mensajes de texto y realizar llamadas, pero la clase Mensajería solo necesita implementar los métodos para enviar correos y mensajes de texto. En este caso, se debería crear una interfaz específica para servicios de mensajería en lugar de forzar a la clase Mensajería a implementar métodos innecesarios.
Aquí te dejo un ejemplo en Java que ilustra el uso del principio de Segregación de Interfaces. En este ejemplo se tiene una interfaz Shape, que es la interfaz principal y dos interfaces específicas: Drawable y Resizable.
interface Shape {
double getArea();
}
interface Drawable {
void draw();
}
interface Resizable {
void resize(double factor);
}
class Circle implements Shape, Drawable {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
public double getArea() {
return Math.PI * radius * radius;
}
public void draw() {
System.out.println("Dibujando círculo");
}
}
class Square implements Shape, Drawable, Resizable {
private double side;
public Square(double side) {
this.side = side;
}
public double getArea() {
return side * side;
}
public void draw() {
System.out.println("Dibujando cuadrado");
}
public void resize(double factor) {
side *= factor;
}
}
public class Main {
public static void main(String[] args) {
Shape circle = new Circle(5);
Shape square = new Square(10);
System.out.println("Area del círculo: " + circle.getArea());
System.out.println("Area del cuadrado: " + square.getArea());
((Drawable) square).draw();
((Resizable) square).resize(0.5);
System.out.println("Nueva area del cuadrado: " + square.getArea());
}
}
Aquí te dejo un ejemplo en Java que ilustra cómo romper el principio de Segregación de Interfaces. En este ejemplo se tiene una interfaz Shape, que es la interfaz principal y una clase Circle.
interface Shape {
double getArea();
void draw(); // Método que no todas las formas necesitan implementar
void resize(double factor); // Método que no todas las formas necesitan implementar
}
class Circle implements Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
public double getArea() {
return Math.PI * radius * radius;
}
public void draw() {
System.out.println("Dibujando círculo");
}
public void resize(double factor) {
radius *= factor;
}
}
public class Main {
public static void main(String[] args) {
Shape circle = new Circle(5);
System.out.println("Area del círculo: " + circle.getArea());
circle.draw(); // El círculo no necesita dibujarse
circle.resize(0.5); // El círculo no necesita redimensionarse
System.out.println("Nueva area del círculo: " + circle.getArea());
}
}
En este ejemplo, la interfaz Shape tiene métodos para dibujar y redimensionar una forma, pero no todas las clases necesitan implementarlos.
https://howtodoinjava.com/best-practices/solid-principles/#ISP
https://www.baeldung.com/java-interface-segregation
https://www.javaguides.net/2018/02/interface-segregation-principle.html