Liskov Substitution Principle

Liskov Substitution Principle

Merhaba, software design principlere devam ediyoruz. Bir önceki yazılarda Single Responsibility Principle ve Open-Closed Principle yi yazmıştım.

Substitution , kelime anlamı olarak “yerine geçme“, “temsil etme” gibi anlamlara gelmektedir.

Bu prensip kalıtımla ilgilidir.Bize nasıl doğru bir şekilde kalıtım yapılacağını gösterir.

Hatırlarsanız kalıtımın (inheritance) temelinde ” is -a” ilişkisi vardır. Bir diğer bilinmesi gereken nota ise kalıtılan class , parent classın özelliklerine ek birkaç özellik bulundurması gerekiyordu yani child class daha gelişmiş olması gerekir. Örneğin insan bir memelidir (diğer memelilerden daha gelişmiştir) .Ama bu prensibe göre kalıtım yapmak için sadece “is-a” ilişkisi yetmez onun yanında “is -substitute to” ilişkisi de olmalıdır. yani child class parent ı temsil etmelidir.Bir başka değişle :

Engin Demiroğ hocamın da bu prensibi anlatırken dediği gibi ” Sırf birbirine benziyor diye birbiri yerine kullanma !” gerçekten tek bir cümle ile bu prensibi açıklıyor.

Örneğin , yeşil ördek de sarı ördek de bir ördektir fakat oyuncak ördek bir ördek değildir.

Diğer bir örnek, kare bir dikdörtgendir fakat kare dikdörtgeni temsil etmez.

Başka bir örnek ise , bir tane “board” classınız olduğunu düşünün (2d) oyun kodladığınız varsayın. Sonra güncellemek istediniz ve 3d board eklemek istiyorsunuz . Classınızın adı “Board3d” olsun. Eğer “Board3d” yi board tan kalıtırsanız ileride sıkıntılar ortaya çıkacaktır. Örneğin “board” classında “x” ve “y” koordinatı var ama “Board3d” de bunların üstüne y koordinatı da var ve bu koordinatları “board” classında parametre alan bir metot yazdınız “addUnit(int unit,int x,int y) ” gibi. Siz o metoda “board3d” de override edemezsiniz çünkü “board3d”de birde “z”koordinatı vardır. Sorunu çözmek için mecbur “board” classındaki metoda bir z parametre ekliyip boş geçmek zorunda kalıyorsunuz. Buda ileride sorunlar doğuracaktır.

<——Stackoverflow — ->