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