SOLID - Interface Segregation - Arayüz Ayırma Prensibi

Solid Prensipleri'nin ilkesi olan Interface Segregation - Arayüz Ayırma Prensibi (ISP)

                                             

ISP'ye göre; nesneler, ihtiyaç duymadıkları metotların bulunduğu interface’lere bağlı olmaya zorlanmamalıdır

Basit bir örnekle bu prensibi anlatacak olursak; kütüphane sisteminin kullanıcıları olsun: Admin,Personel ve Üye

Kullanıcıların görevlerini bulunduracak ITask adında bir interface oluşturalım. Bu interface'yi miras alacak Admin,Personel ve Uye sınıflarımız olsun.

Sistemin kullanıcılarının görevlerini tutan ITask interface'si
public interface ITask
    {
        string KitapEkle();
        string KitapAra();
        string PersonelEkle();
        string OduncVer();
        string KitapTeslimAl();
        string UyeKaydıYap();
        string KitapListele();
        string OduncBilgisiGoruntule();
    }

Bir interface'teki bütün metotlar miras aldıkları sınıflar tarafından implement edilmek zorundadır. Örnek bir kullanıcı olan Üye, sadece veritabanındaki kitapları listeleyebilir ve kitap arayabilir bu yüzden KitapListele ve KitapAra metotlarını kullanacak.

Prensibimize aykırı alan durum ITask'ın bütün metotlarına ihtiyaç duymadığı için exception hatası verecektir.Yukarıdaki iki metot dışındaki diğer metotları kullanmadı. Aynı zamanda Admin sınıfında bütün görevleri implement ettiğimiz için Single Responsibility(Tek Sorumluluk) Prensibine de aykırı bir kullanım yapmış olduk.

public class Uye : ITask
    {     
        public string KitapEkle()
        {
            throw new NotImplementedException();
        }
        public string KitapListele()
        {
            throw new NotImplementedException();
        }

        public string KitapTeslimAl()
        {
            throw new NotImplementedException();
        }
        public string OduncVer()
        {
            throw new NotImplementedException();
        }
        public string KitapAra()
        {
            return "Kitap Ara";
        }
        public string OduncBilgisiGoruntule()
        {
            return "Ödünç Bilgisi Görüntüle";
        }
        public string PersonelEkle()
        {
            throw new NotImplementedException();
        }
        public string UyeKaydıYap()
        {
            throw new NotImplementedException();
        }
    }

Kodumuzu Interface Segregation Prensibine göre tekrar düzenleyelim. Burada yapacağımız iş, kullanıcılara göre farklı arayüzlerde görevleri tanımlamak olacaktır. Bu şekilde arayüz ayırma işlemini gerçekleştirmiş olacağız.
    public interface IAdmin
    {
        string KitapEkle();
        string KitapAra();
        string PersonelEkle();
    }

    public interface IUye
    {
        string KitapAra();
        string OduncBilgisiGoruntule();
    }

    public interface IPersonel
    {
        string OduncVer();
        string KitapTeslimAl();
        string UyeKaydıYap();
        string KitapListele();
    }

IAdmin, IUye, IPersonel olmak üzere üç kullanıcı için de görevlerini barındıran interface'ler oluşturduk ve ilgili sınıflarda inheritance işlemi ile kalıtım alalım.
    public class Admin : IAdmin
    {
        public string KitapAra()
        {
            return "Kitap Ara";
        }

        public string KitapEkle()
        {
            return "Kitap Ekle";
        }

        public string PersonelEkle()
        {
            return "Personel Ekle";
        }
    }
    public class Personel : IPersonel
    {
        public string KitapListele()
        {
            return "Kitap Listele";
        }

        public string KitapTeslimAl()
        {
            return "Teslim Al";
        }

        public string OduncVer()
        {
            return "Ödünç Ver";
        }

        public string UyeKaydıYap()
        {
            return "Üye Kayıt Et";
        }
    }
    public class Uye : IUye
    {
        public string KitapAra()
        {
            return "Kitap Ara";
        }

        public string OduncBilgisiGoruntule()
        {
            return "Ödünç Bilgisi Görüntüle";
        }
    }

Böylece her kullanıcı için ihtiyacı olan metotları kullanmış olduk. Aynı zamanda SRP'yi de kullanmış olduk.

Yorumlar

  1. Merhaba,
    ISP için güzel bir örnek olmuş fakat bir de bunun uygulamasını gösteren bir test sınıfı yazar mısınız.

    YanıtlaSil
  2. Yeni nesne oluştururken hem admin hem de personel yetkilerine sahip olan bir nesneyi DIP (Dependency Inversion Principle) e uygun olarak nasıl yapabiliriz acaba.

    YanıtlaSil

Yorum Gönder