내 맘대로 정한 헝가리안 표기법...
MS의 MFC와 WTL에 사용된 코딩 규칙을 대부분 적용 하였다.
약간 변형 시키긴 했다만...
이런 규칙을 정하는 이유는 코딩 또한 하나의 문서라고 보는 철학에서 나왔다.
문서란 작성하는 사람위주가 아니라. 보는 사람 위주로 만들게 된다.
일관된 패턴과,
보는 사람관점의 '파악하기 쉬운'(?)
이라는 철학으로 코딩규칙을 정하고 개발 하게 되면
팀프로젝트에서 다른 팀원이 개발한 코드, 또는 몇년이 지나고 자신이 개발한 코드를 볼때도 빠르게 파악하게 된다.
아래 규칙은 "코드를 파악하기 쉬운 규칙"이라는 단 하나의 기준 만으로 정해 놨다.
불합리 하다고 생각되시는 분은 리플 달아 주심 감사 하겠습니다.
Prefix |
Type |
Example |
dw |
double word |
dwTotal |
w |
WORD |
wNumber |
l |
long |
lTotal |
i |
Integer |
iNumber |
f |
float |
fAvarage |
b |
bool |
bCheck |
n |
short |
nCount |
by |
BYTE |
byOffset |
ch |
CHAR |
chKey |
sz |
CHAR[] Null Terminatied |
szFlag |
sz |
WCHAR[] Null Terminatied |
szPin |
C |
Class |
CButton |
s |
static |
sHelper |
p |
Pointer |
pButton |
str |
CString |
strAddress |
r |
RECT |
rDraw |
a |
Array |
aBags |
g_ |
Global Val |
g_bShow |
m_ |
Member Val |
m_iMans |
si |
size_t |
siCount |
|
|
|
vec |
vector |
vecMan |
map |
map |
mapWoman |
lst |
list |
lstHome |
hsh |
hash |
hshHome |
h |
handle |
hWindow |
|
|
|
|
Original |
Type |
Example |
unsigned char |
BYTE |
byOffset |
unsigned short |
WORD |
nCount |
unsigned long |
DWORD |
dwTotal |
long |
LONG |
lNumber |
int |
int |
iNumber |
BYTE |
BOOLEAN |
bChecked |
WCHAR * |
LPWSTR |
pszCaption |
const WCHAR * |
LPCWSTR |
pcszCaption |
LPCWSTR |
LPCTSTR |
pcszCaption |
char * |
LPSTR |
pszCaption |
const char * |
LPCSTR |
pcszCaption |
1. 변수의 접두어는 모두 소문자
ex) m_pCheckBox, m_CheckBox, g_nTotal, g_SessionManager
nCount, strCaption, pListBox
2. 변수에서 접두어가 없는 경우 첫 단어는 소문자로 시작
ex) m_checkBox, g_total, g_memberCount; m_memberList;
로컬 변수일경우: checkbox, item,
3. 함수의 첫글자는 대문자
DestroySession(), Connect(), Close(), ViewMap(),
4. 함수의 이름은 동사+명사
GotoURL(), ViewMap(), PlayMovie(), ParseURL()
5. Class는 접두어를 제외한 첫번째는 대문자
CCaption, CMembers, CResourcePaint, CFileStream
6. 여러 단어가 합쳐 졌을때는 각 단어의 시작은 모두 대문자
ConnectToTheServer(), SendToMetaData() g_nMetaDataCount
7. Typedef, #define, enum, union등의 type은 모두 대문자
typedef enum {
T_1,
T_2,
T_3
}TEST_DATA;
단 struct와 union의 맴버는 m_를 붙이지 않으며 모두 대문자를 사용하지 않고 위의 표기법으로 사용한다.
맴버는 맴버이지 하나의 type이 아니기 때문이다.
8. if문 및 switch등 제어문의 표기법
if( i = 1 )
{ <== 반드시 개행시켜서 표현한다.
....
}
for( i = 0; i < 100 && !myIterator.empty() ; i++ ) {
do {
if( a == b ) {
}
switch( nCount ) {
}
}while( nCount < 100 )
}
이런 식의 사용은 if문 및 switch문에서 문장의 전체 범위가 한번에 들어 오지 않는다.
따라서 개행해서 코딩 하도록 한다.
for( i = 0; i < 100 && !myIterator.empty() ; i++ )
{
do
{
if( a == b )
{
}
switch( nCount )
{
}
} while( nCount < 100 )
}
switch( nCount )
{
case CNT_FIRST:
{
}
break;
}
9. 문단으로 구분한다.
하나의 함수 안에서도 처리 하는 부분들이 구분 될 수 있다. 이럴때는 아래위 공백을 하나씩 사용해서 구분 해준다.
10. 제어문에서 ( )는 본문과 한칸씩 띄워준다.
위의 switch나 if, while문등이 명령어 다음 바로 (가 붙고 조건 맨끝에서 한칸뒤에 )가 붙어 있다.
이것또한 조건과 명령어등이 명확히 보이도록 하고 내부에서 ()가 사용되었을 경우 정확히 끝이 어디인지 한눈에 알아보기 쉽기 위해서
다
1. if (nTotal < 1000 && myIterator != m_vecStudent.end())
2. if( nTotal < 1000 && myIterator != m_vecStudent.end() )
두개의 문장중 어떤것이 조건의 시작과 끝을 보기 편한가?
11. Class와 함수의 윗줄에 구분줄을 표시 한다.
이 규칙은 Borland C++이나 Delphi에 있던 규칙인데 이것을 사용하게 되면 함수의 구분과 class의 영역 구분 또한 명확해 진다.
만약 Doxygen이나 JavaDoc 같은 주석을 사용한다면 명확히 구분이 되기 때문에 사용하지 않아도 된다.
ex) 아래 코드는 즉석해서 만들어낸 예제 코드임으로 코드적 결함이 있을 수 있다.
//--------------------------------------------------------------------------------------------------------
class CBookmark
{
private:
public:
CBookmark();
~CBookmark();
}
//--------------------------------------------------------------------------------------------------------
class CInputBox
{
private:
public:
CInputBox();
~CInputBox();
}
//--------------------------------------------------------------------------------------------------------
class CViewMap
{
private:
public:
CViewMap();
~CViewMap();
}
//--------------------------------------------------------------------------------------------------------
void CViewMap::StopRandering(CParent * pParent)
{
if( pParent->m_bsState == BS_RUNNING )
{
.
.
}
pParent->Cancel();
}
//--------------------------------------------------------------------------------------------------------
BOOL CViewMap::BeginRandering(CParent * pParent)
{
.
.
}
//--------------------------------------------------------------------------------------------------------
CHandle* CViewMap::InitRanderer(CParent * pParent)
{
.
.
}