Harun Özer


Proje veya dijital katalog yaptırmak için
iletişim formu doldurabilirsiniz..

<< Single Responsibility Principle | Dependency Inversion Principle>>

Liskov Substitution Principle - Liskov Yerdeğiştirme Prensibi

Yazar harunozer 31 October 2013

Liskov Substitution Principle - Liskov Yerdeğiştirme Prensibi Liskov Substitution Principle MIT programlama metodolojileri grup liderliği yapan Barbara Liskov tarafından öne sürülmüştür.

Liskov Substitution prensibine göre aynı nesneden türeyen nesneler birbirlerinin yerine geçtiğinde aynı şekilde kullanılmalı hiçbir istisna fırlatmamalıdır. Yani diyelim ki X arayüzünü tanımladık. Bu arayüzde de M1,M2,M3 metotları tanımlı. X den türeyen S1,S2 sınıflarının hepsi bu metotları kullanmalı ve geriye istisna (exception) fırlatmamalıdır.

Örnek bir uygulama ile Liskov Substitution prensibini daha iyi anlamaya çalışalım. Diyelim ki uygulamamızda iki yazıcı modeli var. Bunlardan Yazici1 sınıfı yazıcı ve tarayıcı özelliği olan Yazici2 sınıfı ise sadece yazıcı özelliği olan bir sınıf olsun. İlk önce Liskov Substitution prensibine aykırı olarak kodlamamızı yapalım. Hatalı tasarımın class diagramı ve kodları aşağıdaki gibidir.

    interface FonksiyonelYazici
    {
        void Yazdir();
        void Tara();
    }
 
    class Yazici1 : FonksiyonelYazici
    {
        public void Yazdir()
        {
            Console.WriteLine("Yazici1 Yazdır");
        }
 
        public void Tara()
        {
            Console.WriteLine("Yazici1 Tara");
        }
    }
 
    class Yazici2 : FonksiyonelYazici
    {
        public void Yazdir()
        {
            Console.WriteLine("Yazici2 Yazdır");
        }
 
        public void Tara()
        {
            throw new Exception("Yazici2 sınıfının tarayıcı özelliği yoktur.");
        }
    }
 
    class YaziciProcess
    {
        FonksiyonelYazici FK;
        public YaziciProcess(FonksiyonelYazici yazici)
        {
            FK = yazici;
        }
 
        public void Yazdir()
        {
            FK.Yazdir();
        }
 
        public void Tara()
        {
            if (!(FK is Yazici2))
                FK.Tara();
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            YaziciProcess p = new YaziciProcess(new Yazici1());
            p.Yazdir();
            p.Tara();
 
            p = new YaziciProcess(new Yazici2());
            p.Yazdir();
            p.Tara();
 
            Console.ReadKey();
        }
    } 
 
Yazıcı2 sınıfı tarama özelliği olmamasına rağmen FonksiyonelYazici arayüzünü uyguladığı için Tara metodunu ezmek zorundadır. Bu yüzden istisna fırlatılır veya YaziciProcess sınıfında tip kontrolü yapılır. Bu durum Liskov Substitution prensibine aykırıdır. Bu yapı aynı zamanda Open Closed prensibine de aykırıdır. Çünkü yeni bir sınıf eklenildiğinde YaziciProcess sınıfında düzenleme yapmak gerekecektir. Şimdi kodumuzu Liskov Substitution prensibine göre düzenleyelim.
 

 

Bu yapıda Yazdir ve Tara işlevlerini farklı arayüzlerde tanımlayıp IFonksiyonelYazici arayüzünü de bu arayüzlerden türettik. İşlemleri kullanan sınıflarımızı da ayırdık. Yazici1 sınıfı fonksiyonel olduğundan IFonksiyonelYazici arayüzünü uyguluyor. Yazici2 sadece yazdırmayı desteklediğinden IYazici arayüzünü uyguluyor. Sisteme sadece tarayıcı özellikli bir makine de tanımlanacağında ITarayici arayüzünü uygulaması yeterli olacaktır. Liskov Substitution prensibine göre uygulamamızın kodu aşağıdaki gibi olacaktır.
 
    interface IYazici
    {
        void Yazdir();
    }
 
    interface ITarayici
    {
        void Tara();
    }
 
    interface IFonksiyonelYazici : IYazici, ITarayici
    {
 
    }
 
    class Yazici1 : IFonksiyonelYazici
    {
        public void Yazdir()
        {
            Console.WriteLine("Yazici1 Yazdır");
        }
 
        public void Tara()
        {
            Console.WriteLine("Yazici1 Tara");
        }
    }
 
    class Yazici2 : IYazici
    {
        public void Yazdir()
        {
            Console.WriteLine("Yazici2 Yazdır");
        }
    }
 
    class YaziciProcess
    {
        IYazici Y;
        public YaziciProcess(IYazici Yazici)
        {
            Y = Yazici;
        }
 
        public void Yazdir()
        {
            Y.Yazdir();
        }
    }
 
    class TarayiciProcess
    {
        ITarayici T;
        public TarayiciProcess(ITarayici Tarayici)
        {
            T = Tarayici;
        }
 
        public void Tara()
        {
            T.Tara();
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
 
            YaziciProcess yp = new YaziciProcess(new Yazici1());
            yp.Yazdir();
 
            yp = new YaziciProcess(new Yazici2());
            yp.Yazdir();
 
            TarayiciProcess tp = new TarayiciProcess(new Yazici1());
            tp.Tara();
 
            Console.ReadKey();
        }
    }
 
Örnek uygulamayı aşağıdaki linkden indirebilirsiniz.
 

Liskov_Substitution_Principle_Sample.rar

Tam Sayfa
Tags Tasarım Prensipleri,
Kategoriler Tasarım Prensipleri
İşlemler
Bu Makale 5  Kez Beğenildi.
İsim :    
e-Mail :    
Web Site :  
İmage :  
Güvenlik Kodu :  

Güvenlik Resmi
Resmi Yenile
    
Yorum :  
Tasarım Desenleri ve Mimarileri