Interface Segregation Principle (ISP) Nedir?

Bu yazımızda, “I” harfiyle gösterilen ve SOLID ilkelerinden “Interface Segregation Principle” kavramına odaklanacağız.

Interface Segregation Principle

Interface Segregation Principle (ISP)‘yi anlamaya başlamadan önce, prensipte geçen iki temel kelimenin anlamını netleştirelim:

  • Interface (Arayüz): Farklı sistemler, yazılım bileşenleri veya programlar arasında etkileşimi sağlayan bir yapıdır. Yazılımda, bir sınıfın dış dünyaya sunduğu metotlar ve özellikler topluluğunu ifade eder.
  • Segregation (Ayrım): Ayırma, bölme veya ayrım yapmak anlamına gelir. Yazılım bağlamında, büyük ve karmaşık yapıların daha küçük, yönetilebilir ve ihtiyaca uygun parçalara ayrılmasını ifade eder.

Bu iki kelimenin birleşiminden oluşan Interface Segregation Principle (Arayüzlerin Ayrımı Prensibi), büyük ve genel amaçlı arayüzlerin, daha küçük, daha spesifik ve kullanıma daha uygun parçalara ayrılması gerektiğini savunan bir yazılım tasarım prensibidir.

Interface Segregation Principle Neden Önemli?

Eğer tüm işlevleri tek bir arayüze sıkıştırırsanız, bu hem kodun okunabilirliğini hem de esnekliğini olumsuz etkiler. Bunun yerine, daha küçük ve özelleşmiş arayüzler tasarlayarak:

  • Kodun bakımı kolaylaşır.
  • Gereksiz bağımlılıklar azaltılır.
  • Kod daha yeniden kullanılabilir hale gelir.

Diyelim ki yazılımımızda yazdırma, tarama ve faks gönderme gibi işlevlere sahip bir sınıf tanımlamamız gerekiyor. Eğer tüm bu işlevleri tek bir arayüzde birleştirirsek, aşağıdaki gibi bir yapı ortaya çıkar:

class IMultiFunctionDevice:
    def print(self, document):
        raise NotImplementedError
    def scan(self, document):
        raise NotImplementedError
    def fax(self, document):
        raise NotImplementedError

class MultiFunctionPrinter(IMultiFunctionDevice):
    def print(self, document):
        print("Yazdırılıyor:", document)
    def scan(self, document):
        print("Tarandı:", document)
    def fax(self, document):
        print("Faks gönderildi:", document)

Bu yapı ilk bakışta işe yarar gibi görünebilir. Ancak, tüm işlevlere ihtiyaç duymayan bir cihaz için bu arayüz gereksiz bağımlılıklar yaratır. Örneğin, sadece yazdırma işlevine sahip bir yazıcı (printer) oluşturduğunuzda, tarama ve faks fonksiyonlarını da implement (uygulamak) etmek zorunda kalırsınız.

Interface Segregation Principle doğrultusunda, büyük arayüzü daha küçük ve özelleşmiş arayüzlere bölelim:

class IPrinter:
    def print(self, document):
        raise NotImplementedError

class IScanner:
    def scan(self, document):
        raise NotImplementedError

class IFax:
    def fax(self, document):
        raise NotImplementedError

Bu şekilde her arayüz tek bir işleve odaklanır. Şimdi, farklı cihaz türleri bu arayüzlerden yalnızca ihtiyaç duyduklarını kullanabilir:

class SimplePrinter(IPrinter):
    def print(self, document):
        print("Yazdırılıyor:", document)

class AdvancedScanner(IScanner):
    def scan(self, document):
        print("Tarandı:", document)

class MultiFunctionPrinter(IPrinter, IScanner, IFax):
    def print(self, document):
        print("Yazdırılıyor:", document)
    def scan(self, document):
        print("Tarandı:", document)
    def fax(self, document):
        print("Faks gönderildi:", document)

Interface Segregation Principle sayesinde:

  • Her sınıf yalnızca ihtiyacı olan işlevleri kullanır.
  • Kod karmaşası azalır ve esneklik artar.
  • Arayüzler, cihazların ya da modüllerin özgün ihtiyaçlarına göre şekillenir.

Bu prensip, kodun hem daha anlaşılır hem de daha sürdürülebilir olmasını sağlar. Daha da önemlisi, yazılımın modülerliğini artırarak, genişletilebilir ve değiştirilebilir bir yapı sunar.

İlgili Makaleler

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu