Sobes.tech
Senior

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) Абстракциялардан көз каранды болуу, конкреттүү ишке ашыруулардан эмес Түшүрүү