Nesneye Yönelik Programlama’da (OOP) Sınıf Soyutlama

Nesneye yönelik programlama yakla??mlar?nda önemli bir kavram soyut s?n?flard?r. Soyutlama i?lemi ile ayn? zamanda çok biçimlilik mant???na da zemin haz?rlam?? oluyoruz. Soyut s?n?flar gövde içermez ve geni?letilen s?n?f taraf?ndan kullan?ld?ktan sonra sonland?r?lmas? zorunludur. Soyut denmesinin sebebi de gövde içermemesinden dolay?d?r ve bu gövde olu?turmay? kendinden türeyen s?n?flara b?rak?rlar. Birazdan örnek kod parçalar? ile ne demek istedi?imi daha net anlatabilmi? olaca??m. Ufak ufak geçelim konumuza. Örnek bir soyutlanm?? yap?y? a?a??daki resimde görebilirsiniz:

UML Diyagram?

UML Diyagram?

Calisan s?n?f?m?z bir soyut s?n?ft?r. ?çerisinde calis() fonksiyonu soyutlanm??t?r. En az bir tane soyut s?n?f bar?nd?rmas? ilgili s?n?f? soyut yapmaya yeter. Ayn? zamanda gövdeli (soyut olmayan) i?levler de bar?nd?rabilir. Bu gövdeli i?levleri alt s?n?flar sonland?rmak zorunda de?ildir. calis() i?levi her pozisyondaki eleman için farkl? i?leyece?inden gövdesi farkl? olacakt?r. Bu yüzden calis() fonksiyonu soyutlanarak gövdesinin ne olaca??n? alt s?n?flara b?rak?r.

php.net’in ?u sayfas?ndan ald???m örnek kod parças?yla i?e ba?layabiliriz:

<?php
abstract class SoyutS?n?f
{
// Geni?letilen s?n?f? bu yöntemi tan?mlamaya zorla
abstract protected function de?eriAl();
abstract protected function önekDe?eri($önek);

// Ortak yöntem
public function yazd?r() {
print $this->de?eriAl() . "\n";
}
}

class SomutS?n?f1 extends SoyutS?n?f
{
protected function de?eriAl() {
return "SomutS?n?f1";
}

public function önekDe?eri($önek) {
return "{$önek}SomutS?n?f1";
}
}

class SomutS?n?f2 extends SoyutS?n?f
{
public function de?eriAl() {
return "SomutS?n?f2";
}

public function önekDe?eri($önek) {
return "{$önek}SomutS?n?f2";
}
}

$class1 = new SomutS?n?f1;
$class1->yazd?r();
echo $class1->önekDe?eri('FOO_') ."\n";

$class2 = new SomutS?n?f2;
$class2->yazd?r();
echo $class2->önekDe?eri('FOO_') ."\n";
?>

SoyutS?n?f ad?nda bir s?n?f tan?ml?yoruz. de?eriAl() ve önekDe?eri($önek) ?eklinde iki tane soyutlanm?? i?lev tan?ml?yoruz. Bu i?levler kal?t?m yolu ile geni?letilecek alt s?n?flarda farkl? farkl? de?erler döndürece?i için soyutlanm??t?r. Kal?t?m? yap?l?p üst s?n?fa ba?lanan her iki class farkl? de?erler döndürecek art?k. Birinci s?n?f (SomutS?n?f1) FOO_ de?eri döndürürken yazd?r() i?levi her iki s?n?fta da farkl? de?erler ta??yor. SomutS?n?f2 adl? geni?letilmi? s?n?fta da ayn? ?ekilde uygulanm??t?r.

Örnek kodumuzun ç?kt?s? ?u ?ekilde olmaktad?r:

SomutS?n?f1
FOO_SomutS?n?f1
SomutS?n?f2
FOO_SomutS?n?f2

Peki soyut s?n?flar nerelerde kullan?l?r ve bunlara ne zaman ihtiyaç duyar?z?

Daha çok nesneler aras?ndaki ortak özelliklerin veya metodlar?n bir üst s?n?fta toplanarak kod tekrar?n? önlemek ve kodu di?er s?n?flardan soyutlayarak de?i?imin etkisini en alt düzeye indirmektir. Nesneye yönelik prensiplerin temel amaçlar?ndan birinin tam üzerindeyiz ?uan: Kodu en az etki ile en stabil ve çal???r hale getirebilmek. Nesneye yönelik tasar?mda uygulamay? iyi soyutlamalar üzerine kurmak oldukça önemlidir.

Bu yazı PHP, Programlama kategorisine gönderilmiş ve , , , , , ile etiketlenmiş. Kalıcı bağlantıyı yer imlerinize ekleyin.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir