İçindekilerGirişİndex
YukarıİlkÖnceki YokSonraki YokSon
Geriİleri
Yazdır

Java İpuçları

Bu dosyada Java ile ilgili ipuçları vardır.

Kod Yazımı

Bütün constructor'lar bir tane büyük constuctor'ı çağırnalı

Bilindiği gibi Java'da bir constructor diğerini this() diyerek çağırabilir. En doğru yaklaşım, gerekli bütün property değerlerini parametre olarak alan büyük bir constructor yapmak, diğerlerinde de bu costructor'u default değerlerle çağırmaktır. Örneğin, üç kenarı olan bir üçgeni belirtmek için Triangle adında bir class yaptığımızı düşünelim. Eğer sadece iki kenar girilirse üçüncünün ikinciye eşit olduğu bir ikiz kenar, tek kenar girildiğinde de üç kenarın da birbirine eşit olduğu eşkenar üçgen oluşturmak istedğimizi varsayalım. Bu class'ı şu şekilde yapabiliriz.

Göster Gizle Kopar Satır Gizle Satır Göster
public class Triangle{

  private int edgeA;
  private int edgeB;
  private int edgeC;

  public Triangle(int a,int b,int c){
    edgeA=a;
    edgeB=b;          
    edgeC=c;    
  }
  public Triangle(int a,int b){
    edgeA=a;
    edgeB=b;          
    edgeC=b;    
  }
  public Triangle(int a){
    edgeA=a;
    edgeB=a;          
    edgeC=a;    
  }

}

Bu class'ta teknik olarak bir hata yoktur. Ancak herhangi bir değişiklik, üç constructor'da da değişiklik yapmayı gerekli kılmaktadır. Örneğin, bir önlem olarak girilen kenar değerinin negatif olması durumunda onu pozitife çevirmemiz gerekli olsun.

Bu durumda yukarıdaki class şu hale gelecektir :

Göster Gizle Kopar Satır Gizle Satır Göster
public class Triangle{

  private int edgeA;
  private int edgeB;
  private int edgeC;

  public Triangle(int a,int b,int c){
    edgeA=Math.abs(a);
    edgeB=Math.abs(b);          
    edgeC=Math.abs(c);    
  }
  public Triangle(int a,int b){
    edgeA=Math.abs(a);
    edgeB=Math.abs(b);
    edgeC=Math.abs(b); // edgeC=edgeB de olabilir
  }
  public Triangle(int a){
    edgeA=Math.abs(a);
    edgeB=Math.abs(a);  // edgeB=edgeA da olabilir        
    edgeC=Math.abs(a);  // edgeC=edgeA da olabilir  
  }

}

Görüldüğü gibi bütün ifadeleri değiştirdik. Toplam 9 x 1 değişiklik! Eğer değişiklik beş satırdan oluşsaydı sonuç 9*5 = 45 ediyordu! Oysa diğer iki constructor'un en büyük (en çok parametre alan) constructor'u çağıracak şekilde yapsaydık sadece o büyük constructor'u değiştirmemiz yeterli olcaktı. İlk class'ta constructor'ları şöyle yazmış olmalıydık:

public Triangle(int a,int b,int c){
	edgeA=a;
	edgeB=b;					
	edgeC=c;		
}
public Triangle(int a,int b){
	this(a,b,b)		
}
public Triangle(int a){
	this(a,a,a)				
}

Görüldüğü gibi bu hali bile diğerinden daha kısa. Mutlak değer değişikliğini sadece ilkinde yapalım :

public Triangle(int a,int b,int c){
	edgeA=Math.abs(a);
	edgeB=Math.abs(b);					
	edgeC=Math.abs(c);				
}

Diğerleri hep bu değişmiş constructor'u çağırdığından, yapılan değişiklik onları da bağlamaktadır. Değişikli 3 x 1 satırda olmuştur. Değişikliğin 5 satır sürmesi durumunda dahi toplam 3x5= 15 değişiklik yapmış olacaktık. 45 nerde 15 nerde!

Bir işlem tek bir yerde yapılmalı!

Zaman zaman birbiriyle aynı veya çok benzer işlemleri bir çok yerde yapmak durumunda kalırız. Bazı programcılar bir işi ikinci kez yapmak zorunda kaldıklarında ilkini hemen kopyalar ve ikinci yere yapıştırır. Üçüncü kez gerektiğinde yine kopyala yapıştır yapar, dördüncüsünde yine...

İlk yazılan kodda bir hata olduğunun farkına varıldığını veya programcıya bağlı olmayan bir sebepten ötürü ilk kodun artık çalışmaz duruma geldiğini varsayalaım. Veya herhangi bir sebepten ötürü ilk kodun değiştirilmesi gerektiğini düşünelim. Bu durumlarda, önce ilk yapılan kodu değiştirmek sonra da bu değişikliği öteki taraflara kopyalamak gerekir. Eğer değişiklik basit bir text değişikliğiyse sorun yok. Bu klasörün altındaki bütün dosyalarda şu değeri şununla değiştir diyebileceğimiz programlar mevcuttur. Bazı editörlerde bulunan 'Extended Find' ve 'Extended Replace' burada yardımımıza koşuyor.

Peki ya bütün dosyalar aynı klasörün altında değilse? Ya o değişikliği nerelere kopyaladığınızı unuttuysanız? Veya değişiklik bazılarında yapılmalı bazılarında yapılmamalıysa? Ya ilk kopyalamadan sonra zamanla kopyaları farklı şekillerde değiştirdiyseniz? O zaman hiç bir araç sizi kurtaramaz! Tek tek bu kodların üzerinden geçmeniz, ayıklama yapmanız gerekir. Bir de bu işi, sizin yazmadığınız, kodu devraldığını, sizden önceki programcının yaptığını düşünün. Siz kopalamanın nereler yapıldığını bile bilmiyorsunuz!

Kendi kodundan ne kadar copy-paste yapıyorsanız o kadar kötü programcısınız! (Başkalarının kodlarından copy-paste yapmak elbette mübahtır.) Object-Oriented Programming, programcı bunu yapmasın, bir nesne yapsın onu her yerde kullansın, onu değiştirdiğinde diğer bütün kod otomatik olarak değişikliğe adapte olsun diye yapılmıştır.

Şimdi sert-kodlu (hard-coded) programlamanın alternatiflerini çeşitli durumlarda inceleyelim.

Değişken Değerleri

Bir değerin her yede kullanıldığın varsayalım :

if(code==0){
	// ...	
}else if(code==1){
	// ...
}

Her yerde kullanılan bir değer mutlaka bir değişkene atanmalıdır :

public final static int CODE_YES=0;
public final static int CODE_NO=1;
public final static int CODE_MAYBE=2;	

ve

if(code==CODE_OK){
	// ...	
}else if(code==CODE_NO){
	// ...
}

şeklinde kullanılmalıdır. NO olarak -1, YES olarak da 2 kullanılması gibi bir değişiklik yapıldığında değişiklik sadece bir yerde yapılır. Bu yaklaşımın başka bir yararı okunaklılığı artırmasıdır. Her yere "0" yazıp dah sonra "0 neydi yahu?" demek yerine, CODE_YES demek daha anlaşılırdır.

Kod Parçası

Aynı kod birden fazla yerde karşımıza çıksın :

if(x=5){
	a=3;
}else{
	a=6;
}
// ...

if(x=5){
	a=3;
}else{
	a=6;
}

Bir işlem bir method'un içerisinde yapılırsa

public void doSomething(int x){
	if(x=5){
		a=3;
	}else{
		a=6;
	}
}

ve her yerden bu kod çağırılırsa

doSomething(3);
// ...
doSomething(5)

daha doğru olur. Daha sonra bu işlem değiştirilirse

public void doSomething(int x){
	if(x=5){
		a=7;
	}else{
		a=6;
	}
}	

bütün çağıranlar değişiklikten etkilenir.

Sonuç

Belki hard-code'un zararlarını anlamak kolaydır. Ancak hard-code'dan kurtulmak o kadar da kolay değildir. Özellikle buna bağımlı olanlar, acele iş yapmaya alışkın olanlar, plansız programsız çalışmayı 'hüner' sayanlar için belki imkansız bile denebilir. Her programlama tekniği gibi bu sisteme de alışmak elbette zaman alır. Ayrıca bir programı yazarken neyin o kod parçasına özgü, neyin heryerden çağırılabilecek ortak kod olduğunu anlamak o kdar da kolay değildir. Ancak biraz deneyim kazandıktan sonra programcılar aynı şeyleri tekrar tekrar yapmaktan sıkılmaya başlar. Bir kod bir kere yazılır yüzlerce kez değiştirilir. Bir değişikliği tek yerden yapmak uzun vadede kazanç getirir.

Class değişkenlerini her zaman private yap

private yapılmış değişkenin değerini alınması ve set edilebilmesi için set ve get methodları yap.

public class Test{
	private int year=1990;
	public void setYear(int year){
		this.year=year
	}
	public int getYear(){
		return year;
	}
}

Yukarıda görüldüğü yer değişkeninin değeri sadece setYear ile değiştirilebilir. Özellikle bir değişken set edildiğinde başka bir takım işlemler yapmak gerekiyorsa set methodu kullanmak şart olur. Örneğin yıl set edildiğinde bir boolean değişkeni set etmemiz gerekirse gerekirse

	public void setYear(int year){
		this.year=year
		isYear=true;
	}

Eğer year depişkeni public olsaydı şu şekilde değiştirilebilirdi

Test t=new Test();
t.year=2001;

bu şekilde year set edilirse isYear değişkeni true olarak set edilmemiş olur ve bir takım hatalara neden olabilir.

Eğer bir class'ta birbirleriyle ilişkili çok sayıda değişken varsa bu değişkenleri tutan ayrı bir class yapın.

Örneğin aşağıdaki gibi bir class'ınız olsun

class Test{
	private String street;
	private String city;
	private String state;
	private int no;
	...
}	 

şeklinde adresle ilgili birçok değişken varsa Address class'ı yapıp ,bu değişkenleri o class'a koyabilirsiniz. Böylece class'ta sadece Address değişkeni olur.

	Addres addres;

Class'ın akışında standart bir biçim kullan

Örneğin önce değişkenleri, sonra kurucuyu, sonra method'ları yazabilirsin. Bunları kendi içinde de önce public'leri, sonra private'leri koyabilirsin. Örneğin static olanları normal olanlardan sonra yazabilirsin. Bu şekilde örneğin bir private methodu bulman kolay olur.

İsimlendirmede convention'a uyun

Java'da değişken,method veya class isimlerinde bir convention kullanılmaktadır. Class isimleri her zaman büyük harfle başlar, değişken ve method isimleri ise küçük. Eğer bir isim iki veya daha fazla kelimeden oluşuyorsa ilkinden sonraki isimler büyük harflerle başlar. Değişken alan method'lar get, değişken set eden methodlar set ile başlar. Booelan değer döndüren methotlar is veya has ile başlar.

İnheritance (Miras Alma)

Eğer birden fazla class'ta ortak özellikler var ise bu özellikleri için yeni bir üst class yapın.

Örneğin kare ve üçgen adlı iki class yapacaksınız. kare ve üçgen için alan, ağırlık merkezi vs.. gibi bazı ortak özellikler olabilir. Bunlar şekil adında bir üst class'a koyulabilir. Üçgen ve Kare class'ları bu class'tan extend edilirler.

protected alan kullanmayın

Eğer bir değişken protected yapılırsa sub class'lar bu değişkene erişebilirler. prtoceted bir koruma sağlamaz. Çünkü biri sizin class'ı extends eden bir class yazabilir ve değişkene doğrudan erişebilir. Java'da protected değişkenlere aynı paket içindeki tüm classlar'dan erişilebileceği için koruma sağlanamaz. Ancak proteted method kullanılabilir. Bu sayede sub class'lar bu methodu yeniden tanımlayabilirler.

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖnceki YokSonraki YokSon
Geriİleri
Yazdır