Harun Özer


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

<< Dependency Inversion Principle | PostgreSQL nedir?>>

Interface Segregation Principle

Yazar harunozer 04 November 2013

Interface Segregation Principle Interface Segregation Principle bir sınıf bir arayüzü uyguluyor ise, o sınıf o arayüzde tanımlı bütün metotları kullanmasını gerektiğini önerir.

Eğer işlemler kendi içlerinde de ayrılıyor ise base interface kullanılarak işlemler dağıtılır. Örneğin farklı veri tabanlarını destekleyen ve veri tabanı işlemlerini yerine getiren bir uygulama yazıyoruz. Sql Server stored procedure yi destekliyor fakat Access desteklemiyor. Bunun için Access ve SqlServer ın ortak desteklediği metotların tanımlı olduğu bir interface tanımlanır. Sadece sql serverin desteklediği özellikler için başka bir interface tanımlanır ve;  sadece Access in desteklediği özellikler için farklı bir interface tanımlanır. Bu arayüzleri gerçekleştirecek sınıflar da hem ortak özellikleri tanımladığımız arayüzü hemde tipini göre uygun olan arayüzü uygular.

Örnek bir uygulama ile Interface Segregation PrensibininInterface Segregation Principle (Arayüz ayırma prensibi) gerekliliğini daha iyi anlayalım. Örneğin ürünleri ve kullanıcıları veri tabanında tutan ve ürünlerin resimlerinin yükleneceği bir uygulama geliştiriyor olalım. Kodun uzamaması için Veri tabanı işlemi olarak sadece ekle olduğunu varsayalım. Uygulamamızın class diyagramı ve kodları aşağıdaki gibidir.

Interface Segregation Prensibi

 

    interface IProcess
    {
        void Ekle();
        void ResimYukle();
    }
 
    class UrunDbProcess : IProcess
    {
        public void Ekle()
        {
            Console.WriteLine("Urun Ekle");
        }
 
 
        public void ResimYukle()
        {
            Console.WriteLine("Urun Resim Yükle");
        }
    }
 
    class KullaniciDbProcess : IProcess
    {
        public void Ekle()
        {
            Console.WriteLine("Kullanıcı Ekle");
        }
 
 
        public void ResimYukle()
        {
            throw new NotImplementedException();
        }
    }
 
Kodumuzda görüldüğü gibi KullanıcıProcess sınıfında yapamayacağı bir iş tanımlanmış ve hata fırlatmıştır. Bu durum Interface Segregation prensibine ve Liskov Substitution prensibine aykırıdır. Burada yapmamız gereken ürün ve kullanıcı için ortak olan Ekle işlevini ayrı bir arayüzde, sadece ürün için olan ResimYukle işlevini ayrı bir arayüzde tanımlamak ve urun sınıfında bu iki arayüzü de uygulamaktır. Uygulamamızın Interface Segregation prensibine göre düzenlenmiş hali aşağıdaki gibidir.
 
Interface Segregation Prensibi
 
    interface IDbPRocess
    {
        void Ekle();
    }
 
    interface IResimProcess
    {
        void ResimYukle();
    }
 
    class KullaniciProcess : IDbPRocess
    {
        public void Ekle()
        {
            Console.WriteLine("Kullanıcı Ekle");
        }
    }
 
 
    class UrunProcess : IDbPRocess, IResimProcess
    {
        public void Ekle()
        {
            Console.WriteLine("Ürün Ekle");
        }
 
        public void ResimYukle()
        {
            Console.WriteLine("Resim Yükle");
        }
    }
 
Böylece daha sağlam ve mantıklı bir kod tasarımı yapmış olduk. Her sınıfta sadece desteklediği metotlar tanımlı ve sınıfların uyguladıkları arayüzlere bakarak bile hangi işlemleri desteklediklerini görebiliyoruz. 
 
Böylece tasarım prensipleri yazı dizimizi de noktalamış oluyoruz. :)
 
Örnek uygulama kodlarını aşağıdaki linkten indirebilirsiniz.

InterfaceSegregationPrinciple_Sample.rar

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

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