Sobes.tech
Senior

Ktorý z princípov SOLID vám je v praxi najťažší?

sobes.tech AI

Odpoveď od AI

Princíp náhrady Barbary Liskov (LSP).

Komplexnosť spočíva v tom, že porušenie LSP nie je vždy zrejmé na prvý pohľad a môže sa odhaliť iba pri použití podtried v kontexte, kde sa očakáva správanie základnej triedy. To vyžaduje hlboké pochopenie predpokladaného správania základnej triedy a dôkladné testovanie.

Príklad porušenia:

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) // Porušenie LSP: zmena šírky ovplyvňuje výšku
    }

    override func setHeight(_ height: Double) {
        super.setHeight(height)
        super.setWidth(height) // Porušenie LSP: zmena výšky ovplyvňuje šírku
    }
}

Ak použijete Square tam, kde sa očakáva Rectangle, správanie Square pri zmene len jednej strany (šírky alebo výšky) povedie k nepredvídateľným výsledkom, pretože základná trieda Rectangle také správanie nemá.

Na zabránenie porušeniam LSP je často potrebné prehodnotiť hierarchiu tried, použiť kompozíciu namiesto dedičnosti alebo zaviesť abstraktnejšie rozhrania/protokoly. To môže pridať zložitosť do návrhu na počiatočných etapách.

Tabuľka porovnania:

Princíp SOLID Krátky popis Hlavná zložitosť pri použití LSP
S (SRP) Jeden trieda - jeden dôvod na zmenu Nájsť "jediný dôvod"
O (OCP) Otvorený na rozšírenie, zatvorený na modifikáciu Správne použitie abstrakcií
L (LSP) Podtriedy by mali byť nahraditeľné základnými triedami Nezrejmosť porušení, požiadavka pochopenia kontraktu základnej triedy
I (ISP) Klienti by nemali závisieť od nepoužívaných metód Rozdelenie rozhraní
D (DIP) Závislosť od abstrakcií, nie od konkrétnych implementácií Zavedenie závislostí