Liskov Substitution Principle


Liskov Substitution Principle

Liskov Substitution prensibi diğerlerine göre anlaşılması biraz daha zor olan bir prensiptir. 1988 yılında Barbara Liskov tarafından "Data Abstraction and Hierarchy" adlı kitabında bu prensibi yayınlamıştır.

Barbara Liskov ve Uncle Bob'un açıklamaları biraz kafa karıştırıcı olduğu için en kısa yoldan ve en anlaşılabilir şekilde prensibi anlatmaya çalışacağım.

Öncelikle bu konu için bana göre yapılmış en iyi açıklama Türkay Ürkmez'in açıklamasıdır.

"Aynı temel sınıftan türeyen tüm sınıflar, birbirlerinin yerine kullanılabilir olmalıdır. Bu yer değiştirme durumunda, sınıfa özel bir istisna kesinlikle oluşmamalıdır."

Şimdi kendi açımdan ele alırsam bu prensibi şöyle açıklayabilirim.

"Üst sınıf ile alt sınıf arasında davranış açısından hiçbir fark olmamalıdır, birbirlerinin yerine kullanılabilir olmalıdır."

Biraz daha kafada şekillenmeye başladı gibi. Şimdi bir örnek üzerinden LSP'yi açıklamaya devam edelim.

Öncelikle "Car" adlı bir abstract class oluşturalım. İçerisinde "Run" ve abstract olarak "OpenAc" adında iki adet metot bulundursun. Kalıtım aldığımızda "Run" metodu ile araba çalıştırılacak,"OpenAc" ile klima açılacak.



Şimdi bir tane "Porsche" ve bir tane "Kartal" adında iki sınıf oluşturup, "Car" class'ı ile kalıtım alalım. Şu an herşey normal gidiyor gibi gözüküyor fakat ortada bir sorun var. Porsche klima özelliğine sahipken Kartal bu özelliğe sahip değildir. "OpenAc" abstract bir metot olarak tanımlandığı içinde bunu override etmek zorundayız. Bu durumda "NotImplementException" hatası alacağız veya return null diyerek hataya by-pass uygulayacağız.



Hadi diyelim return null dedik ve günü kurtardık ama büyük bir proje ekibi ile çalışıyorsak ve bir yazılımcı arkadaşımız şöyle bir kod yazarsa.



Bu başımıza büyük işler açabilir. Peki bu durumu nasıl düzeltebiliriz ? Şimdi çözüme bakalım.

Problem neydi her arabada klima olmayabilir. Bu yüzden bunu bir özellik olarak ele alırsak yapacağımız şey "OpenAc" metodunu bir Interface ile ayırıp ilgili sınıfa implement edersek problemi çözmüş oluruz. Yani elimizde aşağıdaki şekilde bir yapı olur.



Böylece Prosche için klima özelliğini eklemişken, Kartal için bu özelliği tanımlamadık. Bu sayede base class içinde ki kodu derived class'a zorla implement etmedik ve LSP'yi başarılı şekilde uygulamış olduk.

Yorumlar