SOLID - Liskov’s Substitution - Liskov’un Değişikliği Prensibi

Solid Prensipleri'nin ilkesi olan Liskov’s Substitution - Liskov’un Değişikliği Prensibi (LSP) 

                                                        

İlk önce üstteki görselde ne anlatılmak istendiğine bakalım. Resimde bulunan sağdaki oyuncak ördek, soldaki ördek gibi görünüyor olabilir, fakat ördek gibi ötmesi için pile ihtiyaç vardır. Pilsiz çalışamayacağı için yanlış bir abstraction yapmış olmuş olabiliriz.

LSP'ye göre; alt sınıflardan oluşan nesnelerin üst sınıfın nesneleri ile yer değiştirdikleri zaman, aynı davranışı sergilemelidir. Yani alt sınıflar, üst sınıflar tarafından verilen bütün özellikleri kullanabilmesi gerekir. 

Liskov's Subsititution Prensibi, Open Closed Prensibi'nin genişletilmiş versiyonudur.

Open Closed Prensibini hatırlamak gerekirse, sınıflar veya modüller genişletilmeye açık değiştirilmeye kapalı olmalıdır. Bunu interface'de bir metot oluşturduktan sonra yeni bir özellik için  bir class oluşturduktan sonra o interface'yi miras alarak yeni özellik eklemiştik.

Bu prensibe göre interface'de tanımladığımız metotlar hiçbir hata, exception'a uğramadan bütün sınıflarda çalıştırılabilmelidir. Interface'yi miras alan sınıflar, interface'ye ait metotları ezmek zorundadır.

Gelin bunu bir örnekle açıklayalım.

İki adet telefon modelimiz var: Nokia 3310 ve Samsung Galaxy S8

Samsung Galaxy S8, Mail, SMS ve MMS gönderebilirken, Nokia 3310, Mail gönderme işlemi yapamaz. Interface yapısını yetenek olarak düşünebiliriz. Telefon modellerimizin sınıflarını tanımlayalım ve Mail, SMS, MMS gönderme yeteneklerini de bir ITelefon adında interface'de toplayalım.
    public interface ITelefon
    {
        string MailGonder();
        string SMSGonder();
        string MMSGonder();
    }

    public class Nokia3310 : ITelefon
    {
        public string MailGonder()
        {
            throw new NotImplementedException();
        }

        public string MMSGonder()
        {
            return "MMS Gönderildi";
        }

        public string SMSGonder()
        {
            return "SMS Gönderildi";
        }
    }

    public class SamsungGalaxyS8 : ITelefon
    {
        public string MailGonder()
        {
            return "Mail Gönderildi";
        }

        public string MMSGonder()
        {
            return "MMS Gönderildi";
        }

        public string SMSGonder()
        {
            return "SMS Gönderildi";
        }
    }

Nokia 3310 ve Samsung Galaxy S8 sınıfları ITelefon interface'sini miras aldı. Fakat ITelefon interface'sine ait metotları implement etmek zorunda olduğu için ve Nokia 3310 mail gönderme özelliği olmadığı için hata fırlatacaktır. Bu olay LSP'ye ters düşmektedir.

Bu sorunu çözmenin yolu Mail,SMS,MMS gönderme yetenekleri için ayrı ayrı interface oluşturmaktır.

Liskov’s Substitution Prensibine uygun kodlarımız.
    public interface IMail
    {
        string MailGonder();
    }
    public interface ISMS
    {
        string SMSGonder();
    }
    public interface IMMS
    {
        string MMSGonder();
    }
    public class Nokia3310 : ISMS, IMMS
    {
        public string MMSGonder()
        {
            return "MMS Gönderildi";
        }

        public string SMSGonder()
        {
            return "SMS Gönderildi";
        }
    }

    public class SamsungGalaxyS8 : ISMS, IMMS,IMail
    {
        public string MailGonder()
        {
            return "Mail Gönderildi";
        }
        public string MMSGonder()
        {
            return "MMS Gönderildi";
        }

        public string SMSGonder()
        {
            return "SMS Gönderildi";
        }
    }

IMail, ISMS ve IMMS adında üç adet interface oluşturduk ve bu interfaceler içerisine gerekli işleri yapacak metotları ekledik.

Nokia 3310 ve Samsung Galaxy S8 sınıfları ise ilgili özelliklere sahip interface'leri miras aldı ve implement işlemlerini yaptı. 
  • Nokia 3310, ISMS ve IMMS interface'lerini; 
  • SamsungGalaxyS8 ise  ISMS,IMail ve IMMS interface'lerini miras aldı.
Not: Liskov, Barbara Liskov adında bir Amerikalı bilgisayar bilimcidir ve bu prensibe ismini veren bir kişidir.

Yorumlar

Yorum Gönder