Interface Segregation Nedir? – SOLID Prensipleri

Interface segregation prensibi: Nesnelerin kullanmayacakları method’lara bağımlı olmaması gerektiğini savunmaktadır.

Interface Segregation
Tek bir interface’de tüm method’ları tanımlamak yerine ayrı ayrı interfaceler tanımlanmalıdır. Kullanıcı (Nesne) kullanmayacağı method’lara bağımlı olmak zorunda kalmamalıdır.

Interface Segregation Örneği

Örnek olarak televizyon kumandası interface’i yazalım ve buradaki sorunu birlikte inceleyelim.

Yukarıda gördüğümüz üzere uzaktan kumanda interface’i ve eski kumanda ve yeni kumanda olmak uzere 2 class’imiz mevcut. Eski kumanda olarak eski tüplü televizyonlarin veya youtube, netflix olmayan televizyonların kumandaların düşünebiliriz. Bu durumda eski kumanda’da bazi methodlar kullanmaya calistigimizda hata verecektir. Yukarıdaki diyagramı koda dökelim.

from abc import ABC, abstractmethod

class TVRemoteController(ABC):
    @abstractmethod
    def open(self):
        pass

    @abstractmethod
    def close(self):
        pass

    @abstractmethod
    def open_youtube(self):
        pass

    @abstractmethod
    def open_netflix(self):
        pass

Televizyon kumandası interface ‘imiz yukarıdaki gibi tanımlanabilir

class NewTVRemoteController(TVRemoteController): # Yeni Televizyonlarin Kumandasi
    def open(self):
        print("NewTV opened")

    def close(self):
        print("NewTV closed")

    def open_youtube(self):
        print("NewTV Youtube Opened")

    def open_netflix(self):
        print("NewTV Netflix Opened")

Yeni televizyon kumandası class’i için her şeyi import edip kullanabildiğimizden burada sorun yok peki eski televizyonlar için olan kumanda nasıl uyarlanacak hadi gelin inceleyelim.

class OldTVRemoteController(TVRemoteController):
    def open(self):
        print("OldTV opened")

    def close(self):
        print("OldTV closed")

    def open_youtube(self):
        raise Exception("Old TV doesn't have Youtube") # Eski televizyon bu ozellige sahip degil

    def open_netflix(self):
        raise Exception("Old TV doesn't have Netflix") # Eski televizyon bu ozellige sahip degil

Eski televizyon kumandasına baktığımızda 2 methodun kullanılamadığını görüyoruz bunun sebebi eski televizyonlarda bu özelliklerin olmaması. Oyleyse bu interface bu class icin uygun degildir ve bu sorun bizim interfaceimizin cok genel oldugunu gosteriyor.

# yukaridaki kodlari calistirmak isterseniz :)
new = NewTVRemoteController()
new.open()
new.open_youtube()
new.open_netflix()
new.close()


old = OldTVRemoteController()
old.open()
old.close()
old.open_youtube()
old.open_netflix()
output of code before interface segregation

Interface segregation tam olarak burada devreye giriyor. Kullanıcılar kullanmayacakları method’lara bağımlı bırakılmamalıdır.

Gelin Interface segregation’in uygulamasını görelim.

Yukaridaki diagramda gordugumuz uzere interfaceleri ozellestirerek bu sorunu cozduk. Eski kumanda nesnesi artik kullanmayacagi methodlari implemente etmesine gerek yok.

Gelin bu diagrami koda dokelim.

from abc import ABC, abstractmethod


class TVRemoteController(ABC):
    @abstractmethod
    def open(self):
        pass

    @abstractmethod
    def close(self):
        pass


class AndroidTVRemoteController(TVRemoteController):
    @abstractmethod
    def open_youtube(self):
        pass

    @abstractmethod
    def open_netflix(self):
        pass

Kodu inceleyecek olursak 2 tane interface’imiz oldugunu gorecegiz. TVRemoteController interface’i artik base interface oldugunu ve AndroidTVRemoteController interface’i base interface’i genisleten(extend) bir interface oldugunu goruyoruz.

class OldTVRemoteController(TVRemoteController):
    def open(self):
        print("OldTV opened")

    def close(self):
        print("OldTV closed")

Eski kumanda classimiz artik ana (base) interface’den implement edilerek ihtiyaci olamayan methodlari kullanmak zorunda degil.

class NewTVRemoteController(AndroidTVRemoteController):
    def open(self):
        print(" NewTV opened")

    def close(self):
        print(" NewTV closed")

    def open_youtube(self):
        print("NewTV Youtube Opened")

    def open_netflix(self):
        print("NewTV Netflix Opened")

Yeni kumanda ise tum methodlari icerebilmektedir.

new = NewTVRemoteController()
new.open()
new.open_youtube()
new.open_netflix()
new.close()


old = OldTVRemoteController()
old.open()
old.close()
output of code after interface segregation

Interface segregation basit olarak bu sekilde. Sorulariniz var ise ulasmaktan cekinmeyin. Bir sonraki yazida gorusmek uzere. 🙂

Tags:

Add a Comment

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