4 Mayıs 2011 Çarşamba

Java İle Programlama

Yeni başlayanlar için öncelikle yapılması gereken nesne yönelimli programlama hakkında detaylı bir araştırma yapmak. Nesneler nedir ne işe yarar sınıflar nasıl kullanılır bunları anlamak önemli.Java programları tamamen sınıf dediğimiz yapılardan oluşur. Bu sınıf dediğimiz yapılar aslında Nesneye Dayalı Programlama Konseptinde yer alır. Daha önce nesneye dayalı programlama ile uğraşmadıysanız , bu konsepte ait terminolojiye biraz bakmak gerekiyor.

Nesne: Günlük yaşamda karşılaştığımız şeyleri modellemek için kullandığımız şeylere nesne diyoruz. Örneğin bir okul otomasyonu yazıyor olsak , burada öğrenci, ders , öğretim görevlisi birer nesne olacaktır. Burada önemli bir nokta da bu nesnelerin hepsinde mevcut iki şey vardır : durumları ve davranışları. Örneğin öğrenci not durumu ve öğrencinin ders seçmesini örnek verebiliriz. Burada not durumu öğrencinin durumu, ders seçmesi de öğrencinin bir davranışıdır.

Mesaj: Geliştirdiğimiz programlarda elbetteki sadece tek bir nesne olması çok ender bir durumdur. Sistem modellenirken bir çok nesneler de modelde oluşur. Bu nesneler birbirleriyle mesajlarla anlaşılır. Örneğin kayıt otomasyonunda ders seçen öğrenci , sisteme kendine o derse kaydetmesi mesajını verir. Burada sisteme kayıt yapan nesne ile öğrenci nesnesi haberleşmek için mesajları kullanırlar.

Sınıf: Sistemi modelleme aşamasında, daha sonda programımızda nesneleri oluşturmak için öncelikle ilgili sınıfları tanımlamamız gerekir. Yani başka bir deyişle , nesneler mevcut sınıfların birer örneğidir. Biz okul otomasyonunda ogrenci sınıfını tanımladıktan sonra , okulda derse kayıt yaptıran her bir öğrenci ogrenci sınıfında bir nesnedir, daha doğrusu öğrenci sınıfının bir örneğidir.

Kalıtım: Buraya kadar nesnelerin , sınıflar aracılığı ile ifade edildiğini söyledik. Sınıfına bakarak bir nesne hakkında çok şey söyleyebiliriz. Örneğin size bir bisiklet nesnesinden bahsetsem , 2 tekerleği, tutacakları ve pedalların olduğunu söylersiniz. Nesneye Dayalı Sistemler işi bir adım daha öteye götürüyor ve başka sınıfları kullanarak ta sınıf tanımlamamıza olanak sağlıyor. Örneğin dağ bisikleti , yarış bisikleti ve iki kişilik bisiklette bisiklet tipinde nesnelerdir. Dolayısıyla tüm bu bisiklet tipleri aslında bisiklet sınıfının alt sınıflarıdır(subclasses) . Diğer bir ifadeyle bisiklet sınıfı bu sınıfların üst sınıfıdır. Bu ilişki aşağıdaki gösterilmiştir:

Bunlara ek olarak kodlar içerisinde // ile başlayan satırlar yorum  satırlarıdır. Bu aynen C++'da olduğu gibidir. Bu satırlar sadece geliştiricilere daha sonra kodu anlamak için yardım amaçlı yazılırlar. Derlenmezler, direkt olarak derleyici bunları es geçer.

Burada da gösterildiği üzere bir kalıtım mevcuttur. Alt sınıflar , üst sınıfın durumları alır (değişkenlerin tanımlandığı şekilde). Tabi burada değişkenlerin üst sınıfta tanımlanma şeklide önemlidir , bu konu üzerinde daha sonra duracağım. Aynı zamanda üst sınıftan bazı methodları da alırlar. Bu metodların bazıları hepsinde vardır örneğin hızArtır, yavasla, vitesDegistir, vs. Tabi burada şuna da değinmek gerekiyor , alt sınıflar sadece üst sınıfın metod ve değişkenleri ile sınırlı değillerdir , kendilerine ait durum ve metodları da olabilir , ya da üst sınıfta bulunan metodları ve değişkenleri kendilerine uyarlayabilirler. Bu durumda metod ve değişkenler üst sınıftaki haliyle değilde , alt sınıftaki yeni haliyle kullanılırlar.

Arayüz: Aslında metod ve sabit tanımlamalar biçiminde bir form için yapılan kontrattır. Diğer bir deyişle , bir sınıf, bir arayüzü yürüttüğünde  , o arayüzün içerisinde bulunan tüm metodları yürütmek için söz vermiş olur. Bu bize şunları sağlar:

* Birbiriyle akalı olmayan sınıflar arasında benzerlikleri , bir sınıf ilişkisi oluşturmak zorunda kalmadan yakalamaya yarar.
* Bir ya da daha fazla sınıf tarafından yürütüleceğini bildiğimiz metodları tanımlamaya yarar.

Bir nesnenin sınıfını göstermeden , onun programlama arayüzünü açığa çıkarmaya yarar. Peki bütün bunları tanımladıkta , bunları nasıl koda dönüştürecez , şimdi de bunu biraz inceleyelim.

Örnek olarak yazacağımız kod bir applet örneğidir. Appletler Java platformu desteği olan tarayıcılarda ( Hot Java, Netscape, vs ) çalışan Java programlarıdır. Program çalışmak için 3 adet dosyaya ihtiyaç duymaktadır. Bunlardan birisi appletimizin üzerinde çalışacağı html dosyası , diğerleri de ihtiyaç duyduğumuz 2 adet Java dosyasıdır. Program üzerine tıklandığında ekrana kırmızı bir spot basan applet örneğidir.


şeklinde html tagları arasına gömülmüş halidir. Yazdığımız programların nasıl derleneceğine bir sonraki yazıda gireceğim için burada derlemenin nasıl yapılacağı ve neler gerektiğini atlıyorum. Sadece kodları açıklayacağım.

Burada da görüldüğü üzere ClikMe.java dosyası Spot.java dosyasına ihtiyaç duymaktadır. Dolayısıyla bu dosyaları aynı klasör içine koymaya dikkat edin.

Applet için gereken dosyalar :

public class Spot {
//instance variables
public int size;
public int x, y;
//constructor
public Spot(int intSize) {
size = intSize;
x = -1;
y = -1;
}
}

Burada Spot nesnesi ekrana çıkarılacak olan kırmızı spotu temsil etmektedir. Dolayısıyla spotun ekrandaki koordinatları bu sınıfın üye değişkinleri olarak belirlenmiştir. Aynı zamanda spotun boyutunu temsilen size ( yani çap olarak ) kullanılmıştır. Bu arada sınıf içerisinde bir de kurucu metodu (Constructor) bulunmaktadır. Üyesi olduğu sınıfın adını aldığı için diğer metodlardan ayırt edilir. Farklı parametrelerle değişik tiplerde kurucu tanımlamaları yapılabilir. Bu kurucular o sınıftan oluşturulan nesnelerin otomatik olarak ilklendirilmelerine (initialize) olanak sağlar. Yani çapı 10 olan bir Spot oluşturmak istiyorsanız , bunu kurucuya parametre olarak aktarmanız yeterli olacaktır.

public Spot(int intSize) {
size = intSize;
x = -1;
y = -1;
}


İfadesinde nesne oluşturulurken int bir parametre beklemektedir. Bu parametre aracılığı ile çap belirlenecektir. Bu Spot sınıfı için eğer parametre geçirmezseniz program hata verir. Peki bir sınıftan nasıl nesne oluşturulur ona bakalım şimdi:

Spot mySpot= new Spot (10);

Şeklinde programımızda yazdığımız zaman, adı mySpot ve çapı 10 olan bir Spot nesnesi yaratmış oluruz.

ClickMe appleti, ClickMe sınıfının bir örneğidir. Burada ClickMe sınıfı aşağıdaki gibi tanımlanmıştır:

public class ClickMe extends Applet implements MouseListener
{
...
}

Burada extends anahtar kelimesi ClickMe sınıfımızın , Applet sınıfından türetildiğini göstermektedir, implements anahtar kelimesi ise daha önce anlattığımız gibi MouseListener arayüzünü yürüttünü göstermektedir. Yani diğer bir deyişle , applet üzerinde mouse'a tıkladığımızda bir şeyler olacak demektir. Tabi ki , mouse ile neler yapması gerektiğini applet 'e kodlayacak olan biziz. Bu örnek için appletten mouse 'a tıklandığında ekranda kliklediğimiz yere kırmızı bir spot koymasını istiyoruz.

ClickMe Applet'i için tüm kod aşağıdadır:

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class ClickMe extends Applet implements MouseListener {
private Spot spot = null;
private static final int RADIUS = 7;

public void init() {
addMouseListener(this);
//Applet'e bir mouse dinleyici //ekledik.

}

public void paint(Graphics g) {
// draw a black border and a white //background
g.setColor(Color.white);
g.fillRect(0, 0, getSize().width - 1, getSize().height - 1);
g.setColor(Color.black);
g.drawRect(0, 0, getSize().width - 1, getSize().height - 1);

// draw the spot
g.setColor(Color.red);
if (spot != null) {
g.fillOval(spot.x - RADIUS,
spot.y - RADIUS,
RADIUS * 2, RADIUS * 2);
}
}
public void mousePressed(MouseEvent event) {
if (spot == null) {
spot = new Spot(RADIUS);
}
spot.x = event.getX();
spot.y = event.getY();
repaint();
}
public void mouseClicked(MouseEvent event) {}
public void mouseReleased(MouseEvent event) {}
public void mouseEntered(MouseEvent event) {}
public void mouseExited(MouseEvent event) {}
//söz verdik , kullanmasakta yazalım
}

Burada Graphics g değişkeni ( Graphics sınıfında bir nesne ) ekran üzerinde işlemler yapabilmemizi sağlıyor. Arka planın rengini , kenarların rengini vs değiştirmemize olanak sağlıyor.

public void mousePressed(MouseEvent event) {
if (spot == null) {
spot = new Spot(RADIUS);
}
spot.x = event.getX();
spot.y = event.getY();
repaint();
}

Burada mouse 'a tıklandığında , eğer bu ilk tıklama ise applet bir Spot nesnesi oluşturuyor ve ona ilk değerini veriyor. Daha sonra oluşturduğu spot nesnesinin değişkenleri güncelleniyor.

event.getX(); event.getX();


metodları ile de mouse'u tıkladığımız yerin koordinatlarına ulaşıyoruz ve applet oraya kırmızı bir spot koyarak bize cevap veriyor. Ardından repaint(); metodu ile de ekranda yeni Spot gösterilir.

if (spot != null) {
g.fillOval(spot.x - RADIUS,
spot.y - RADIUS,
RADIUS * 2, RADIUS *2);
}

Kodu da eğer mouse'a tıklanmışsa ( Bunu da spot != null ifadesinden kontrol ediyoruz, eğer null olsaydı , başlangıçta tanımlandığı durumu koruduğunu gösterirdi. Bu da bize mouse'a hiç tıklanmadığını bildirecekti) nerde tıklandıysa tam orayı merkez kabul ederek oraya bir Spot'un nasıl koyulduğunu gösteriyor.

Buraya kadar nesneye dayalı programlama terminolojisini ve bir uygulama gördük. Bir dahaki yazımda yazdığımız Java programlarımızı nasıl derleyeceğimizden , hangi ortamların gerektiğinden vs bahsedeceğim.