13 Kasım 2012 Salı

Design Prenciples - Interface Segregation

Merhaba arkadaşlar,
 
Tasarım prensipleri anlatımlarımıza kaldığımız yerden devam ediyoruz. En son Liskov Substitution prensibini incelemiştik. LSP prensibini kısaca hatırlamak istersek;
"Alt sınıflardan oluşturulan nesneler üst sınıfların nesneleriyle yer değiştirdiklerinde aynı davranışı göstermek zorundadır" açıklaması yeterli olacağını düşünüyorum.
 
Bugünkü anlatacağımız konu Interface segregation prensibi. Interface segregation prensibinin savunduğu tez şudur arkadaşlar: Interfaceleri sınıflara implemente ederken doğru şekilde implemente edin. Interface üzerinde tanımlanan şartlar, implemente edilen sınıfta kullanılmıyorsa burada bir yanlış var demektir.
 
Ne demek istedik ? Sistemimizde bir interface yazıp bütün şartları bunun içine koyup istenilen sınıflara implemente etmek ilerisi için büyük bir tehlike oluşturur. Sınıflar kullanmadığı her metodlara not implemented exception koymak zorunda kalıcak. Zaten bunun bir adım sonrası OCP ye ters düşen kod yazmaya yöneltecek.
 
UML şemamız ile konuyu anlatmaya çalışalım.
 

 
 
 
IArac interfacemiz olsun. IArac interfacemiz taksi,tir,kamyon gb. nesnelere nasıl davranacağını söyleyecek metodlara sahiptir. Calistir,DorseCikar,DorseTak,Durdur,FarAc,FarKapa,SileceklerCalistir gb. burada farkettiğiniz bir nokta olmalı. Bütün araçlar çalışır,durur,far açılır, far kapanır ama dorsesi olmayan araçlar dorse takamaz ve çıkaramaz. Yukarıdaki uml diagramında görüldüğü gibi taksi nesnesi bu metodlara notimplementedexception fırlatmak zorundadır.
 
Interface segregation kavramı da burada noktaya giriyor. Eğer interfaceniz uygulanan sınıflar tarafından desteklenmiyorsa interfaceinizi bölün.
 
 
 
 
Yukarıdaki uml diagramında IArac arayüzündeki(interface) DorseCikar ve DorseTak metodları IDorseliArac arayüzüne verdik. IDorseliArac arayüzü IArac arayüzünden türettik. Tır ve Kamyon nesnelerine IArac arayüzü yerine IDorseliArac arayüzü implemente ettik.
 
Bu şekilde sınıflar kendilerine dikte edilen metodların hepsini kullanabilir duruma getirdik.
 
Biraz dikkat edersek, şu ana kadar incelediğimiz prensiplerin temelinde şu yatıyor. Sınıflarınız sade olsun, birden çok iş yapmasın, türetme işlemlerini doğru şekilde yapın, interface tanımlamalarını doğru şekilde yapın zaten uygulamanız kendi içinde tutarlı davranacaktır.
 
Hollandalı efsane futbolculardan Johan Cruyff'ın güzel bir sözü vardır futbol ile ilgili:
Futbol basit bir oyundur. Zor olan ise basit oynamaktır.
 
Yazılım dünyasındaki pekçok yazılımı da ben buna benzetiyorum. Kod yazmak basit bir eylemdir. Zor olan basiti yapabilmektir. Kod yazarken kullandığımız programlama dilinin özelliklerini bilip, onun prensiplerine, özelliklerine, davranışlarına hareket ettiğimiz zaman genelde uygulamalarımız doğru çalışır. Eğerki bu konulara hakim değilsek işte o zaman ortaya çıkan uygulamanın intikamı acı olur.
 
Bir sonraki yazımızda görüşmek üzere arkadaşlar :)
 

Hiç yorum yok:

Yorum Gönder