SOLID принциптеринин кайсысы сиз үчүн практикалык жактан эң кыйын?
sobes.tech AI
AIден жооп
Барбара Лисковдун алмаштыруу принциби (LSP):
Кыйынчылык — LSP бузулушу биринчи көз карашта ачык көрүнбөйт жана ал негизги класстын күтүлгөн жүрүм-турумун колдонуу шартында гана аныкталышы мүмкүн. Бул негизги класстын күтүлгөн жүрүм-турумун терең түшүнүүнү жана так тестирлөөнү талап кылат.
Бузуу мисалы:
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 бузуу: кеңдиктин өзгөрүшү бийиктикке таасир этет
}
override func setHeight(_ height: Double) {
super.setHeight(height)
super.setWidth(height) // LSP бузуу: бийиктиктин өзгөрүшү кеңдикке таасир этет
}
}
Эгер Square колдонсоңуз, ал жерде Rectangle күтүлүп жатканда, Square-дин жүрүм-туруму бир гана тарапты (кеңдик же бийиктик) өзгөртүүнү күтүп, натыйжада алдын ала көрүлбөгөн натыйжаларга алып келет, анткени негизги класс Rectangle мындай жүрүм-турумга ээ эмес.
LSP бузулуштарын алдын алуу үчүн көбүнчө класстардын хиерархиясын кайра карап чыгуу, мурастоону ордуна композицияны колдонуу же көбүрөөк абстракттуу интерфейстер/протоколдорду киргизүү керек. Бул долбоорлоодо кыйынчылыктарды кошушу мүмкүн.
Салыштыруу таблицасы:
| SOLID принциби | Кыскача сүрөттөө | LSP колдонууда негизги кыйынчылык |
|---|---|---|
| S (SRP) | Бир класс — бир себеп | "Бир себеп" табуу |
| O (OCP) | Кеңейтүүгө ачык, өзгөртүүгө жабык | Абстракцияларды туура колдонуу |
| L (LSP) | Подкласстар негизги класстарга алмаштырылышы керек | Бузулуштарды көрүү кыйынчылыгы, негизги контрактты түшүнүү талап кылынат |
| I (ISP) | Кардарлар колдонбогон методдорго көз каранды болбошу керек | Интерфейстерди бөлүү |
| D (DIP) | Абстракциялардан көз каранды болуу, конкреттүү ишке ашыруулардан эмес | Түшүрүү |