-- Tasarım Kalıpları ve Prensipleri

Arayüz Ayırma Prensibi – Interface Segregation Principle (ISP)

Birbiriyle ilişkisiz birden çok metodu içeren büyük bir interface yerine, ilişkili metotları içeren birden fazla küçük interface sınıfı daha makbuldür. Bir interface sınıfına haddinden fazla sorumluluk yüklemek o sınıfı uygulayan(implement) diğer sınıflara da aynı sorumluluğu yüklemek anlamına gelir. ISP’ye göre, bir sınıf ihtiyaç duymadığı metotları uygulamak zorunda bırakılmamalıdır. 

Bu prensibe aykırı davranarak aşağıdaki Dokuman sınıfını ve Yazdır,Tara,Faksla metotlarını içeren IMachine arayüzünü yazdım.

public class Dokuman
{
    
}
 
public interface IMakine
{
    void Yazdır(Dokuman d);
    void Tara(Dokuman d);
    void Faks(Dokuman d);
}
 
public class CokIslevliMakine : IMakina
{
    public void Yazdır(Dokuman d)
    {
        // Yazdır
    }
 
    public void Tara(Dokuman d)
    {
       // Tara
    }
 
    public void Faks(Dokuman d)
    {
        // Faksla
    }
}

CokIslevliMakine sınıfı, günümüz modern fotokopi makineleri gibi barındırdığı üç işlevi de karşılıyor olabilir. Ancak biz tüm bu sorumlulukları bir interface üzerine yüklediğimizde, bu sorumluluklardan tek birine ihtiyaç duyduğumuz zaman bile interface’in barındırdığı tüm metotları uygulamak zorunda kalıyoruz.

Örneğin; sadece Yazdır işlevini üstlenen bir Yazıcı sınıfı oluşturmak istediğimizde, interface’in yanında gelen Faks ve Tara gibi sorumlulukları(metot içerisinde exception fırlatılsa bile) uygulamamız gerekiyor.

public class Yazıcı : IMakine
{
    public void Yazdır(Dokuman d)
    {
        // Yazdırma işlevi.
    }
 
    public void Tara(Dokuman d)
    {
        throw new NotImplementedException();
    }
 
    public void Faks(Dokuman d)
    {
        throw new NotImplementedException();
    }
}

Bunun yerine IYazıcı, ITarayıcı ve IFaksMakinesi gibi üç ayrı interface sınıfı oluşturup her birine ilgili sorumlulukları yükleyerek, mesela Tarayıcı sınıfının Faks sorumluluğunu üstlenmemesini sağlayabiliriz.

public interface IYazici
 {
     void Yazdir(Dokuman d);
 }
 
 public class Yazici : IYazici
 {
     public void Yazdir(Dokuman d)
     {
         // Yazdırma işlevi
     }
 }
 
 public interface ITarayici
 {
     void Tara(Dokuman d);
 }
 
 public class Tarayici : ITarayici
 {
     public void Tara(Dokuman d)
     {
         // Tarama işlevi
     }
 } 
 
 public interface IFaksMakinesi
 {
     void Faks(Dokuman d);
 }
 public class FaksMakinesi : IFaksMakinesi
 {
     public void Faks(Dokuman d)
     {
         // Fakslama işlevi
     }
 }

Arayüzleri, dolayısıyla sorumlulukları bu şekilde ayırdığımızda, bu arayüzleri uygulayan sınıflar, aslında işine yaramayan sorumlulukları üstlenmez. Eğer ilk örnekteki gibi bir CokIslevliMakine sınıfına ihtiyaç duyulursa bu küçük arayüzleri tek tek uygulamak yerine hepsini uygulayan büyük bir arayüz oluşturulabilir.

public interface ICokIslevliMakine : IFaksMakinesiITarayiciIYazici
{
 
}
 
public class CokIslevliMakine : ICokIslevliMakine
{
    public void Faks(Dokuman d)
    {
       // Faks işlevi
    }
 
    public void Tara(Dokuman d)
    {
       // Tarama işlevi
    }
 
    public void Yazdir(Dokuman d)
    {
        // Yazdirma işlevi
    }
}
Bunu paylaş :

Yorum bırak

Yorum