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