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) Զависимость աբստրակցիաներից, ոչ կոնկրետ իրագործումներից Զարգացման ներդրում