Programlamada Geleneksel veya Nesne Tabanlı Seçim
Ne anlamı var bu yazının?
Son zamanlarda, bir OOP çılgınlığıdır gidiyor. 100 satırlık kod, ben bunu nasıl OO ile yaparım sorularıyla süsleniyor. Sizce niye OOP? diye sorulduğunda kimisi “daha düzenli” diyor, kimisi “yeni teknoloji, eskide kalmayalım” diyor, kimisi “bence BMC” diyor. Benim bunlara bulduğum yanıtlar ise, daha düzenli mi? yerine göre evet. Yeni teknoloji? bilgisayar tarihinde 20 yıllık bir geçmiş, yeni değildir. BMC? Gene reklamları gelmiş TV’ye, kaplanlı falan, eski reklamları daha samimiydi.
Bu yazıyı oluştururken hem kendi bilgilerimi kullandım, hem de internetin fikrini aldım. İnternette araştırma yaparken bu konuda onlarca procedural ve OOP fanının taraflı yazıları arasında, konuya objektif bakan açıklayıcı iki metini seçtim. Birisi Zend’de yayınlanan OOP vs Procedural diğeri Pascal’da iki yöntemin farklılığını ve methodlarını anlatan Modular Software Design. Açıkçası ben PASCAL makalesine daha fazla önem veriyorum, bu makale aynı zamanda modüler programlama eşit değildir OOP’nin anlatımı.
Takımlarınızı tuttuysanız, işe unutmakla başlayın
Bilişim dünyasında, nedense takım tutmak çok rastlanır bir durum. /*buradan sonrası sırf sevdiğim bi lafa credit vermek için Bu biraz neofobik olmamızla (”Bütün programcılar neofobiktir.” -Koray BİLGİ“), biraz da yaptığımız işi kendimizle dolayısıyla seçimlerimizle kişiselleştirdiğimizden ortaya çıkıyor. credit bitişi*/ Örneğin Linuxda pico/nano’da kod yazan adam, Eclipse’de kod yazmayı pisleyebilir, tersi de mümkün. İki durumun da kendi hak noktaları var. Örneğin;
Eclipse kullananın argümanları,
Bütün projeye mouse tıklamalarıyla elimin altında,
Otomatik tamamlama özelliğiyle, uzun fonksyion isimlerini yazmıyorum,
Hemen her dilde syntax hightlight edip, yazdığım gibi syntax hatalarını çıkarıyorum,
Resimleri bile eclipse’in içinde düzenleyebiliyorum,
..
Vi/Emacs/Nano/Pico kullanın argümanları,
Heryerden işimi yapabilirim,
işimi yapmak için 200 MB lık editöre ihtiyacım yok, 100KB’lik SSH’ım olsun, yeter.
Kocaman dosyaları açmam, saniye sürmüyor.
Herşeyim klavyeden, herşeyin kısa yolu var, hızlı çalışıyorum
Benim çalışma ortamım zaten sunucunun kendisi, kaydediyorum ve çalışıyor!
..
İki tarafın da argümanlarını dinledik, ikisine de hak verdik, can alıcı noktalar var. Şimdi aklımızda hangisinin daha doğru olduğuna dair bir soru beliriyorsa, demek ki yanlış yoldayız. Unutmayalım, araçlar veya yöntemler doğruluk içermez. Elinizde iş olarak duvara çakılacak bir çivi var; alet çantanızda ise bir çekiç, bir ingiliz anahtarı duruyor. İkisiyle de çivi çakabilirsiniz fakat çekiç’in, ingiliz anahtarından işlevi farklı. Demek istediğim neyin doğru araç olduğunu kullanılacağı iş belirler. Bilişim dünyasında ise kullanılacağı işi bekleyen milyonlarca araç/yöntem var.
Niye Procedural (geleneksel) ?
- ‘Ben yaptım çalıştı’ mantığından çok, nasıl çalıştığıyla ilgilenen ve nasıl çalışacağı kurgulanan
- Hız/kaynak yani performans odaklı
- Herşey sanal ve mantığa dayalı, dünyanın işleyiş gerçeklerinden uzak, daha özgür, herşey heryerde olabilir
Niye Nesne Tabanlı (Object Oriented) ?
- Prensiplerini gerçek dünyadan aldığından işleyişler daha kolay kurgulanabilir
- Nasıl çalıştığından çok, iş akışı içeren, nasıl işletileceği, ne kadar kolay ve basit çalıştırıldığı ile ilgilenen
- Kod okunurluğu daha kolay kod yazma olanağı, dökümantasyon sağlanabilirliği
Karşılaştırma
Bu noktaların tamamı, farklılık taşıyan noktalar. Yani birisinde olan, birinde yok. Şimdi düşünmemiz gereken şey, bizim işimize ne yarıyor?
Bu konularda geçmiş başarılı seçimlerden size birkaç ipucu:
- İşletim sistemi kernelleri ve hız odaklı araçlarının hepsi C veya liginde eşdeğer bir lowlevel programlama dili kullanılarak precedural yazılmıştır ve yazılmaya devam etmektedir.
- Bütün iyi grafik sistemleri, kullanıcı arayüzleri (windows, xwindows, vb), iyi fizik motorları (OpenGL’den tutun, Halflife gibi oyun motorlarına kadar) OO ile yazılmıştır.
- OO’nun babası sayılacak Smalltalk, ingilizce grameri gibi yazılan kodların gereği, öğrenim kolaylığı konusunda bilgisayar dünyasını şaşırtmıştır.
- Unix dünyasının komutları, ls, cat, pic, tail, grep, wget, ftp, ssh, rsync, passwd, adduser, … hepsi C’de procedural yazılmıştır ve çuvalladığı, askıda kaldığı pek görülmemiştir.
- Ne hikmetse*, Java’da yazılan uygulamaların çoğu, başında artık Java geliştiricilerin vazgeçilmez IDE’si Eclipse, çokça askıda kalır, donar, vb.
- Eclipse kadar geniş içerikli ve yetenekli başka bir IDE şu an itibariyle (25 Nisan 2008) yoktur.
- Java ile küçük uygulamalarda bile 50 MB bellek, bir scroll’da %50′lere varan CPU zamanı almasından gerçekleşen tıkanmalar olağandır*.
- Şimdiki 1000 satırı aşan bakım gerektiren ve projede yüksek insan sayısı çalıştıran neredeyse bütün uygulamalar, OO ile yazılmıştır.
En popüler procedural dil seçimleri:
- 1′ler ve 0′lar.. (dünya bir toz bulutuydu ve..)
- Assembler
- C
- Hemen hemen bütün scripting dilleri, sonradan gelenlerine de PHP dahil OO sonradan eklenmiştir.
- ..
En popüler nesne tabanlı programlama dilleri
- Smalltalk
- Java
- C#
- ..
Her yola gelenler
- C++
- PASCAL
- PHP (Şu anda her ne kadar procedural’a yakın olsa da (bu durum PHP 6.0 gelmesiyle konumunu biraz daha merkeze taşıyacak)
- ..
Programlama dilinden saymadıklarım
- Visual basic
Sonuç olarak, uygulamanız strict yapıdaysa ve performans odaklıysa, mesela basit bir çıktı veren konsol programı (cat, wget, tail, mysqlclient’ın mysql’i, vb), veya library (PHP PECL Extension, liblame, libmysqlclient vb) gibiyse procedural; sürekli bakım gerektiren, geniş bir geliştirici kitlesi barındıran, genişletilebilirliği yüksek bir uygulamaysa OO kullanımı benimsenebilir.
Web uygulamalarının ise çoğunluğu basit ve çok fazla bakıma ihtiyaç duymaz; sözkonusu dil (örneğin PHP) sadece template engine gibi çalışır, çok basit aldım verdim işleri yapar, dolayısıyla seçim procedural’dır. Ancak geniş kullanım amaçlı ve geliştirici sayısı yüksek projeler (wordpress, drupal, frameworkler, vb) gibi çok özellik taşıyan ve sürekli bakım gerektiren enterprise düzeyde hizmet uygulamalarında genel seçim nesne tabanlı (OO) dır.
Burada iki örnek verip, kullanım amacını sizin yargınıza bırakıyorum:
PHP’de OO ile Hello World
function printThis($string,$return=0) {
if ($return) return $string;
else echo $string;
}
}
/*1. kullanım*/
$printObject = new Print_Screen();
$printObject->printThis("Merhaba Dünya");
/*2. kullanım, interface varsa*/
Print_Screen::printThis("Merhaba Dünya");
/*3. kullanım, return edelim*/
$s = $printObject->printThis("Merhaba Dünya",true);
echo $s;
PHP ile procedural Hello World,
/*return edelim*/
$s = "Hello World";
echo $s;
İşlevler aynı, peki size hangisi doğru geliyor?
Madalyonun diğer yüzünden bakarsak,
Drupal.org’dan kaynak kodunu indirin, orada yapılanları herhangi bir class kullanmadan yapmayı deneyin, tabii sabrınız yeterse. Gerçekten yaparsanız görmek isterim. ;)
İyi çalışmalar.
Kaynakça
Eğer beğendiysen, belki GWG'nin RSS beslemesine kayıt olmak istersin. Ziyaretin için teşekkürler!









Procedural çalışan bir web sitem vardı fonksiyonların çok dağınık durduğundan ara sıra aynı fonksiyonu başka bir isimle tekrar yazdığım bile olmuş (o kadar çok fonksiyonu vardı) OOP yapıyım düzenli dursunlar bari dedim. tabi şimdi de class’ları birbirine bağladıkça sitenin performansı gitgide düştü.. bu birbirine bağlama olayı yerine harici bir include dosyasına erişim sıralarına göre include mi ettirsem hepsini diye düşündüm bu seferde hepsini yüklemek istemedim çünkü hepsine aynı anda ihtiyacım olmuyor. Kafam karıştı çalışan kodum yarım kaldı :) Ama bunu çözebilirsem daha düzenli bir şekilde kod yazabilirim artık. Anlayabileceğim bi önerisi olan?
Sistemi ve büyüklüğünü tabii ki bilmiyorum, fakat yeterince büyükse ve daha çok uzun yıllar kullanılacak/verim alacağın bir uygulamaysa ilk yapacağım öneri, herşeyi boşverip sistemi ZF veya Agavi’de tekrar yazman. Sadece Loaderları ve MVC’leri bile işini çok kolaylaştıracaktır.
Gökçe’ninde dediği gibi, ZF ‘nin elementleri ile birlikte bunu gerçekleştirir isen daha rahatlayacaksındır.
Fakat tabiki performans düşüşü olacak bunuda kabullenmek zorundayız.
ZF gözümü korkutuyor + şimdilik PHP4 sistemde çalışacak bi kod kümesiyle boğuşuyorum :) Ayrıca framework değilde gerekli classları kendim yazarak sistemin yükünü biraz hafifletmek iyi olur diye düşünüyorum. caching belki işime yarar hız konusunda diye smarty’e entegre etmeye çalışıyorum şimdilik. Classları init diye bi class’ın içinde var olarak load ettiriyorum aynı CodeIgniter loader’ı gibi gerçekleştirdim. İşte açılış konusunda ob_start ob_flush gibi kodları geri çekmeyi düşünüyorum. Öyle devam ediyo işte.
Php yi uzunca bir süredir OO ve procedural ortaya karışık şekilde kullanan bir koder olarak, ortaya karışık işlerin duruma göre pekçok ihtiyacı karşıladığını söyleyebilirim.
Yazıda atlanılan bir konu var o da OO kodların yeniden kullanılabilirliği ve objelerin kalıtsallığı (inheritance) bazı durumlarda sistemleri ağırlaştırıyor gibi görünsede, tekrar yazma, objeleri tekrar kullanma gibi artıları ile OO kullanılabilir kullanılmalıdırda.
@Ahmet
Öncelikle yanlış anlaşılmayı kesinlikle istemem. Hem OO (PHP’de PHP’nin yetersizliğinden ileri gelen OO pek sözkonusu olmasa da en azından Java’da) kullanmış biri olarak kesinlikle bir tarafa sahip değilim. Yazının amacı bilişim dünyasında herhangi bir araçta takım tutmadan, amaca göre yöntem izlemenin doğru olduğunu vurgulamaktı. Procedural ve OO ‘nun ayrı ayrı faydaları var, bu yüzden karşılaştırmalarda da bir tarafa ek yüklenmemek için özenle aynı sayıda tez ve karşı tez kullandım.
Tabii ki yazılım performansı, her zaman birincilliği oluşturmaz. Donanımsal güç günümüzde giderek ucuzlaması karşısında, yazılım performansı maliyetteki payını insan kaynakları yani iş gücü/zaman a bıraktığı düşünülürse, bu iş gücünü etkileyecek yöntem çok büyük değer arzediyor.
Yanlış yöntem, yazılım sektöründe boşuna emek/zaman dolayısıyla üretkenliği ve maliyeti zarara uğramak demek. İki birbirine zıt yanlış seçimi (verdiğim Drupal’i procedural yazmak ve Hello World ‘ün OOP’si) bu yüzden verdim. Yoksa ne OO’a, ne procedural’a karşı olduğum var.. Öyle yapsaydım kullanılacak koşulları bilmeden terlik ve ayakkabı arasında taraf tutmama benzerdi, komik olurdu.
Nerede ne kullanılırın daha da detayına neredeyse sonsuz inilebilir; madem uzun soluklu, sıkça bakıma ihtiyaç duyacak bir yazılımımız olacak, o zaman OO dedik. Peki OO ise, PHP OO’da ne kadar yeterli, niye Java/JSP olmasın? Niye Event driven olmasın, mesela C#? Bu sefer yazılım geliştirme ve bakım kolaylığı bi kat daha mercek altına alınmış oluyor. Bu durumda yazılım esnekliği ve developer community (PHP) tarafına karşı düzen, stabilite karşılaştırılacak.. Sanırım bi kez daha başarıyla konu dağıttım. Neyse, fazlasını söylediysem de umarım yanlış anlaşılmamışımdır.