Interface Segregation Nedir? – SOLID Prensipleri
Interface segregation prensibi: Nesnelerin kullanmayacakları method’lara bağımlı olmaması gerektiğini savunmaktadı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()
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()
Interface segregation basit olarak bu sekilde. Sorulariniz var ise ulasmaktan cekinmeyin. Bir sonraki yazida gorusmek uzere. 🙂