Kuris SOLID principas jums yra sunkiausias taikyti praktikoje?
sobes.tech AI
Atsakymas iš AI
Barbarios Lisko pakaitinio principas (LSP).
Sudėtingumas tas, kad LSP pažeidimas kartais nėra akivaizdus iš pirmo žvilgsnio ir gali būti nustatytas tik naudojant pogrupius kontekste, kuriame tikimasi pagrindinio klasės elgesio. Tai reikalauja gilios supratimo apie pagrindinio klasės numatomą elgesį ir kruopštaus testavimo.
Pažeidimo pavyzdys:
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 pažeidimas: pločio keitimas veikia aukštį
}
override func setHeight(_ height: Double) {
super.setHeight(height)
super.setWidth(height) // LSP pažeidimas: aukščio keitimas veikia plotį
}
}
Jei naudoti Square ten, kur tikimasi Rectangle, Square elgsena keičiant tik vieną kraštinę (plotį ar aukštį) sukels nenuspėjamus rezultatus, nes pagrindinis Rectangle klasė tokio elgesio neturi.
Siekiant išvengti LSP pažeidimų, dažnai reikia peržiūrėti klasių hierarchiją, naudoti kompoziciją vietoje paveldėjimo arba įvesti abstraktesnius sąsajos/protokolus. Tai gali pridėti sudėtingumo projektavimui pradžioje.
Lentelė palyginimui:
| SOLID principas | Trumpas aprašymas | Pagrindinė LSP taikymo sudėtingumas |
|---|---|---|
| S (SRP) | Viena klasė - viena priežastis keisti | Rasti "vieną priežastį" |
| O (OCP) | Atvira plėtrai, uždara keitimui | Tinkamas abstrakcijų naudojimas |
| L (LSP) | Pogrupiai turi būti pakeičiami pagrindiniais klasėmis | Neaiškumas apie pažeidimus, reikalauja suprasti pagrindinio kontrakto |
| I (ISP) | Klientai neturi priklausyti nuo nenaudojamų metodų | Sąsajų skaidymas |
| D (DIP) | Priklausomybė nuo abstrakcijų, o ne nuo konkrečių įgyvendinimų | Priklausomybių diegimas |