Java’ya Nasıl Başlarım? Java’yı Nasıl Öğrenirim? – III
Nesneler, Java’nın en temel yapıları halledilir halledilmez ele alınırlar ve Java’yı çok daha zevkli kılarlar. Ben, Java Dersleri sayfasından da göreceğiniz gibi, Nesne-Merkezli Programlamanın Temelleri isimli 2. bölümde, nesne yapılarına , kavramsal bir giriş yapıyorum. Bu bölümde zihnimizin, soyutlama (abstraction) ve kategorileştirme ya da sınıflandırma gibi temel çalışma prensiplerinden yola çıkarak, gerçekliği, nesneler üzerinden nasıl algıladığımızı ya da daha doğru bir ifade ile kurguladığımızı ele alıyorum. Sınıf eğitiminde, sınıftaki katılımcıların felsefi düşünme yetenekleri ve zevkleri ile bu kısım enfes hale gelebiliyor. Çoğu zaman katılımcılar, nesne-merkezli programlamaya böyle bir girişi garip karşılıyorlar ama o gün içinde felsefi temalı esprilerin gırla gidiyor olması, meramımın anlaşıldığı izlenimini uyandırıyor bende 🙂
Bu bölümde, felsefi temellerden yola çıkıp, nesne-merkezli programlamaya doğru ilerleyip, bir araba soyutlamasını nasıl yaptığımızı ve Java’da nesne-merkezli olarak bu soyutlamayı nasıl gerçekleştirdiğimizi ele alıyorum. Aslında problem şu: Bir sınıf oluşturup, üzerine üç beş tane private nesne değişkeni koyup sonra da bunların set/get metotlarını yazmanın, nesne-merkezli programlama olmadığını, bu bölümden itibaren vurguluyorum ben. Bu konuda tecrübeli olanlar, ne dediğimi daha iyi anlayacaklardır ki nesne oluşturmak aslında bir soyutlama yapmaktır. Yani önemli olan, soyutlamanın nasıl yapılacağıdır, bunu Java ile hayata geçirmek ise çok teknik bir detaydır. Bu detay önemlidir çünkü çalışan şey o detaydır. Ama o detayın doğru olup olmadığı, soyutlamanın doğru olup olmadığına ya da başka bir değişle, var olan duruma ne kadar uygun olduğuna doğrudan bağlıdır.
İlerleyen bölümlerde nesne yapılarına daldıkça, bu bölümde giriş yaptığım soyutlama kavramına daima referans veriyorum. İlerleyen bölümlerden kasıt da önce, Java Nesneleri: Temeller, sonra da Java Nesneleri: Organizasyon isimli iki bölüm. Sonrasında Tekrar Kullanım ve Kalıtım, Çok Şekillilik ve Arayüzler isimli üç bölüm geliyor ve nesne-merkezli programlamanın temelleri hallediliyor.
Java Nesneleri: Temeller bölümünde, en temel sınıf yapıları ele alınır: Sınıf tanımı, nesne değişkenleri ve metotları. Nesne yaratmak ve bir referansa atamak ile nesne ve referans ayrımı, en başta ele alınır. Sonrasında bileşik nesneler (composite objects) üzerinden, nesne-merkezli bir yazılımın, nasıl bir nesne ağı (web of objects) olduğunu vurgularım. Metotlardan bahsederken, tabi olarak, parametrelerden, parametre geçmekten, overloading ya da Türkçesiyle, çok kullanım, metotların imzaları ve arayüzleri, yani interfaceleri ve belki de en önemlisi de metotların ne için oldukları, bu kısımda ele alınanlar arasındadır. Sonrasında, kurucu metotlar yani constructorlar, this anahtar kelimesi, final anahtar kelimesinin nesnelerin referansları ve parametreler ile kullanımı ve static anahtar kelimesi ele alınır. static anahtar kelimesi bağlamında nesne-merkezli programlamanın en güzel taraflarını tartışırım. “Ne zaman static?” sorusu nefistir ve nesneleri anlamak için sorulması gereken en kritik sorulardandır. Danışmanlıklarım sırasında, “Hocam, daha kolay olsun diye tüm metotları static yaptık” şeklindeki açıklamalara sıkça muhatap alup, bol “la havle” çekmiş birisi olarak bu kısıma çok önem verir, tüm detayıyla anlaşılmasını sağlarım.
static kullanımını anlatırken, Cem Yilmaz’lığımın en nadide örneklerinden olan, “Yeni Java’cının Sefaleti” (Poverty of Newbie Java Programmer) isimli skeçimi de oynarım 🙂 Skeç, Java’ya (başka herhangi bir nesne-merkezli dil de olabilir) yeni başlamış bir programcının, kendi makinası başında oturur durumuyla başlar. Yeni Javacımız, editöründe heyecanla yeni bir sınıf oluşturup, içine bir nesne değişkeni ile bir main metot yazar. Sonra da main metot icinde bir satırlık System.out.println() ile bu değişkeni basmak ister. Gelin görün ki, bu kod derlenmez bile. Aklına gelen bilimum Java anahtar kelimelerini ve atraksiyonunu kullanan yeni Javacımız, sonunda tesadüf eseri, nesne değiskeni tanımladığı satırın başına “static” yazdığında, programın derlendiğine ve problemsiz çalıştığına şahit olur ve tabi ki havalara zıplar 🙂 Sonra programcımız, main metotun altına bir başka metot ekler ve onu da main metot içerisinden çağırmaya çalışır. Yine derleme problemiyle karşılaştığında, sihirli kelime olan “static”in sorununu çözdüğünü hayranlıkla görür. Veee, tabi ki kararını verir: static geldi zulüm bitti 🙂 Böylece artık yeni Javacımız, her değişken ve metotu static yaparak, müthiş bir nesne-merkezli programlama gurusu olmaya başladığını hisseder. Bu durum, “şu okullar da olmasa ne güzel yönetirdim ben Milli Eğitim Bakanlığı’nı” diyen devletlümüzün durumuna çok benzer: Hiç nesne yaratmazsanız, “nesne-merkezli programlama” birden çok kolay hale gelir 🙂 Cok komik değil mi? Nesnesiz, nesne-merkezli programlama 🙂 Bu skeç, aynı zamanda “static”in ne kadar bulaşıcı 🙂 olduğunu göstermesi açısından da mükkemmeldir.
Bu bölümde daha sonra, başlatma blokları (initilization blocks) ile başlatma sırası (initilization order) ele alınır ki özellikle ikinci konu, Java’nın ve nesne yapılarının çalışmasını anlamak açışından çok faydalı ve bir o kadar da zevklidir. Sonrasında, temel Java eğitimlerinde hep eksik kaldığını düşündüğüm bellek yönetimini (memory management) ele alır, yığın (stack) ve dinamik bellek (heap) alanlarını, ne işe yaradıklarını, Java’da nasıl ilgili hataların alınabileceğini ve JVM parametreleriyle nasıl ayarlanabileceğini gösteririm. Unutmayalım ki, kurumsal Java yazılımlarında en temel problemler, bellek ile ilgilidir.
Java Nesneleri: Organizasyon bölümü ise daha kısadır ve bir önceki kısmın aksine, sınıfın, etrafındaki diğer sınıflarla ilişkisini düzenler. Bu yüzden bu bölümde, package ve import anahtar kelimeleri ile ünlü classpath kavramı ve ayarı ele alınır. Sonrasında, sarmalama (encapsulation) ve kız kardeşi olan bilgi saklama (information hiding) prensipleri, iç tutarlılık (cohesion) ve bağımlılık (coupling) üzerinden ele alınır. Bu şekilde, sağlıklı ya da kaliteli bir nesne-merkezli programlamanın, sarmalama ile bilgi saklama prensiplerin üzerine nasıl bina edildiği ve bunun da Java’da erişim niteleyiciler (access modifiers) ile nasıl gerçekleştirildiği öğrenilir. Tam bu noktada, arayüz kavramı tekrar ele alınır ve yüksek iç tutarlıklı (highly cohesive) ve az bağımlı (lowly coupled) nesneleri yaratmak için nelere dikkat etmek gerektiği tartışılır. “Program to an interface, not an implementation” yani “arayüze programlama yapın, gerekleştirmeye değil” prensibi de bu tartışma sırasında ele alınır.
Bu bölümde ayrıca, erişim niteliyicilerin enfes bir uygulaması olarak singleton yani tek nesne tasarım desenini de bir problem olarak sınıfa sunar, cevabın bulunmasına yardımcı olurum. Böylece hem karmaşık gibi görünen bu konu ve static kullanımı pişirilir hem de programlama keyfi doruğa çıkar 🙂
Bu bolümün sonunda, arayüzden bahsetmişken, API yani Application Programming Interface kavramı, Java API’si ve nasıl kullanılacağı ve javadoc ile nasıl oluşturulduğu ve bizim de kendi kodumuzun API’sini nasıl oluşturacağımız işlenir.
Bu iki konuyu takiben, nesne-merkezli programlamanın diğer yapıları ele alınır ki onların detayına da bir sonraki yazıda girelim.
Bol Java’lı günleeerrr 🙂
Toplam görüntülenme sayısı: 6482
cem
18 Nisan 2013 @ 15:03
Uzun bir aradan sonra yazınızı okumak zevkliydi.. Teşekkürler..
Akin
19 Nisan 2013 @ 01:44
Tesekkur ederim 🙂
Kürsat
24 Haziran 2014 @ 17:28
Emeginize saglik, harikasiniz.. 🙂
Akin
25 Haziran 2014 @ 11:55
Siz de 🙂
arc
26 Ağustos 2014 @ 13:21
Bu yazı dizisi muazzam olmuş. Çok teşekkürler.
Akin
26 Ağustos 2014 @ 21:47
Sevindim begendiginize.
Tesekkurler.
Emre Celebi
01 Nisan 2015 @ 18:38
Bilgilerin kendisine saklandığı bir zamanda büyük bir içtenlikle aktarmaya çalıştığınız bilgiler için teşekkür ederim 🙂
Cavid
03 Ağustos 2016 @ 23:14
Teşekkürler. İnsan internetde aradığını bulunca nasıl da seviniyor. )))
İyi ki, sizin gibi insanlar vakit ayırıp bilgilerini paylaşıyor.
Akin
16 Ağustos 2016 @ 18:29
İyi ki sizin gibi okuyucular var, beğenilerini de eleştirilerini de iletiyorlar.
Teşekkür ederim.