Sobes.tech
Senior

Který z principů SOLID je vám v praxi nejvíce obtížný?

sobes.tech AI

Odpověď od AI

Princip Liskovové náhrady (LSP).

Obtížnost spočívá v tom, že porušení LSP není vždy na první pohled zřejmé a může být odhaleno pouze při použití podtříd v kontextu, kde se očekává chování základní třídy. To vyžaduje hluboké pochopení předpokládaného chování základní třídy a důkladné testování.

Příklad porušení:

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šení LSP: změna šířky ovlivňuje výšku
    }

    override func setHeight(_ height: Double) {
        super.setHeight(height)
        super.setWidth(height) // Porušení LSP: změna výšky ovlivňuje šířku
    }
}

Pokud použijete Square tam, kde se očekává Rectangle, chování Square při změně pouze jedné strany (šířky nebo výšky) povede k nepředvídatelným výsledkům, protože základní třída Rectangle takové chování nemá.

Abychom předešli porušení LSP, je často nutné přehodnotit hierarchie tříd, použít kompozici místo dědičnosti nebo zavést abstraktnější rozhraní/protokoly. To může zvýšit složitost návrhu v počátečních fázích.

Porovnávací tabulka:

SOLID princip Krátký popis Hlavní výzva při aplikaci LSP
S (SRP) Jedna třída - jeden důvod ke změně Nalezení "jediného důvodu"
O (OCP) Otevřená pro rozšíření, uzavřená pro modifikaci Správné použití abstrakcí
L (LSP) Podtřídy by měly být zaměnitelné za základní třídy Nezřejmosti porušení, vyžaduje pochopení kontraktu základní třídy
I (ISP) Klienti by neměli záviset na nevyužívaných metodách Dělení rozhraní
D (DIP) Závislost na abstrakcích, nikoliv na konkrétních implementacích Injektáž závislostí