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 |