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í |