Doğru Cevap
-
Class içinde fonksiyon değil olay, Object Oriented Programming (OOP) olarak geçer. Bir yöntem, programlama felsefesidir yani fonksiyonları kümelemek değil kesinlikle... Ha OOP yazıyorum diyen PHP programcılarının büyük bir çoğunluğu fonksiyonları kümeler o ayrı :)
Programlamadaki her "şey" gerçek hayattaki nesneler olarak düşünülebilir. Mesela otomobil diye bir nesne var bunun "işlevleri" ve "özellikleri" var. İşlevler:
- Hızlanır
- Yavaşlar
- Park moduna geçer
Özellikler:
- Rengi
- Bagaj hacmi
- Tipi (Sport, sedan, kup)
İşlevler "method", özellikler "property" olarak adlandırılır. Senin anlayacağın karşılıkları method = function, variable = property.
Peki ne işe yarar dersen, birçok işi var aslında.
Mesela otomobil örneğinde ben aslında sana bir tanım yapmış oldum, artık bu nesneyi kullanmak için senin otomobilin içerisinde neler olduğunda, motorun çalışma prensiplerinden, enjektörlerden, soğutma - yağlama sistemlerinin nasıl çalıştığından haberdar olman gerekmez. Bilirsin ki benim tanımladığım otomobille 3 iş yapabilirsin.
class Otomobil { public $renk; public $bagajHacmi; public $tip; public function hizlan() { if(!$this->_motorCalisiyorMu()) { throw new Exception('Motoru çalıştırmadan nereye?'); } } public function yavasla() { ... } public function parkEt() { ... } private function _motorCalisiyorMu() { .... } }
Bu örneğe bakarsak içeride motor çalışıyor mu kontrol ediyorum, ama private olduğu için biliyorum ki bu sadece class'ın içerisinde kullanılır, böylece class'ı kullanırken kolaylık sağlar...
Özellikle komplex işlerde işleyişin detaylarını dışarıdan saklamak programı anlamanı ve doğru kullanmanı kolaylaştırır. Ayrıca bunlara otomatik testler yazabilirsin, böylece class'ın doğru çalıştığından emin olursun, programı geliştirmeye devam ederken hatayla karşılaşırsan bilirsin ki %90 ihtimalle class'ta sorun yok, içine girip kurcalamazsın...
Bu faydalarından biri. Onun dışında class'ları extend edebilirsin.
class Otobus extends Otomobil { public function yolcuAl() { ... } }
Otobüs Otomobil'i extend etti. Böylece otobüs hızlanır, yavaşlar, park eder ek olarak bir de yolcu alabilir.
Nesneleri transfer etmek daha mantıklı ve kullanışlı oluyor:
class Otobus extends Otomobil { public function yolcuAl($yolcu) { ... } } class Yolcu { ... } $yolcu = new Yolcu(); $otobus = new Otobus(); $otobus->yolcuAl($yolcu);
Otobüse yolcu alıyorsun ama otobüsün taşıma kapasitesi var dolayısıyla yolcuların kilolarını toplayıp kontrol ediyorsun bir yerlerde. Bunu OOP olarak yapmasan direkt kiloları bindirirdin otobüse, çünkü amaç kilo hesaplamak.
Peki sonradan bir talep geldi, dendi ki bayanlar ve yaşlılara öncelik ver (atıyorum). Otobüse yolcu bindirirken kilosuyla beraber cinsiyet ve yaş bilgisini de alman lazım. OOP düşünmezsen yolcuAl fonksiyonuna bu parametreleri tek tek eklemen lazım. Eh yolcuAl fonksiyonunu 50 yerde kullandıysan 50 yerde bu parametreleri ayarlaman gerek. OOP düşünürsen sadece Yolcu ve Otobus class'larını güncellemen yeterli.
En basit iki faydası bu. Daha bir sürü var, + design pattern'ler var, yani nesneleri kullanma yöntemleri diyebilirsin buna.
OOP'ye kendi utility function'larını katmaya kalkma ama, o zaman nasıl kullanacağını anlayamazsın. Mesela özel bir fonksiyonun var array'lerle işlem yapmanı kolaylaştırmak için diyelim, bunun OOP ile bir alakası yok tek fonksiyon olacağı aşikar çünkü. Ben onları bir class altında static olarak topluyorum. Örnek:
class ArrayUtils { public static function taklaAttir($array) { return array_reverse($array); } } $array = array(1, 2, 3, 4); $taklaciGuvercin = ArrayUtils::taklaAttir($array);
İşte bu tam olarak fonksiyonları kümelemek oluyor, yine class kullandım ama Object Oriented Programlama yapmış olmadım.
Bu konu üzerine kolum bacağım kalınlığında kitaplar mevcut anlat anlat bitmez o yüzden daha fazla detaya girmeyeceğim, biraz kendin araştır, biraz open-source örneklere bak nasıl tasarlamışlar: Zend Framework, Symfony2 hatta tam OOP olan diğer programlama dillerine bakabilirsin Java, Ruby, Python gibi.
Ha bir de, OOP her zaman daha çok kod yazmanı gerektirir, tek kişi çalıştığın ufak projeler için gerekliliğini hissetmeyebilirsin, ama orta-büyük projelerde kullanmazsan bir süre sonra içinden çıkamaz hale gelirsin.-
xuma
@madpoet cevap olayını güzel bir makaleye dönüştürmüşsün.Güzel bir cevap bende teşekkür ederim.11 yıl önce yazılmış -
bensedat18
valla harikulade bir anlatım olmuş. gözümün önü ışıdı sanki :).
o halde yapacağımız projede nesnelerin ve sınırlarının iyi belirlenmesi gerek. sonrasında mesela bir araba için düşünürsek, bu arabanın iskeletine, nesneler yardımıyla parçaları oluşturup monte etmek kalıyor.
hatta böyle bir durumda mercedes için hazırladığımız bir parçayı ufak rütuşlarla bmw ye uygun halede getirmek bile mümkün olabilir gibi.
bu biraz da standart üretim, seri üretim olayına mı benziyor ne ? :D
teşekkür ederim hocam makale kıvamında yazınız için.11 yıl önce yazılmış -
Kesali
Phpclasses sizin tabirinizle yedek parça deposu gibi zaten her işi yapan çok detaylı yazılmış classlar mevcut.11 yıl önce yazılmış -
madpoet
bensedat aynen öyle :) O yedek parça olayına da loose coupling diyoruz. Yani her class'ın birbirinden bağımsız çalışacak şekilde tasarlıyorsun. Ufak rotüş falan yok, düzgün tasarlanırsa hiç rotüşsüz kullanırsın. Tabii bunlara girdin mi artık yazılım mühendisliğine girmeye başlıyor çok kolay değil...11 yıl önce yazılmış -
bensedat18
anlıyorum hocam. valla bugünü bilgi açısından karlı bir gün sayarak bitiriyorum sayenizde :). teşekkür ederim..11 yıl önce yazılmış
-
Cevaplar
-
hatırladıgım kadariyla bilge adam'dan bir hoca vardi. php class lar hakkında bir makallesi vardi..
class lar ıcın sunu soyluordu. siz class dosyalarını include ettiginizde php bu classları gormezden gelir boş bir txt dosyasını include etmiş gibi olursunuz buda su anlama gelior hic include etmemis gibi oluor. ve performans elde etmis oluyorsunuz taki new object seklinde tetikleyene kadar bu boyle devam edermis. class icinde kullandıgın fonksiyonları hangısını belırlersen onu calıstırırı. isin performans kısmıda burda oluor.