Sobes.tech
Senior

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