¿Cuál de los principios SOLID te resulta más difícil de aplicar en la práctica?
sobes.tech AI
Respuesta de la IA
Principio de sustitución de Barbara Liskov (LSP).
La dificultad radica en que la violación del LSP no siempre es evidente a simple vista y puede revelarse solo al usar subclases en un contexto donde se espera el comportamiento de la clase base. Esto requiere una comprensión profunda del comportamiento previsto de la clase base y pruebas exhaustivas.
Ejemplo de violación:
class Rectangle {
var width: Double = 0
var height: Double = 0
func setWidth(_ width: Double) { self.width = width }
func setHeight(_ height: Double) { self.height = height }
func area() -> Double { width * height }
}
class Square: Rectangle {
override func setWidth(_ width: Double) {
super.setWidth(width)
super.setHeight(width) // Violación del LSP: cambiar el ancho afecta la altura
}
override func setHeight(_ height: Double) {
super.setHeight(height)
super.setWidth(height) // Violación del LSP: cambiar la altura afecta el ancho
}
}
Si se usa Square donde se espera Rectangle, el comportamiento de Square al cambiar solo un lado (ancho o alto) conducirá a resultados impredecibles, ya que la clase base Rectangle no tiene tal comportamiento.
Para evitar violaciones del LSP, a menudo es necesario repensar las jerarquías de clases, usar composición en lugar de herencia o introducir interfaces/protocolos más abstractos. Esto puede agregar complejidad en el diseño en las etapas iniciales.
Tabla comparativa:
| Principio SOLID | Descripción breve | Principal dificultad en aplicar el LSP |
|---|---|---|
| S (SRP) | Una clase - una razón para cambiar | Encontrar la "única razón" |
| O (OCP) | Abierto para extensión, cerrado para modificación | Uso correcto de abstracciones |
| L (LSP) | Las subclases deben ser reemplazables por las clases base | La no evidencia de violaciones, requiere entender el contrato de la clase base |
| I (ISP) | Los clientes no deben depender de métodos no utilizados | División de interfaces |
| D (DIP) | Dependencia de abstracciones, no de implementaciones concretas | Inyección de dependencias |