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

Class Print_Screen () {
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,

echo "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.

Eğer beğendiysen, belki GWG'nin RSS beslemesine kayıt olmak istersin. Ziyaretin için teşekkürler!