<< Dependency Inversion Principle | PostgreSQL nedir?>>
Yazar harunozer 04 November 2013
Interface Segregation Principle bir sınıf bir arayüzü uyguluyor ise, o sınıf o arayüzde tanımlı bütün metotları kullanmasını gerektiğini önerir.
Eğer işlemler kendi içlerinde de ayrılıyor ise base interface kullanılarak işlemler dağıtılır. Örneğin farklı veri tabanlarını destekleyen ve veri tabanı işlemlerini yerine getiren bir uygulama yazıyoruz. Sql Server stored procedure yi destekliyor fakat Access desteklemiyor. Bunun için Access ve SqlServer ın ortak desteklediği metotların tanımlı olduğu bir interface tanımlanır. Sadece sql serverin desteklediği özellikler için başka bir interface tanımlanır ve; sadece Access in desteklediği özellikler için farklı bir interface tanımlanır. Bu arayüzleri gerçekleştirecek sınıflar da hem ortak özellikleri tanımladığımız arayüzü hemde tipini göre uygun olan arayüzü uygular.
Örnek bir uygulama ile Interface Segregation PrensibininInterface Segregation Principle (Arayüz ayırma prensibi) gerekliliğini daha iyi anlayalım. Örneğin ürünleri ve kullanıcıları veri tabanında tutan ve ürünlerin resimlerinin yükleneceği bir uygulama geliştiriyor olalım. Kodun uzamaması için Veri tabanı işlemi olarak sadece ekle olduğunu varsayalım. Uygulamamızın class diyagramı ve kodları aşağıdaki gibidir.
class UrunDbProcess : IProcess
public void ResimYukle()
Console.WriteLine("Urun Resim Yükle");
class KullaniciDbProcess : IProcess
Kodumuzda görüldüğü gibi KullanıcıProcess sınıfında yapamayacağı bir iş tanımlanmış ve hata fırlatmıştır. Bu durum Interface Segregation prensibine ve Liskov Substitution prensibine aykırıdır. Burada yapmamız gereken ürün ve kullanıcı için ortak olan Ekle işlevini ayrı bir arayüzde, sadece ürün için olan ResimYukle işlevini ayrı bir arayüzde tanımlamak ve urun sınıfında bu iki arayüzü de uygulamaktır. Uygulamamızın Interface Segregation prensibine göre düzenlenmiş hali aşağıdaki gibidir.
class KullaniciProcess : IDbPRocess
class UrunProcess : IDbPRocess, IResimProcess
Böylece daha sağlam ve mantıklı bir kod tasarımı yapmış olduk. Her sınıfta sadece desteklediği metotlar tanımlı ve sınıfların uyguladıkları arayüzlere bakarak bile hangi işlemleri desteklediklerini görebiliyoruz.
Böylece tasarım prensipleri yazı dizimizi de noktalamış oluyoruz. :)