acehreli
04/05/2004, 01:51
Baska bir konuya kisa bir yanit vermek icin basladigim yazi
kendi konusu olacak kadar buyudu. Programlarda ad secimleri
konusunda kullandigim kurallari hatirladigim kadariyla
yaziyorum:
Ad secimleri konusunda kendi uyguladigim kurallar cok
hizlica ve aklima geldigi kadariyla asagidaki gibi. Bu
kurallari baska C++'cilarin kodlarinda gorerek benimsedigim
icin genelin de hosuna gittigini dusunuyorum.
Soylemeye gerek olmayan :) kurallar
===================================
- Ad, programda temsil ettigi seyi acikca belli etmelidir:
int toplamHoroz = 1; // iyi
int omrTrps = 0; // OmUr torpusu! ;)
int f = 3; // felaket!
Not: Tek harften olusan adlar, cok yerlesmis olduklari icin
dongu degiskeni olarak kullanilabilirler. Ama o da icice
dongu kullanildiginda kedere neden olur :)
- Uygulanan kurallar tutarli olmalidir
- Projede kabul edilen kurallara uyulmalidir. (Cikintilik
rahatsiz eder. :) )
Konusulsa iyi olan kurallar :)
==============================
- Birlesik sozcukler: Birden fazla sozcukten olusan adlarda
sozcuk baslari ya buyuk harflerle ya da _ karakteriyle
belirtilir:
int toplamKaburga = 0; // benim tercihim
int toplam_borulce = 134507;
- Makro adlari: Butunuyle buyuk harflerle yazilir. Makro
olmayan hicbir ad da butunuyle buyuk harflerle yazilmaz; yoksa
karisir. Ornek:
#define TOPLAM_KEREVIZ 1
int const birSabit = 7;
- Tur adlari: class, struct, enum, typedef, vs. gibi tur
adlari buyuk harfle baslar. Ornek:
class KapiTokmagi;
typedef vector<Kalem> Kalemler;
- Islev ve nesne adlari: Kucuk harfle baslar. Ornek:
void foo();
int uzunluk = 12;
- Oge nesneler: Nesne adi kurallarina ek olarak oge
olduklarini belirten bir de takintilari olur:
class Araba
{
Direksiyon direksiyon_;
Korna korna_;
/* ... */
};
Yukarida oldugu gibi sonuna _ karakteri eklemek yaninda,
basina m_ karakterlerini ekleyenler de olur:
class Bisiklet
{
Sele m_sele;
Gidon m_gidon;
/* ... */
};
Bazi programcilar oge nesneleri de siradan nesneleri
adlandirdiklari gibi adlandirirlar. Iki nedenden oturu ben
buna karsiyim:
1) Kurucu islevlerde hangi adin ne oldugu anlasilamaz:
class Bisiklet
{
/*
Oge olduklari adlarindan anlasilmadigi icin bunlar
sorun cikartacaklar
*/
Sele sele;
Gidon gidon;
/* ... */
public:
Bisiklet(Sele const & sele, Gidon const & gidon)
:
sele(sele), gidon(gidon) // <---
{
if (/* ... */)
{
Sele yeniSele = /* ... */
sele = yeniSele; // <===
}
}
/* ... */
};
Yukaridaki kurucu islevde iki okla isaretledigim iki
'sele'nin ne olduklari iki yerde farklidir:
---> Oge seleye parametre sele ataniyor
===> Parametre seleye yeniSele ataniyor
(Derleyicim olmadigi icin deneyemiyor. Onun icin bu kuralda
yanlislik yapmis olabilir. Lutfen siz deneyin ve yanlissam
duzeltin.)
2) Birinci nedendeki duruma dusmeyelim diye parametre
adlarini anlasilmaz sekilde kisaltmak durumunda
kalabiliriz:
Bisiklet(Sele const & s, Gidon const & g)
:
sele(s), gidon(g)
{
/* ... */
}
Iste oge adlarinin sonuna bir _ karakteri eklemek bizi bu
dertlerden kurtarir.
Yasaklar
========
Hicbir ad iki tane _ karakteriyle baslamaz. O tur adlar
uygulamaya (derleyici ve kutuphaneleri) ayrilmistir. Ayni
nedenden dolayi, hicbir ad bir tane _ karakteri ve pesinden
bir tane buyuk harfle baslayamaz. Yine ayni nedenden oturu,
global ad alanindaki hicbir ad tek bir _ karakteriyle
baslayamaz.
Goruldugu gibi, bu alt cizgi kurali bir ust paragrafta belki
benim de yanlis hatirlamis olabilecegim gibi cok
karisiktir. Onun yerine ben su kurali uygularim: Hicbir ad _
karakteri ile baslamamalidir.
Bir kac tane yanlis ad:
/*
Bazi programcilar baslik korumalarinda bu hataya duserler:
*/
#ifndef _BASLIGIM_EKLENDI
#define _BASLIGIM_EKLENDI
#endif
int _foo(); // global alandaysak YANLIS
int __bar(); // heryerde YANLIS
(Not: Kullanicilarin kendi programlarindaki adlardan
bahsediyorum. Boyle adlar derleyici ve kutuphalerinde
kullanilmis olabilir.)
Ali
kendi konusu olacak kadar buyudu. Programlarda ad secimleri
konusunda kullandigim kurallari hatirladigim kadariyla
yaziyorum:
Ad secimleri konusunda kendi uyguladigim kurallar cok
hizlica ve aklima geldigi kadariyla asagidaki gibi. Bu
kurallari baska C++'cilarin kodlarinda gorerek benimsedigim
icin genelin de hosuna gittigini dusunuyorum.
Soylemeye gerek olmayan :) kurallar
===================================
- Ad, programda temsil ettigi seyi acikca belli etmelidir:
int toplamHoroz = 1; // iyi
int omrTrps = 0; // OmUr torpusu! ;)
int f = 3; // felaket!
Not: Tek harften olusan adlar, cok yerlesmis olduklari icin
dongu degiskeni olarak kullanilabilirler. Ama o da icice
dongu kullanildiginda kedere neden olur :)
- Uygulanan kurallar tutarli olmalidir
- Projede kabul edilen kurallara uyulmalidir. (Cikintilik
rahatsiz eder. :) )
Konusulsa iyi olan kurallar :)
==============================
- Birlesik sozcukler: Birden fazla sozcukten olusan adlarda
sozcuk baslari ya buyuk harflerle ya da _ karakteriyle
belirtilir:
int toplamKaburga = 0; // benim tercihim
int toplam_borulce = 134507;
- Makro adlari: Butunuyle buyuk harflerle yazilir. Makro
olmayan hicbir ad da butunuyle buyuk harflerle yazilmaz; yoksa
karisir. Ornek:
#define TOPLAM_KEREVIZ 1
int const birSabit = 7;
- Tur adlari: class, struct, enum, typedef, vs. gibi tur
adlari buyuk harfle baslar. Ornek:
class KapiTokmagi;
typedef vector<Kalem> Kalemler;
- Islev ve nesne adlari: Kucuk harfle baslar. Ornek:
void foo();
int uzunluk = 12;
- Oge nesneler: Nesne adi kurallarina ek olarak oge
olduklarini belirten bir de takintilari olur:
class Araba
{
Direksiyon direksiyon_;
Korna korna_;
/* ... */
};
Yukarida oldugu gibi sonuna _ karakteri eklemek yaninda,
basina m_ karakterlerini ekleyenler de olur:
class Bisiklet
{
Sele m_sele;
Gidon m_gidon;
/* ... */
};
Bazi programcilar oge nesneleri de siradan nesneleri
adlandirdiklari gibi adlandirirlar. Iki nedenden oturu ben
buna karsiyim:
1) Kurucu islevlerde hangi adin ne oldugu anlasilamaz:
class Bisiklet
{
/*
Oge olduklari adlarindan anlasilmadigi icin bunlar
sorun cikartacaklar
*/
Sele sele;
Gidon gidon;
/* ... */
public:
Bisiklet(Sele const & sele, Gidon const & gidon)
:
sele(sele), gidon(gidon) // <---
{
if (/* ... */)
{
Sele yeniSele = /* ... */
sele = yeniSele; // <===
}
}
/* ... */
};
Yukaridaki kurucu islevde iki okla isaretledigim iki
'sele'nin ne olduklari iki yerde farklidir:
---> Oge seleye parametre sele ataniyor
===> Parametre seleye yeniSele ataniyor
(Derleyicim olmadigi icin deneyemiyor. Onun icin bu kuralda
yanlislik yapmis olabilir. Lutfen siz deneyin ve yanlissam
duzeltin.)
2) Birinci nedendeki duruma dusmeyelim diye parametre
adlarini anlasilmaz sekilde kisaltmak durumunda
kalabiliriz:
Bisiklet(Sele const & s, Gidon const & g)
:
sele(s), gidon(g)
{
/* ... */
}
Iste oge adlarinin sonuna bir _ karakteri eklemek bizi bu
dertlerden kurtarir.
Yasaklar
========
Hicbir ad iki tane _ karakteriyle baslamaz. O tur adlar
uygulamaya (derleyici ve kutuphaneleri) ayrilmistir. Ayni
nedenden dolayi, hicbir ad bir tane _ karakteri ve pesinden
bir tane buyuk harfle baslayamaz. Yine ayni nedenden oturu,
global ad alanindaki hicbir ad tek bir _ karakteriyle
baslayamaz.
Goruldugu gibi, bu alt cizgi kurali bir ust paragrafta belki
benim de yanlis hatirlamis olabilecegim gibi cok
karisiktir. Onun yerine ben su kurali uygularim: Hicbir ad _
karakteri ile baslamamalidir.
Bir kac tane yanlis ad:
/*
Bazi programcilar baslik korumalarinda bu hataya duserler:
*/
#ifndef _BASLIGIM_EKLENDI
#define _BASLIGIM_EKLENDI
#endif
int _foo(); // global alandaysak YANLIS
int __bar(); // heryerde YANLIS
(Not: Kullanicilarin kendi programlarindaki adlardan
bahsediyorum. Boyle adlar derleyici ve kutuphalerinde
kullanilmis olabilir.)
Ali