Liskov'un yerine geçme ilkesi
| SOLID |
|---|
Liskov’un yerine geçme ilkesi (İngilizce: Liskov Substitution Principle, kısaca LSP), nesne yönelimli programlamada bir yazılım bileşeninde kullanılan bir alt sınıfın, üst sınıfın yerine geçerek sistemin doğru çalışmasını sürdürebilmesi gerektiğini ifade eden bir yazılım tasarım ilkesidir. İlk kez Barbara Liskov tarafından 1987 yılında tanımlanmıştır. Bu ilke, SOLID ilkeleri adıyla bilinen beş temel yazılım mühendisliği ilkesinden biridir.[1][2]
Tarihçe
[değiştir | kaynağı değiştir]Liskov’un yerine geçme ilkesi, bilgisayar bilimci Barbara Liskov ve Jeannette Wing tarafından 1987 yılında A Behavioral Notion of Subtyping başlıklı bilimsel bildiride tanıtılmıştır.[3] Bu bildiride, alt türlerin, üst türlerin tüm davranışsal beklentilerini karşılaması gerektiği öne sürülmüş ve bu kavram, nesne yönelimli sistemlerde alt sınıfların doğru şekilde kalıtım yoluyla kullanılabilmesi için bir temel oluşturmuştur.
Bu ilke, yazılım mühendisliği dünyasında yaygınlık kazanarak, Robert C. Martin’in öncülüğünde geliştirilen SOLID ilkeleri arasında yerini almıştır.[1]
Tanım ve özellikler
[değiştir | kaynağı değiştir]Liskov’un yerine geçme ilkesi, genellikle şu şekilde özetlenir:
- "Bir programın, bir sınıfın nesneleri yerine bu sınıfın alt sınıflarının nesneleri kullanıldığında, programın doğruluğu bozulmadan çalışmaya devam etmesi gerekir."[3]
Özellikleri
[değiştir | kaynağı değiştir]- Alt sınıf, üst sınıfın tüm davranışsal beklentilerini karşılamalıdır.
- Alt sınıf, üst sınıfın arayüzünü genişletebilir, ancak değiştiremez.
- Alt sınıflar, üst sınıftan devralınan fonksiyonların ön koşullarını daraltmamalı, sonuçlarını ise genişletmemelidir.[4]
Örnek: Dikdörtgen–Kare Problemi
[değiştir | kaynağı değiştir]LSP’ye klasik bir ihlal örneği, “dikdörtgen–kare problemi” olarak bilinir. Kare, geometrik olarak dikdörtgenin özel bir hâli olsa da yazılım dünyasında bu ilişki kalıtımla ifade edildiğinde istenmeyen durumlar ortaya çıkabilir:
class Dikdortgen {
protected double genislik;
protected double yukseklik;
public void setGenislik(double g) { this.genislik = g; }
public void setYukseklik(double y) { this.yukseklik = y; }
public double alanHesapla() { return genislik * yukseklik; }
}
class Kare extends Dikdortgen {
@Override
public void setGenislik(double g) {
super.setGenislik(g);
super.setYukseklik(g);
}
@Override
public void setYukseklik(double y) {
super.setGenislik(y);
super.setYukseklik(y);
}
}
Bu örnekte, kullanıcılar `setGenislik()` ve `setYukseklik()` yöntemlerinin birbirinden bağımsız olduğunu varsayar. Ancak `Kare` sınıfı bu varsayımı bozar, dolayısıyla LSP ihlali gerçekleşmiş olur.
Yazılım tasarımına etkileri
[değiştir | kaynağı değiştir]LSP, nesne yönelimli programlamada kalıtım hiyerarşisinin doğru kurulmasını sağlar. İlkenin uygulanması şu faydaları getirir:
- Kodun yeniden kullanılabilirliğini artırır.
- Alt sınıfların üst sınıfların yerine kullanılabilir olmasını garanti eder.
- Bakımı kolay ve genişletilebilir yazılım sistemleri oluşturulmasına katkı sağlar.[5]
Tartışmalar ve eleştiriler
[değiştir | kaynağı değiştir]LSP, yazılım mühendisliğinde önemli bir yer edinmiş olsa da bazı durumlarda katı yorumlanmasının tasarımı zorlaştırabileceği ileri sürülmüştür.[6] Özellikle davranışsal açıdan karmaşık soyutlamalarda, alt sınıfların tüm üst sınıf beklentilerini karşılaması zor olabilir. Bu nedenle modern yazılım tasarım yaklaşımlarında kalıtım yerine bileşen kullanımı (composition) ya da arayüz temelli tasarım önerilmektedir.
Kaynakça
[değiştir | kaynağı değiştir]- ^ a b Martin, Robert C. (2002). Agile Software Development: Principles, Patterns, and Practices. Prentice Hall. ISBN 9780135974445.
- ^ Robert C. Martin (2000). "The Liskov Substitution Principle". Object Mentor. 21 Aralık 1996 tarihinde kaynağından arşivlendi. Erişim tarihi: 11 Mayıs 2025.
- ^ a b Liskov, Barbara; Wing, Jeannette (1987). "A Behavioral Notion of Subtyping". ACM Transactions on Programming Languages and Systems.
- ^ Meyer, Bertrand. Object-Oriented Software Construction. ISBN 9780136291480.
- ^ Freeman, Eric; Robson, Elisabeth (2004). Head First Design Patterns. O'Reilly Media. ISBN 9780596007126.
- ^ Martin Fowler (2003). "Liskov Substitution Principle". Erişim tarihi: 11 Mayıs 2025.