SOLID prinsiplərindən hansı sizin üçün ən çətindir tətbiq etməkdə?
sobes.tech Süni İntellekt
AI-dan cavab
Barbara Liskov-un yerinə qoyma prinsipi (LSP).
Çətinlik odur ki, LSP pozuntusu hər zaman ilk baxışda aydın olmur və yalnız alt siniflər istifadə edilərkən, əsas sinifin gözlənilən davranışında aşkar edilə bilər. Bu, əsas sinifin nəzərdə tutulan davranışını dərindən başa düşməyi və diqqətli testləri tələb edir.
Pozuntu nümunəsi:
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 pozuntusu: eni dəyişdirmək hündürlüyə təsir edir
}
override func setHeight(_ height: Double) {
super.setHeight(height)
super.setWidth(height) // LSP pozuntusu: hündürlüyü dəyişdirmək eni təsir edir
}
}
Əgər Square istifadə edilərsə, Rectangle gözlənilən yerdə, Square-ın yalnız bir tərəfi (eni və ya hündürlüyü) dəyişdirilməsi nəticələri əvvəlcədən bilinməyən hala gətirəcək, çünki əsas sinif Rectangle belə davranışa malik deyil.
LSP pozuntularını qarşısını almaq üçün, çox vaxt sinif hierarxiyalarını yenidən düşünmək, irsi istifadə etmək əvəzinə kompozisiyanı tətbiq etmək və ya daha abstrakt interfeyslər/protokollar daxil etmək lazımdır. Bu, ilkin mərhələdə dizaynı mürəkkəbləşdirə bilər.
Müqayisəli cədvəl:
| SOLID Prinsipi | Qısa təsviri | LSP tətbiqində əsas çətinlik |
|---|---|---|
| S (SRP) | Bir sinif - dəyişiklik üçün tək səbəb | "Yeganə səbəb" tapmaq |
| O (OCP) | Genişlənməyə açıq, dəyişikliklərə qapalı | Abstraksiyaların düzgün istifadəsi |
| L (LSP) | Alt siniflər, əsas siniflərlə dəyişdirilə bilməli | Pozuntuların qeyri-aydınlığı, əsas sinifin müqaviləsini başa düşmək lazımdır |
| I (ISP) | Müştərilər, istifadə olunmayan metodlara bağlı olmamalıdır | İnterfeysləri bölmək |
| D (DIP) | Abstraksiyalara bağlılıq, konkret tətbiqlərə yox | Bağımlılıqların injeksiyası |