SOLID ilkelerinden hangisi uygulamada sizin için en zor olanıdır?
sobes.tech yapay zeka
AI'dan gelen yanıt
Barbara Liskov'un Yerine Koyma Prensibi (LSP).
Sorun, LSP ihlalinin her zaman ilk bakışta belli olmaması ve yalnızca alt sınıfların, temel sınıfın beklenen davranışının olduğu bağlamda kullanılmasıyla ortaya çıkabilmesidir. Bu, temel sınıfın öngörülen davranışını derinlemesine anlamayı ve titiz testler yapmayı gerektirir.
İhlal örneği:
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 ihlali: genişliği değiştirmek yüksekliği etkiler
}
override func setHeight(_ height: Double) {
super.setHeight(height)
super.setWidth(height) // LSP ihlali: yüksekliği değiştirmek genişliği etkiler
}
}
Square'ın, Rectangle beklendiği yerde kullanılması durumunda, Square'ın yalnızca bir kenarı (genişlik veya yükseklik) değiştirerek davranışı, temel sınıf Rectangle'ın böyle bir davranışa sahip olmaması nedeniyle, tahmin edilemez sonuçlara yol açacaktır.
LSP ihlallerini önlemek için, genellikle sınıf hiyerarşilerini yeniden düşünmek, kalıtım yerine bileşimi kullanmak veya daha soyut arayüzler/protokoller tanıtmak gerekebilir. Bu, başlangıç aşamalarında tasarımı karmaşıklaştırabilir.
Karşılaştırma tablosu:
| SOLID İlkesi | Kısa açıklama | LSP uygulamasındaki temel zorluk |
|---|---|---|
| S (SRP) | Bir sınıf - değişiklik için tek neden | "Tek neden"i bulmak |
| O (OCP) | Genişletmeye açık, değişikliğe kapalı | Soyutlamaların doğru kullanımı |
| L (LSP) | Alt sınıflar, temel sınıflar ile değiştirilebilir olmalı | İhlallerin belirsizliği, temel sınıfın sözleşmesini anlamayı gerektirir |
| I (ISP) | Müşteriler, kullanılmayan metodlara bağlı olmamalı | Arayüzleri bölmek |
| D (DIP) | Soyutlamalara bağımlılık, somut uygulamalara değil | Bağımlılık enjeksiyonu |