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