SOLID ilkelerinde 'L' harfi neyi temsil eder?
sobes.tech yapay zeka
AI'dan gelen yanıt
Barbara Liskov'un Yerine Koyma Prensibi (Liskov Yerine Koyma Prensibi).
Bu prensibe göre, bir programdaki nesneler, programın doğruluğunu değiştirmeden alt tiplerinin örnekleriyle değiştirilebilir olmalıdır.
Başka bir deyişle, eğer B sınıfı A sınıfının bir alt tipiyse, o zaman programdaki herhangi bir A tipi nesne, B tipi bir nesneyle değiştirilebilir ve program doğru şekilde çalışmaya devam eder.
Bu prensip, kalıtım ile çalışırken yan etkileri en aza indirerek daha esnek ve dayanıklı bir mimari oluşturmaya yardımcı olur.
LSP İhlali:
class Rectangle {
var width: Double
var height: Double
init(width: Double, height: Double) {
self.width = width
self.height = height
}
var area: Double {
return width * height
}
}
class Square: Rectangle { // Kare, dikdörtgenin bir alt tipidir
override var width: Double {
didSet {
height = width // Genişlik değiştiğinde yükseklik de değişir
}
}
override var height: Double {
didSet {
width = height // Yükseklik değiştiğinde genişlik de değişir
}
}
init(side: Double) {
super.init(width: side, height: side)
}
}
func calculateArea(of rectangle: Rectangle) -> Double {
return rectangle.area
}
let myRectangle = Rectangle(width: 5, height: 10)
print(calculateArea(of: myRectangle)) // 50
let mySquare = Square(side: 5)
// Bu, 5x5 alanına sahip bir dikdörtgen olduğunu varsayıyoruz.
// Ancak, onu `Rectangle` bekleyen bir fonksiyonda kullanırken,
// genişlik veya yükseklik değiştirilirse,
// davranışı beklenmedik olabilir, çünkü Square her iki kenarı da aynı anda değiştirir.
// Bu örnekte, eğer yapılandırmadan sonra özellikler değiştirilmezse,
// sonuç 25 olur, ancak örneğin, mySquare.width = 10
// before calling calculateArea, alan 100 olur, bu da
// Rectangle ile çalışan kodlar için beklenmedik olabilir.
print(calculateArea(of: mySquare)) // 25
Örnekte, Square LSP'yi ihlal eder çünkü bir ölçüyü (width veya height) değiştirmek diğerini de değiştirir. Eğer Square nesnesi, Rectangle beklendiği yerde kullanılırsa, bu beklenmedik davranışlara yol açabilir, çünkü Rectangle ile çalışan kod, kenarların bağımsız olarak değiştirilebileceğini varsayabilir.
LSP'ye Uygunluk:
Bu durumda LSP'yi sağlamak için, hiyerarşiyi bölmek veya Square için kalıtım yerine bileşimi kullanmak mümkündür. Örneğin, alanı olan şekiller için ortak bir arayüz veya protokol tanıtıp, bunu Rectangle ve Square'da uygulayabiliriz.
protocol Shape {
var area: Double { get }
}
class Rectangle: Shape {
var width: Double
var height: Double
init(width: Double, height: Double) {
self.width = width
self.height = height
}
var area: Double {
return width * height
}
}
class Square: Shape {
var side: Double
init(side: Double) {
self.side = side
}
var area: Double {
return side * side
}
}
func calculateShapeArea(of shape: Shape) -> Double {
return shape.area
}
let myShapeRectangle: Shape = Rectangle(width: 5, height: 10)
print(calculateShapeArea(of: myShapeRectangle)) // 50
let myShapeSquare: Shape = Square(side: 5)
print(calculateShapeArea(of: myShapeSquare)) // 25
Artık Square ve Rectangle, ortak Shape protokolünü uygular ve her iki sınıfın nesnelerini, Shape beklendiği yerde kullanabiliriz, böylece beklenen davranış ihlal edilmez.