Quale dei principi SOLID ti è più difficile applicare nella pratica?
sobes.tech AI
Risposta dell'AI
Principio di sostituzione di Barbara Liskov (LSP).
La difficoltà risiede nel fatto che la violazione del LSP non è sempre evidente a prima vista e può emergere solo utilizzando sottoclassi in un contesto in cui ci si aspetta il comportamento della classe base. Ciò richiede una comprensione approfondita del comportamento previsto della classe base e test accurati.
Esempio di violazione:
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) // Violazione del LSP: cambiare la larghezza influisce sull'altezza
}
override func setHeight(_ height: Double) {
super.setHeight(height)
super.setWidth(height) // Violazione del LSP: cambiare l'altezza influisce sulla larghezza
}
}
Se si utilizza Square dove ci si aspetta Rectangle, il comportamento di Square nel modificare un solo lato (larghezza o altezza) porterà a risultati imprevedibili, poiché la classe base Rectangle non ha tale comportamento.
Per evitare violazioni del LSP, spesso è necessario ripensare le gerarchie di classi, usare la composizione invece dell'ereditarietà o introdurre interfacce/protocollo più astratti. Questo può aggiungere complessità alla progettazione nelle fasi iniziali.
Tabella di confronto:
| Principio SOLID | Breve descrizione | Principale difficoltà nell'applicare il LSP |
|---|---|---|
| S (SRP) | Una classe - una ragione per cambiare | Trovare la "ragione unica" |
| O (OCP) | Aperto all'estensione, chiuso alla modifica | Uso corretto delle astrazioni |
| L (LSP) | Le sottoclassi devono essere sostituibili alle classi base | Non evidenza delle violazioni, richiede comprensione del contratto della classe base |
| I (ISP) | I clienti non devono dipendere da metodi inutilizzati | Divisione delle interfacce |
| D (DIP) | Dipendenza da astrazioni, non da implementazioni concrete | Iniezione delle dipendenze |