Published on

Interface Segregation Principle Nedir ?

Authors
  • avatar
    Name
    Alperen Önal
    Twitter

Interface Segregation Principle (ISP), geniş ve genel arayüzlerin yerine daha küçük ve spesifik arayüzlerin kullanılmasını önerir.

Bir istemci asla kullanmadığı bir arayüzü uygulamaya zorlanmamalı veya istemciler kullanmadıkları yöntemlere bağımlı olmaya zorlanmamalıdır.

Kullanılmayan veya gereksiz olan arayüzlerin sınıflar tarafından uygulanmamasını sağlayan prensiptir.

İstemciler kullanmadıkları metodları implement etmeye zorlanmamalıdır. Geniş arayüzler yerine, küçük, spesifik arayüzler kullanılmalıdır.

Single Responsibility Principle ile benzerdir ancak SRP, sınıfların tek sorumluluğu olması ile ilgilenirken ISP, interface'lerin tek sorumluğu olması ile ilgilenmektedir.

Amaç :

  • ISP, arayüzlerin spesifik ve küçük olmasını sağlar ve bu sayede sınıflar sadece ihtiyaç duydukları arayüzleri implemente ederler.
  • Gereksiz bağımlılıklardan kaçınılmasını sağlar.

ISP ile Liskov'u da birbirinden ayırmakta güçlük çekebilirsiniz ancak ikisi farklı noktalar üzerinde durmaktadır.

Unutmayalım :

  • Liskov Prensibi, bir alt sınıfın(subclass) üst sınıfın (baseclass) tüm davranışlarını doğru şekilde devralması gerektiğini vurgular.
  • ISP ise, bir interface'in yalnızca bir sorumluluğa hizmet etmesini böylece istemcilerin kullanmadıkları özelliklerin implement edilmesi gerektiğini vurgular.

Özetle ; ISP, bir interface'in yalnızca bir sorumluluğa hizmet etmesi amacıyla gerekliyse ufak parçalara bölünmesini tavsiye eder.


Aşağıdaki kod örneğinde ICanavar interface'ini implement eden bazı canavarlar görmekteyiz. Ancak gördüğümüz üzere ICanavar sınıfı birden fazla amaca hizmet ediyor bu yüzden bazı canavar sınıfları kullanmadığı özelliklerin implement edilmesi zorunlu tutuluyor. Buradan da ISP'nin ihlal edildiğini görüyoruz.

interface ICanavar
{
    public void Saldir();
    public void Kos();
    public void Uc();
    public void BuyuYap();
}


class Ejderha : ICanavar
{
    public void Saldir()
    {
        //islemler
    }
    public void Kos()
    {
        //işlemler
    }
    public void Uc()
    {
        //islemler
    }
    public void BuyuYap()
    {
        //BEN BUYU YAPAMAM
    }
}


class Goblin : ICanavar
{
    public void Saldir()
    {
        //islemler
    }
    public void Kos()
    {
        //islemler
    }
    public void Uc()
    {
        //BEN UCAMAM
    }
    public void BuyuYap()
    {
        //BEN BUYU YAPAMAM
    }



}


class Buyucu : ICanavar
{

    public void Saldir()
    {
        //islemler
    }
    public void Kos()
    {
        //islemler
    }
    public void Uc()
    {
        //BEN UCAMAM
    }
    public void BuyuYap()
    {
        //islemler
    }


}



Buradaki ISP ihlalinin kaldırılması için interface'yi tek sorumluluğu olan daha ufak parçalara bölmeliyiz.



Evet aşağıdaki örnekte de görebileceğimiz gibi ICanavar arayüzünü, tek sorumluluk taşıyan daha ufak parçalara böldük. Artık manavdan alışveriş sepetimizi doldurur gibi class'larımız için ihtiyacımız olan interface'leri alabiliriz.

interface ISaldirabilen
{
    public void Saldir();
}
interface IKosabilen
{
    public void Kos();
}
interface IUcabilen
{
    public void Uc();
}
interface IBuyuYapabilen
{
    public void BuyuYap();
}
class Ejderha : ISaldirabilen, IKosabilen, IUcabilen
{
    public void Saldir()
    {
        //islemler
    }
    public void Kos()
    {
        //işlemler
    }
    public void Uc()
    {
        //islemler
    }

}


class Goblin : ISaldirabilen, IKosabilen
{
    public void Saldir()
    {
        //islemler
    }
    public void Kos()
    {
        //islemler
    }

}


class Buyucu : ISaldirabilen, IKosabilen, IBuyuYapabilen
{

    public void Saldir()
    {
        //islemler
    }
    public void Kos()
    {
        //islemler
    }

    public void BuyuYap()
    {
        //islemler
    }


}



Okuduğunuz için teşekkürler bir serinin kalanına devam etmeyi unutmayın :) Dependency Inversion Principle Nedir ?