Bu yazılım prensibinin ortaya çıkış motivasyonu şudur:
“Sınıflarımız Interface’lerden kullanmayacakları metotları implement etmeye zorlanmamalıdır.”
Yukarıdaki cümleyi daha iyi anlamak için örneklendirelim:
Interface ArabaInterface {
public function ilkAtesleme();
public function motorKontrol();
public function gpsAc();
}
Class Bmw implements ArabaInterface {
public function ilkAtesleme()
{
// kodlar...
}
public function motorKontrol()
{
//kodları...
}
public function gpsAc()
{
//kodlar...
}
}
Class Tofas implements ArabaInterface {
public function ilkAtesleme()
{
// kodlar...
}
public function motorKontrol()
{
//kodları...
}
public function gpsAc()
{
//tofas arabamizda gps cihazi yok. Ne yapacağız?
// return null; mu yazacağız?
//Gördüğünüz gibi ISP prensibini ihtal ettik. Kullanılmayacak //metodu zorla implement
//ediyoruz. Etmezsek hata verecek!
}
}
Yukarıda Tofas sınıfında gpsAc() metodunda görülmek üzere ISP prensibi ihlal edildi. Çünkü Tofaş arabamızda GPS modülü yok. Kullanılmayacak metodu da zorla implement etmeye çalıştık. Etmezsek hata verecek. Tek seçeneğimiz o metod içinde return ile null değeri döndürmemiz…
İşte bu durumu ISP(Interface Segregation Principle) ile çelişmeyecek hale getirirsek kodları aşağıdaki gibi düzenlemeliyiz:
Interface AteslemeInterface {
public function ilkAtesleme();
}
Interface motorKontrolInterface {
public function motorKontrol();
}
Interface gpsInterface {
public function gpsAc();
}
Interface arabaTipineGoreInterface{
public function calistir();
}
Class Bmw implements AteslemeInterface,motorKontrolInterface,gpsInterface, arabaTipineGoreInterface {
public function ilkAtesleme()
{
// kodlar...
}
public function motorKontrol()
{
//kodları...
}
public function gpsAc()
{
//kodlar...
}
public function calistir()
{
$this->ilkAtesleme();
$this->motorKontrol();
$this->gpsAc();
}
}
Class Tofas implements AteslemeInterface,motorKontrolInterface, arabaTipineGoreInterface {
public function ilkAtesleme()
{
// kodlar...
}
public function motorKontrol()
{
//kodları...
}
public function calistir()
{
$this->ilkAtesleme();
$this->motorKontrol();
}
}
Class Araba {
public function sur(arabaTipineGoreInterface $tip)
{
$tip->calistir();
}
}
Kullanımı:
$araba = new Araba();
$araba->sur(new Bmw());
Daha fazla açıklamaya lüzum yok sanırım. Yukarıdaki örnek son derece net. Tofaşta GSP cihazı olmadığından, o sınıfı gps metodunu implemente zorlamadım ve güzel bir örnekle de işi sonlandırdım ;-)
Şöyle arkanıza yaslanıp bir düşünün. Yukarıdaki örnek ne güzel hem test edilebilir hem geliştirmesi daha kolay hem okunaklı hem de projeye yeni biri dahil olsa kodu daha iyi anlayıp yeni arabalar ekleyebilir bir kod yazdık. İşte SOLID bu yüzden var…
Saygılar.
Etiketler: