내 맘대로 정한 헝가리안 표기법... 

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)

{

.

.

}

 


Posted by 모과이IT
,