Sobes.tech
Senior

Kura no SOLID principiem jums ir visgrūtāk piemērot praksē?

sobes.tech AI

Atbilde no AI

Barbaras Liska aizvietošanas princips (LSP).

Grūtības ir tajā, ka LSP pārkāpums dažreiz nav acīmredzams pirmajā acu uzmetienā un var tikt atklāts tikai, izmantojot apakšklases kontekstā, kur sagaidāma pamatklases uzvedība. Tas prasa dziļu izpratni par pamatklases paredzēto uzvedību un rūpīgu testēšanu.

Pārkāpuma piemērs:

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 pārkāpums: platuma izmaiņas ietekmē augstumu
    }

    override func setHeight(_ height: Double) {
        super.setHeight(height)
        super.setWidth(height) // LSP pārkāpums: augstuma izmaiņas ietekmē platumu
    }
}

Ja izmanto Square tur, kur sagaidāms Rectangle, Square uzvedība, mainot tikai vienu pusi (platumu vai augstumu), radīs neparedzamus rezultātus, jo pamatklase Rectangle tam nav paredzējusi.

Lai novērstu LSP pārkāpumus, bieži ir nepieciešams pārskatīt klases hierarhiju, izmantot kompozīciju vietā mantošanu vai ieviest vairāk abstraktus interfeisus/protokolus. Tas var pievienot sarežģītību projektēšanā sākotnējās stadijās.

Salīdzinājuma tabula:

SOLID princips Īss apraksts Galvenā LSP piemērošanas grūtība
S (SRP) Viena klase - viena iemesla dēļ Atklāt "vienu iemeslu"
O (OCP) Atvērts paplašināšanai, slēgts modifikācijai Pareiza abstrakciju izmantošana
L (LSP) Apakšklases jābūt aizvietojamām ar pamatklasēm Nevienkāršība pārkāpumu atklāšanā, nepieciešama izpratne par līgumu
I (ISP) Klienti nedrīkst būt atkarīgi no neizmantotām metodēm Interfeisu sadalīšana
D (DIP) Atkarība no abstrakcijām, nevis no konkrētām realizācijām Atkarību ieviešana