İsimlendirme ve Hungarian Notation
İsimlendirme, kod yazarken en başta düşünmemiz gereken konulardan. Hatta o kadar ki bir şeye iyi bir isim bulamıyorsak muhtemelen o şeye sahip olmamamız gerekli ya da yanlış bir soyutlama yapıyoruz demektir. Bu yüzden doğru ve standart isimlendirme, anlaşılır kod, basit kod, clean kod, artık ne derseniz deyin, yazmanın en temel öğesi.
Java’nın çok güçlü bir isimlendirme standardı ve geleneği var. Bu standart üzerinde daha önce burada yazmış ve bir de kendi oluşturduğum bir isimlendirme ve şekil standardı dokümanı paylaşmıştım. Java’nın bu kadar güçlü ve yaygın isimlendirme standardı olmasına rağmen hala zaman zaman Java öncesi alışkanlıkların Java kodlarına taşındığına da şahit oluyorum. Bunlardan en yaygını ise “Hungarian Notation” ya da Macar Notasyonu denen isimlendirme yöntemi.
Hungarian Notation, DOS’un ilk zamanlarında Microsoft’un mimarlarından olan, Macar Dr. Charles Simonyi tarafında geliştirilmiş bir isimlendirme standardıdır. Bu standardın en belirgin tarafı, tip bilgisinin ismin başına kısaltma olarak gelmesidir. Örneğin
lNumber: long integer değişken bReadLine(): byte döndüren bir fonksiyon fTrue: boolean değişken
Yukarıdaki örnekler tip ile ilgili bilgi veriyor. Macar notasyonunda tip dışında
pX: X'e bir pointer cX: X'in nesnelerinin sayısı
gibi daha mantıksal ön ekler de mevcuttur. Bu şekilde isimlendirmeyle oluşturulmuş bir kod şöyle gözükecektir:
1 #include "sy.h" 2 extern int *rgwDic; 3 extern int bsyMac; 4 struct SY *PsySz(char sz[]) 6 { 7 char *pch; 8 int cch; 9 struct SY *psy, *PsyCreate(); 10 int *pbsy; 11 int cwSz; 12 unsigned wHash=0; 13 pch=sz; 14 while (*pch!=0 15 wHash=(wHash<>11+*pch++; 16 cch=pch-sz; 17 pbsy=&rgbsyHash[(wHash&077777)%cwHash]; 18 for (; *pbsy!=0; pbsy = &psy->bsyNext) 19 { 20 char *szSy; 21 szSy= (psy=(struct SY*)&rgwDic[*pbsy])->sz; 22 pch=sz; 23 while (*pch==*szSy++) 24 { 25 if (*pch++==0) 26 return (psy); 27 } 28 } 29 cwSz=0; 30 if (cch>=2) 31 cwSz=(cch-2/sizeof(int)+1; 32 *pbsy=(int *)(psy=PsyCreate(cwSY+cwSz))-rgwDic; 33 Zero((int *)psy,cwSY); 34 bltbyte(sz, psy->sz, cch+1); 35 return(psy); 36 }
Modern dillerle uğraşanların yukarıdaki gibi bir kodla karşılaşmak isteyeceklerini sanmıyorum. Java, C#, Python gibi modern diller isimlendirme ile ilgili, Simonyi’nin notasyonunu geliştirdiği zamanki dillere göre pek çok avantajı var. Modern dillerde tip kavramı çok daha zengin, bu dillerin ifade gücü eskilere oranla çok yüksek, fiziksel hiç bir sınırlamaları da yok. Hele nesne merkezli diller tip kavramını çok daha mantıksal bir seviyeye çıkarmışlar ve isimlendirme ile ilgili herhangi bir kodlamaya ihtiyaç bırakmamışlardır.
Zaman zaman Javacılar arasında macar notasyonun etkilerini görüyorum. Örneğin nesne değişkenlerini member kelimesinden esinlenerek “m_” ile başlatıp yerel (local) aynı isimli yerel değişkenlerle karışmasını önlemek ya da metoda geçilen parametreleri “p_” ile başlatmak gibi. Bence Javacıların bu tipten kodlamalara da ihtiyacı yok. Zaten internette yaygın olarak bulabileceğiniz hiç bir standartta böyle bir uygulama da yok. Örneğin Google’ın Java isimlendirme standartında “Rules common to all identifiers” kısmında şöyle deniyor:
“In Google Style special prefixes or suffixes, like those seen in the examples name_, mName, s_name and kName, are not used.”
Dolayısıyla Javacılar da “m_” gibi ön ekler kullanmaktan vazgeçmeliler. Metotlarda aynı isimdeki yerel değişkenlerden ayır etmek için “this” anahtar kelimesi kullanılmalıdır. Bu şekilde kodlamaların belki standart olmasa bile en fazla bileni ve kullanılanı, interface isimlerinde başta ya da sonra “I” kullanılması ve bu arayüzlerin gerçekleştirmelerinde ise “Impl” son ekinin kullanılması olabilir. Arayüzleri ayrı paketlere koyarak ya da arayüzlerin ruhuna uygun isimlendirmeler ile böyle bir kodlamaya da gerek kalmayabilir.
İfade gücü yüksek isimlendirme her zaman kodlayarak isimlendirmeden daha anlaşılırdır. En önemlisi ise bir koda baktığınız zaman sizin de aynı standartta kod yazacağınızı biliyor olmanız. Standartlara uymak çok büyük rahatlık.
Toplam görüntülenme sayısı: 1467