Sobes.tech
Senior

Melyik SOLID elv alkalmazása a legnehezebb számodra a gyakorlatban?

sobes.tech MI

Válasz az MI-től

Barbara Liskov helyettesítési elve (LSP).

A kihívás abban rejlik, hogy az LSP megsértése nem mindig nyilvánvaló első pillantásra, és csak akkor derülhet ki, ha az alosztályokat olyan kontextusban használjuk, ahol a bázisklassz viselkedését várjuk el. Ez mély megértést igényel a bázisklassz várt viselkedéséről és alapos tesztelést.

Szabálysértés példája:

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) // LSP megsértése: a szélesség változtatása hatással van a magasságra
    }

    override func setHeight(_ height: Double) {
        super.setHeight(height)
        super.setWidth(height) // LSP megsértése: a magasság változtatása hatással van a szélességre
    }
}

Ha a Square-t olyan helyen használjuk, ahol Rectangle-t várunk, a Square viselkedése, amikor csak egy oldalát (szélesség vagy magasság) változtatjuk, kiszámíthatatlan eredményekhez vezet, mivel az alap osztálynak, a Rectangle-nak nincs ilyen viselkedése.

Az LSP megsértéseinek elkerülése érdekében gyakran szükséges az osztályhierarchiák újragondolása, kompozíció használata öröklés helyett, vagy absztraktabb interfészek/protokollok bevezetése. Ez a tervezést bonyolultabbá teheti a kezdeti szakaszokban.

Összehasonlító táblázat:

SOLID elv Rövid leírás Az LSP alkalmazásának fő kihívása
S (SRP) Egy osztály - egy ok a változtatásra "Egyszeri ok" megtalálása
O (OCP) Nyitott bővítésre, zárt módosításra Absztrakciók helyes használata
L (LSP) Az alosztályok helyettesíthetőek legyenek a bázisosztályokkal Nem nyilvánvaló megsértések, a bázisosztály szerződésének megértése szükséges
I (ISP) Az ügyfelek ne függjenek nem használt metódusoktól Interfészek felosztása
D (DIP) Absztrakciókra való függés, nem konkrét megvalósításokra Függőségek injektálása