SOLID prensiplerinin dördüncüsüdür ve yazılım tasarımında arayüzlerin nasıl oluşturulması gerektiğine dair önemli bir rehber sunar. Bu prensip, büyük ve kapsamlı arayüzler yerine, daha küçük ve spesifik arayüzlerin kullanılmasını önerir.
Interface Segregation Principle (ISP) Nedir?
ISP, bir sınıfın, kullanmadığı metodlara sahip büyük ve kapsamlı bir arayüzü implemente etmek zorunda kalmaması gerektiğini belirtir. Bu prensibe göre, müşteriler (clients), yalnızca ihtiyacı olan metodları içeren arayüzleri implemente etmelidir. Bu, yazılımın daha modüler, anlaşılabilir ve bakımı kolay hale gelmesini sağlar.
Neden Interface Segregation Principle?
- Modülerlik: Küçük ve spesifik arayüzler, kodun modülerliğini artırır. Her sınıf, yalnızca ihtiyaç duyduğu metodları barındıran arayüzleri implemente eder.
- Anlaşılabilirlik: Daha küçük arayüzler, daha kolay anlaşılır ve takip edilebilir. Bu, yazılım geliştirme sürecini basitleştirir.
- Bakım Kolaylığı: Büyük arayüzler yerine küçük ve spesifik arayüzlerin kullanılması, kodun bakımını kolaylaştırır. Gereksiz metodların bulunmaması, değişikliklerin daha az hata riskiyle yapılmasını sağlar.
- Bağımlılıkların Azaltılması: Küçük arayüzler, sınıflar arasındaki bağımlılıkları azaltır. Bu, yazılımın esnekliğini artırır ve değişikliklerin yayılma etkisini (ripple effect) azaltır.
ISP Nasıl Uygulanır?
- Büyük Arayüzleri Parçalama: Büyük ve kapsamlı arayüzler, küçük ve spesifik arayüzlere bölünmelidir. Her arayüz, belirli bir işlevi temsil etmeli ve yalnızca ilgili metodları içermelidir.
- İhtiyaca Göre Arayüz Tanımlama: Her sınıf, yalnızca ihtiyacı olan metodları içeren arayüzleri implemente etmelidir. Gereksiz metodlardan kaçınılmalıdır.
- Yükümlülüklerin Azaltılması: Sınıfların, kullanmadıkları metodları implemente etme yükümlülüğünden kurtarılması gereklidir. Bu, kodun daha temiz ve yönetilebilir olmasını sağlar.
Örnek
ISP’yi daha iyi anlamak için bir örnek üzerinde duralım. Diyelim ki bir yazıcı uygulaması geliştiriyorsunuz ve Printer
arayüzünü implemente eden sınıflarınız var.
public interface IPrinter { void Print(Document doc); void Scan(Document doc); void Fax(Document doc); }
public class MultiFunctionPrinter : IPrinter { public void Print(Document doc) { // Yazdırma işlemi } public void Scan(Document doc) { // Tarama işlemi } public void Fax(Document doc) { // Faks gönderme işlemi } }
public class SimplePrinter : IPrinter { public void Print(Document doc) { // Yazdırma işlemi } public void Scan(Document doc) { // SimplePrinter tarama yapamaz throw new NotImplementedException(); } public void Fax(Document doc) { // SimplePrinter faks gönderemez throw new NotImplementedException(); } }
Bu örnekte, SimplePrinter sınıfı kullanmadığı metodları implemente etmek zorunda kalıyor, bu da ISP’ye aykırıdır. Bu durumu düzeltmek için arayüzleri parçalayabiliriz.
public interface IPrinter { void Print(Document doc); }
public interface IScanner { void Scan(Document doc); }
public interface IFax { void Fax(Document doc); }
public class MultiFunctionPrinter : IPrinter, IScanner, IFax { public void Print(Document doc) { // Yazdırma işlemi } public void Scan(Document doc) { // Tarama işlemi } public void Fax(Document doc) { // Faks gönderme işlemi } }
public class SimplePrinter : IPrinter { public void Print(Document doc) { // Yazdırma işlemi } }
Bu şekilde, SimplePrinter
sınıfı yalnızca IPrinter
arayüzünü implemente eder ve kullanmadığı metodları içeren arayüzlerle uğraşmak zorunda kalmaz.
Sonuç
Interface Segregation Principle (ISP) yazılım tasarımında büyük ve kapsamlı arayüzler yerine küçük ve spesifik arayüzler kullanmayı önerir. Bu sayede, sınıflar yalnızca ihtiyaç duydukları metodları içeren arayüzleri implemente ederler. ISP, kodun modülerliğini, anlaşılabilirliğini ve bakım kolaylığını artırır, sınıflar arasındaki bağımlılıkları azaltır. Yukarıdaki örnekte olduğu gibi, arayüzleri küçük parçalara bölerek daha temiz, yönetilebilir ve esnek bir yazılım elde edebiliriz.