Principios SOLID PHP Edition. Hoy, el principio de segregación de Interfaces
Principios SOLID PHP Edition. Hoy: el principio de segregación de Interfaces
Estamos casi acabando la serie de artículos sobre los principios SOLID. Aquí tiene una breve explicación de cada principio para repasarlos:
- Principio de responsabilidad única (Single Responsibility): Una clase debe tener una sola razón para cambiar.
- Principio Abierto/Cerrado (Open/Closed): Una clase debe estar abierta a ampliaciones pero cerrada a modificaciones.
- Principio de sustitución de Liskov (Liskov Substitution): Deberías poder usar cualquier subclase en lugar de su clase padre.
- Principio de segregación de interfaces (Interface Segregation): Una clase no debe ser forzada a implementar una interfaz que no utiliza.
- Principio de inversión de dependencias (Dependency Inversion): Los módulos de alto nivel no deben depender de módulos de bajo nivel. Ambos deben depender de abstracciones.
Hoy vamos a centrarnos en el Principio de segregación de Interfaces. Es muy fácil de entender, lo prometo. ❤️
Este principio establece que una clase nunca debe ser forzada a implementar una interfaz que no use. Si implementa una interfaz en una clase, pero solo utiliza algunos de sus métodos, indica que estamos violando este principio. Un ejemplo:
// Bad
interface Bird {
public function fly();
public function swim();
}
class Eagle implements Bird {
public function fly() {
return "I can fly";
}
public function swim() { <- Obligado a implementar un método que no necesita
return "I can't swim";
}
}
class Penguin implements Bird {
public function fly() { <- Obligado a implementar un método que no necesita
return "I can't fly";
}
public function swim() {
return "I can swim";
}
}
En este ejemplo, la interfaz Bird
tiene dos métodos: fly
y swim
.
Las clases Eagle
y Penguin
implementa ambos métodos, pero la clase Penguin
solo debe implementar el método swim
(¿Alguna vez has visto un pingüino volando?), y Eagle
solo debería implementar el método fly
. Esto viola el Principio de Segregación de la Interfaz (Interface Segregation Principle).
Un ejemplo con la forma correcta de implementarla sería:
// Good
interface Bird {
public function fly();
}
interface Swimmer {
public function swim();
}
class Eagle implements Bird {
public function fly() {
return "I can fly";
}
}
class Penguin implements Swimmer {
public function swim() {
return "I can swim";
}
}
Ahora tenemos dos interfaces: Bird
y Swimmer
. La clase Eagle
implementa la interfaz Bird
y la clase Penguin
implementa la interfaz Swimmer
. De esta manera, estamos siguiendo el principio que estamos discutiendo. Fácil, ¿Verdad?. 😄
Espero que te haya gustado el artículo de hoy. Si tiene alguna pregunta o sugerencia, mientras añado comentarios al blog, puedes enviarme un email.
¡Nos vemos en el próximo artículo!.