http://paste2.org/OxJ49ZkH linkindeki koda istinaden:
Oncelikle, her zaman dedigimi tekrarliyorum GitHub kullanmayi aliskanlik haline getirin. En ufak kod parcanizi, calismalarinizi karamalarinizi, notlarinizi, v.b. GitHub'da repository acip paylasin. Bunun birkac yarari var:
- Oncelikle ileride is hayatina atildiginizda sizi ise alacak kisi, Facebook profilinizde arkadasiniza tavsan kulagi yaptiginiz parti fotografinizi degil, ozgur kaynakli projelerinizi inceleyecek.
- GitHub kullanarak ayni zamanda surum yonetim sistemi kullanmayi da ogreniyor olacaksiniz; bu da is hayatina biraz daha onde baslayacaginiz anlamina geliyor.
- GitHub kullandiginizda, baskalari da kodunuzu forklayarak uzerinde duzeltmeler yapabilir; size yardimci olabilir.
- Hatta ogretmeninizle de odevinizi GitHub uzerinden paylasabilirsiniz. – Benim ogrencim olsa, ve bana USB yerine, tum commit gecmisini inceleyebilecegim bir GitHub linki verse, kafadan 100 uzerinden 20 puan bonus verirdim odevine.
Gelelim koda:
- satir 2-4:
@author
gereksiz. Surum yoneti sisteminin amaclarindan biri de kodun sahibinin kim oldugunu takip etmektir. Dolayisiyla kodun header dosyasinda author bilgisini loglamak gecmiste kalmis, ve zamanin gerisinde bir aliskanlik. – Cok gerekiyorsa bir CONTRIBUTORS dosyasi olusturulur, ve projeye katkida olanlarin erisim bilgileri bu dosyaya eklenir. - Method'larda javadoc yorumlarinin olmasi guzel olurdu.
- satir 6: (naming conventions): virgul
,
den sonra bir bosluk birakilmali; her degisken kendi satirinda tanimlanmali; camelCase kullanilmali (door_width
degil;doorWidth
). - (conventions devam) Ilgili kod gruplari boslukla ayrilda, ve
{
den once bir bosluk birakilsa okunabilirlik artar (ozellikle decleration gruplarindan sonra bosluk birakmak adettendir,if
for
vb kontrol kelimelerinden sonra da bir bosluk birakilir). OrnegindrawRoof
metodunu biraz ferahlatalim:
public void drawRoof() {
int space = this.center;
int limit = 2;
for (int i = 1; i <= this.roof_height; i++) {
drawSpace(space);
if (space != this.center) {
for (int j = 1; j < limit; j++) {
if ((limit / 2) == j) {
System.out.print( "+" );
} else if(limit / 2 < j) {
System.out.print("\\");
} else {
System.out.print("/");
}
}
} else {
System.out.print("+");
}
limit = limit+4;
space = space - 2;
System.out.println();
}
}
- satir 17: constructor isimlendirilirken fiil degil, isim kullanilir:
public DrawHome(int width){
degil;public Home(int width) {
. Soyle olsa semantik olarak daha dogru olurdu.
public class Home {
...
public Home(int width) {
...
}
...
public void draw() {
// drawing logic goes here.
}
}
- principle of least knowledge geregince
drawRoof
drawMed
drawDoor
average
methodlarinin private tanimlanmasi lazim (i.e.,private void drawRoof()
) - satir 9:
// TODO Auto-generated method stub
--> WTF? gereksiz bir comment. silinmeli. - " ", "", "*", "/" gibi sik tekrarlanan ve degismeye musait Stringleri sembilik sabit olarak tanimlamak daha dogru olur.
public Constants {
public static final String ROOF_MIDDLE = "+";
public static final String ROOF_RIGHT = "/";
public static final String ROOF_LEFT = "\\";
...
}
gibi. Boylelikle eger ogretmen bir sonraki odevde "haydi simdi evi /
yerine !
ile cizelim dediginde, tum dosyada find/replace yapmaniza gerek kalmaz. (ilgili replace magic number with symbolic constant -- Gercek projelerde bu tarz sabit tanimlamalari hayat kurtarir.
-
System.out.println
cagrilarini -
Uzun ve anlamli isimler kullanmak daha dogru olur.
drawMed
mesela "draw medium" mu, "draw median" mi, yoksa "draw medussa" mi anlasilmiyor;drawMiddle
gibi daha acik net bir isim tercih edilmeli. -
satir 72:
\\ Merkez
--> Kodda Turkce yorum, degisken, fonksiyon ismi kullanirsaniz ugrastirmayin beni, kendinizi kulaginizdan tavana civileyin; bir saat falan asili bekleyin. -
satir 140: Ortalama hesaplamanin en kolay yolu
(a + b) / 2
dir. basit dusunun. Herkes kod yazabilir, onemli olan baskasi okuyunca anlasilabilen kod yazmaktir. –while(--a > ++b);
seklinde bir ortalama alma kodu gordugum anda odevden bir 10 puan kirardim kesin. -
satir 114-116:
if
vefor
ayni seviyede indentli, halbuki for blogunun bir seviye icerde olmasi gerekli. indendation onemlidir. -
System.out.print
veSystem.out.println
cagrilarini birDrawer
sinifinda toplamak guzel olurdu. boylelikle, ileride System degil, baska bir output ortamina da cizim aktarabilirdik.
public interface Pen {
public static void draw(String stuff);
public static void drawLine(String stuff);
}
public class SystemHomePen implements Pen {
public static void draw(String stuff) {
System.out.print(stuff);
}
public static void drawLine(String stuff) {
System.out.println(stuff);
}
}
Ardindan System.out.print
yerine SystemHomePen.draw
ve System.out.println
yerine SystemHomePen.drawLine
.
sanirim simdilik bunlar; akliniza gelen baska seyler olursa paylasmaktan cekinmeyin.