Harun Reşit Zafer

bâki kalan bu kubbede bir hoş sadâ imiş

Nesneye Yönelik Programlama – 1

Nesneye yönelik programlamayla yeni tanışanlar hemen herkes sınıf ve nesne kavramlarını bir birine karıştırmıştır. Yaklaşık 2 yıl önce Java anlatmaya çalıştığım öğrencilerim için hazırladığım bir dökümanı bir daha gözden geçirip bir makale dizisi haline getirmeye karar verdim. Makale dizisi boyunca Araba örneğini kullanacağım. Bu makalede nesne ve sınıf kavramları üzerinde duracağım. Umarım faydalı olur.

Nesne ile Sınıf Arasındaki Fark

Gözlerinizi kapatın (ya da okumaya devam edebilmek için kapatmayın) ve güzel bir araba hayal edin. Bu arabanın tüm detaylarını, çizimlerini vs. içeren bir belge olduğunu düşünelim. Bu belgeye arabanın planı diyelim. Fabrikada üretilecek her bir araba a’dan z’ye bu plandaki tüm detayları içerecektir.

NYP’deki sınıf kavramı da tıpkı bir arabanın(nesne) planı gibidir. Bu plana bağlı kalarak üretilen her bir araba da sınıfın birer nesnedir. Örneğimizi koda dökecek olursak:

public class Araba{
	public String plaka;	
}

Planlardan bir araba inşa etmedikçe araba kullanmamız mümkün olmadığı gibi, bir sınıfta tanımlanan görevleri icra edebilmemiz için o sınıfın (class) bir nesnesini (object) inşa (construct) etmemiz gerekiyor. Misal:

Araba a1 = new Araba();
a1.plaka = "34 CC 3434";
Araba a2 = new Araba();
a2.plaka = "34 XY 3434";

İşe Araba sınıfına hız özelliği ekleyerek devam edelim.

public class Araba
{
	public String plaka;
	public int hız;	
}

Aşağıdaki kodda göze çarpan 2 problem nedir?

Araba a1= new Araba(); // Şu anda arabanın hızı ne?
a1.hız = 10; // araba plakasız trafiğe çıktı!

Yapıcı Metotlar

Görüldüğü gibi Araba sınıfından oluşturacak yeni bir nesnenin hız ve plaka gibi iki özelliği var ama bu özelliklerin ilk değerleri hakkında bir kısıtlama yok. Yani nesne inşa(construct) edildiğinde bu iki özelliğin durumu ne olacak? Öncelikle oluşturulacak her Araba nesnesi için plaka zorunluluğu getirelim. İkinci olarak da başlangıç hızını sıfır tanımlayalım.

public class Araba
{
	public String plaka;
	public int hız;
	public Araba(String plaka)
	{ 
            this.plaka = plaka;
            hız = 0; //başlangıçta araba hareket halinde değil 		
	}
}

Yukarıdaki kodda sınıf ile aynı adda bir metot tanımladık. Bu metot sadece bir kere sınıf oluşturulurken çağrılacak, plaka ve hız değişkenlerine ilk değerlerini verecektir. Bu metoda yapıcı(constructor) metot diyeceğiz. Aslında “inşa metodu” daha anlamlı bir isim olabilirdi ama zamanında tercüme eden böyle etmiş.

Yapıcı metot da eklendiğine göre arabalarımızı üretim bir geziye çıkabiliriz:

        Araba a1 = new Araba("34 XY 3434"); // artık araba nesnesi oluşturuken
        Araba a2 = new Araba("34 CC 3434"); // plaka vermek zorunlu
 
        a1.hız = 10; 
        a2.hız = 80;    // bir anda 80'e fırladık
        a1.hız = -10;   // mümkün değil !
        a2.hız = 1000;  // mümkün değil !
        a1.plaka = "33 AAA 44"; // plaka değişti !!!

Açıklama satırlarından da anlaşılacağı gibi tasarımda bir-iki hata var. Birincisi araba nesnelerimiz bir anda aşırı bir ivme ile hızlanabiliyor, hızları eksi değere düşebiliyor (geri gitmek ile aynı şey değil!), ya da olmayacak değerlere fırlayabiliyor. İkinci olarak arabamızın başlangıçtaki plakası kolaylıkla değişebiliyor ki bu da istemediğimiz bir durum (en azından bu örnekte öyle olduğunu kabul edelim).

Çözüm için önerisi olan? Belki Araba sınıfını kullanacak olanlara şöyle bir uyarıda bulunabiliriz. “Lütfen hızı yavaş yavaş artırıp, azaltın ve arabanın plakasını zırt-pırt değiştirmeyin”. Kullanıcıların iyi niyetine güvenerek her şeyin yolunda gideceğini, Araba sınıfımızdan üretilen nesnelerin başına kötü şeyler gelmeyeceğini umalım. Ya da NYP’nin bize sunduğu imkânlardan faydalanıp ve işimizi şansa bırakmayalım.

public ve private değişkenler

Aslında temel sorun Araba nesnesinin iki önemli özelliğinin doğrudan erişime açık (public) olması. Bu iki özelliği doğrudan erişime kaparsak (private), onlara dışarıdan erişilip erişilmeyeceğine, erişilecekse bunu nasıl olacağına biz karar verebiliriz.

public class Araba
{
	private String plaka;
	private int hız;
	public Araba(String plaka)
	{ 
            this.plaka = plaka;
            hız = 0; //başlangıçta araba hareket halinde değil 		
	}
}

Artık plaka değeri sadece başlangıçta yapıcı metot aracılığıyla verilebilen ve sonradan değiştirilemeyen bir hale geldi. Hız değerinin de 5’er 5’er artmasını sağlayacak bir metot yazalım.

public class Araba
{
	// diğer kodlar ...
 
        public void hızlan(){
            hız = hız + 5;
        }
}

Artık arabamızın aşağıdaki gibi hızlandıracağız:

        a1.hızlan();// arabanın hızı 5km 
        a1.hızlan();// arabanın hızı 10 km

Gördüğünüz gibi Araba sınıfından üretilecek nesnelerin nasıl hızlanacakları artık tamamen bizim tasarımımıza bağlı. Doğru yolda ilerliyoruz ancak henüz tasarımda temel eksiklikler var. Zira arabamız hızlanıyor ancak, yavaşlamıyor. Ayrıca hız için bir üst limit de yok. Hemen tasarımı bu yönde geliştirelim:

public class Araba
{
	// ...       
        public void hızlan(){
            if (hız  10){
                this.hız = hız - 10;// Güvenlik nedeniyle araba daha çabuk yavaşlamalı
             }
             else{
                 hız = 0;
             }
         }                   
}

Yukarıdaki kodda küçük bir bug var. Bunu sizlerin dikkatine bırakıyorum. ipucu: Yavaşla metodunda hız > 0 değil de hız > 10 kontrolü yaptık?

Özetleyecek olursak Sınıf nesnenin bir planıdır(blueprint). Nesnelerin özellikleri (property) ve metotları(method) vardır. Özellikler nesnenin durumu ile ilgili bilgiyi tutarken (mesela hız) verirken, metorlar bir eylemi (hızlanmak gibi) gerçekleştirirler. Nesnenin özelliklerini doğrudan erişime kapatmak ve özellikler üzerindeki değişimi metotlar aracılığıyla yapmak NYP felsefesinin önemli bir parçasını oluşturur.

Herkese Kolay Gelsin

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInPrint this pageEmail this to someone

1 Yorum

  1. hocam ellerinize sağlık çok güzel bir makale..

Bir Cevap Yazın

E-posta adresiniz yayınlanmayacak

*

© 2017 Harun Reşit Zafer

Temayı tasarlayanAnders NorenYukarı ↑