Herkese merhaba, bir önceki yazımda Liskov's Subtitution Principle ' den bahsetmiştim. Bugün de SOLID prensiplerinden I 'ya denk gelen Interface Segregation Principle yani Arayüz Ayırım Prensibini anlatıcam. Bu prensip diğer prensiplere göre hem daha basit, hem de anlaşılması daha kolay bir prensiptir. Aslında bir önceki Liskov prensibinde kısmen de olsa anlatmıştım, çok basit manada adından da anlaşılacağı gibi özel görevler yapan classlar için interfacelerin ayrılması konusudur.
Interface yani Türkçe adıyla arayüzler, sizin de bildiğiniz gibi bir nevi yapılacak işlerin belirlendiği sınıflar arası anlaşma, sözleşmedir. Aslında sınıflara "REHBERLİK" etmek görevindedir, sadece yol göstermek yapılması gereken zorunlu işleri belirtmek görevi içerir. Haliyle interfaceleri miras alan sınıflar, içindeki tüm methodları implemente etmek zorundadır. Interfacelerin yapı ve görevleri bu yazının konusu değil ama kısaca bahsetmiş olduk. Şimdi konumuzla olan kısmına gelirsek, konu zaten çok basit olduğundan hiç dallanıp budaklandırmadan örneğe geçiyorum.
ISP kuralı derki; eğer bir sınıf için kalıtım alınan Interface YETERSİZ yada FAZLA geliyorsa o sınıfı dağıtmak yerine interface yapılarını amaca uygun ayırın. Bu tanıma göre ISP bize farklı işler yapan classlar için farklı interface yapıları kurgulamamızı tavsiye eder. Aslında bu Liskov prensibi ile doğrudan bağlantılı bir prensiptir ki zaten daha önce de belirttiğim üzere SOLID prensipleri bir bütünün parçası gibidir, birbirinden ayrılmazlar ve birine ters gelen kurgu otomatik olarak diğerine de terstir. Şimdi lafı uzatmadan hemen örneğimize geçelim. Bu arada bir önceki yazımda hemen tüm örnekler ISP uyumludur, ISP'ye birer örnektir :)
Örnek - 1 :
Kuş familyasına ait bir tasarım çıkaralım ve aşağıdaki gibi bir tasarımın yanlış olduğunu görelim.
Yukarıdaki tasarıma bakarsanız "IKus" interface yapısının bazı classlar için FAZLA geldiği bazıları için YETERSİZ kaldığını görebilirsiniz. Örneğin deve kuşunun göç etme ve uçma gibi 2 özelliği yoktur, aynı şekilde eğer papağan sınıfımız olsaydı "Konuşma" özelliği "IKus" interface yapısında tanımlı olmadığından bu özelliği kullanamayacaktık. Yukarıdaki kod bun sebeplerden dolayı öncelikle Liskov'a uymamaktadır, sonrasında ise ISP'ye zaten uymadığı aşikar. Şimdi kodumuzu SOLID prensiplerine göre baştan düzenlersek, aşağıdaki gibi ayrı interfaceler olacaktır.
Bu şekilde bir tasarım SOLID prensiplerinin tamamına uymaktadır. İnterfaceleri ayırmış bulunmakla birlikte artık gereksiz özelliklerin gereksiz sınıflarda boş yere implement edilmesini önlemiş olduk. Üstelik "Göç edebilen kuş aynı zamanda uçabilen kuştur" mantığında interfaceleri birbirinden miras alarak bir nevi code review yaptık ve kodumuzu daha manalı ve kısa bir hale de getirmiş bulunduk.
ISP'nin bize üstteki örnekten de anlaşılacağı üzere, "Nesneler, Sınıflar ihtiyaç duymadıkları özelliklerin olduğu Interface'lere bağlı kalmak zorunda bırakılmamalıdır" der. Yani bizim sınıfımız oluşturmuş olduğumuz Interface yapısının 1 özelliğini dahi kullanmıyorsa, hem Liskov hem de ISP' ye göre yanlış yoldayız demektir.
Örnek - 2 :
Şimdiki örneğimizde de bir e-ticaret sitesini düşünelim. Sitemizde doğal olarak kullanıcılarımız olacak ve bu kullanıcıların rol görev ve yetkileri doğal olarak birbirinden farklı olması gerekiyor. Örneğin bir "Admin" grubumuz olsun ve bu gruba ait üyelerin "Ekleme,Silme,Düzeltme" gibi işlevleri, "Base" grubumuzun da sadece "Ekleme" işlevi olsun. Oluşturulacak kullanıcıların bu gruplara atanması ve rol görev dağılımlarını gösteren tasarımı direk oluşturacak olursak aşağıdaki gibi olacaktır.(burada hatalı tasarımı vermeye gerek görmedim)
Görüldüğü üzere A müşterisi "Admin" grubunda yer aldığından tüm özellikleri kapsıyor, B Müşterisi ise sadece ekleme işlevini yerine getirebiliyor.
Böylelikle SOLID'in I'sına denk gelen Arayüz Ayrımı Prensibinin de sonuna gelmiş bulunuyoruz. Bu prensip Liskov prensibi ile iç içe geçen basit ama çok islevsel bir prensiptir. Konu gayet zevkli ve basit olduğundan çok rahat bir şekilde anlaşıldığını düşünüyorum. Bir sonraki yazım olan SOLID'in D'sine denk gelen DIP prensibinde görüşmek üzere..Saygılarla..