SOLID Prensipleri — Liskov Substitution Principle
SOLID prensiplerini açıkladığım yazı serisinin üçüncüsü olan “Liskov Substitution Principle” kavramını açıklayacağım. Bir önceki yazımda Open-Closed Principle kavramından bahsetmiştim.
Öncelikle prensibimizin türkçesine baktığımızda karşılaştığımız anlam Liskov’un Yerine Geçme Prensibi anlamına gelmektedir. Anlamını değerlendirdiğimizde tam olarak kavram gözümüzde canlanamayabilir. Aslında anlatılmak istenen o kadar karmaşık değil. Prensibimizin amacı, alt seviyedeki nesnelerin, üst sınıftaki nesneler ile yer değişitirebilmesine dayanıyor. Alt seviye bir sınıf, üst seviyesi olan sınıf ile aynı şekilde davranmalı ve üst sınıfın sahip olduğu özellikleri kullanmalıdır. Bu prensibimizden faydalanırken Interfaces kullanmamız gerekir.
Prensibimizi bir kod örneği ile açıklamadan önce bu prensibimizin yaratıcısına değinmek istiyorum.
Barbara Liskov için yazılım dünyasını değiştirmiş desek abartmış olmayız. Liskov Substitution Principle’ ın mucididir. Amerika Birleşik Devletleri’nde bilgisayar bilimi doktorası sahibi ilk kadınlardan biridir. Bu sitede kendisi hakkında biraz daha fikir edinmemizi sağlayan bir biyografisi mevcut.
“What is wanted here is something like the following substitution property: If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.”
— Barbara Liskov, Data Abstraction and Hierarchy
Evet son olarak bu muhteşem insanın nesne yönelimli programlamaya kazandırdığı bu prensibi bir kod örneği ile açıklamaya.
Örneğimiz şöyle olsun, elimizde ki veriyi Database, XML ve Excell formatında okuma ve yazma işlemi yapabildiğimiz bir örnek çalışması. Burada prensibimizi anlamak için örneğimizde şöyle bir pürüz oluşturuyoruz. Verimizi XML formatında kaydedemediğimizi varsayalım. Yani XML data source’da kayıt yapamayacağız. Bu yüzden üç farklı kayıt için ortak özellik olanları bir abstract classta tanımlayacağız. Farklılık yapacağımız özelliğimizi interface olarak tanımlamamız gerekiyor.
Prensibimize göre farklı olan özelliğimiz için (XML formatında veri yazılamaması) sürekli if veya try-catch kavramlarını kullanırsak bunun sonun olmayacağını savunuyor. Bu yüzden farklı olan özelliğimiz için Write methoduna sahip interface oluşturduk.
XMLDataSource sadece DataSource abstract class’ından miras alıyor. Sebebi bu classımızda sadece Read methodunu gerçekleştiriyoruz. DBDataSource ve ExcellDataSource için hem abstract classımız DataSource hem de IDataWritable adlı interface miras alınır. Böylelikle kayıt gerçekleştirmek istediğimiz üç farklı yöntemde if ve try-catch kullanmadan bir karmaşaya girmeden örneğimizi tamamlamış oluyoruz. Bu örneğimizde Write methodunu çalıştırmak için Main classında dataWriter üzerinden Write methoduna ulaşarak çalıştırabiliriz.
Yukarıda ki basit bir kod örneği ile Liskov Substitution Principle’ı açıklamaya çalıştım umarım anlaşılır ve faydalı olur. Bir sonraki yazım Interface Segregation Principle olacak. İyi okumalar.