|
이영수 님이 쓰신 글 :
: vcl 컴포넌트, 사용자 변수, #define문 등등..
........................... 생략
게시판 버그당.. 글이 안올라간당...
음... 저도 이런 문제 때문에 표준안을 만든 적이 있습니다.
일단 제가 사용하고 있는 안을 올려드리죠.. 제 생각에는 이것 역시 프로젝트가 되어야
할 것 같네요.. 여러가지 부속 프로그램이 있으면 더 편리하기 때문에...
일단 아래 나열한 헤더 형식은 NCL이라는 저희 회사 프로젝트에 사용한 것입니다.
따라서 프로젝트 이름에 따라 앞의 NCL부분은 모두 대치할 수 있겠죠?? ^^
#ifndef NCL_SAMPLE_H_INCLUDE
#define NCL_SAMPLE_H_INCLUDE
#include <xxxxx.h>
…
…
//*****************************************************************CR********
//* <FileName> nclSample.h
//* <Revision> 0.1
//* <Author> 작성자
//* <LastEditor> 작성자
//* <LastUpdate> 2000.9.28
//* <Description>
//* 행을 바꾸지 않고 계속 이서 쓰고자 할 때는 뒤에 세미콜론을 붙이지 않
//* 는다.
//*
//* <Contents>
//* % TList // VCL의 TList와 동일하다. Error처리 및 자주 사용되지
//* 않는 기능는 삭제되어 있다.;
//* 이렇게 라인을 바꿔 주석을 달 때는 앞라인에 ;를 사용해
//* 야 한다.
//* % NAVLTreeNode<T> // NAVLTree의 Node Class
//* % NAVLTree<T> // T type을 프라이머리키로 binary search tree를 구성
//*
//*****************************************************************CR********
/////////////////////////////////////////////////////////////////////////////
class TList : public TObject
/////////////////////////////////////////////////////////////////////////////
{
…
…
}
//---------------------------------------------------------------------------
__fastcall TList::TList(void)
{
…
}
//---------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////
class TList : public TObject
/////////////////////////////////////////////////////////////////////////////
…
…
…
#endif //NCL_SAMPLE_H_INCLUDE
다음은.. 설명용 주석달기 규칙인데.. 요놈은 생략하구..
이름 부여 규칙입니다.
이름을 부여할 떄 중요한 원칙은 다음과 같다.
동사 + 명사(목적어) – (X)FileFind (O)FindFile
집합적으로 사용되는 이름은 공통으로 들어가는 단어가 먼저
두 단어의 조합일때는 대문자로 구분한다.(Index of = IndexOf)
공식 약자는 모두 대문자 사용 (X)GetUdpSocket (O)GetUDPSocket
약어는 널리 알려진 경우를 제외하고는 사용하지 않는다.
변수의 경우 이름만으로 지역/전역, 타입, 인자 특성을 알 수 있어야 한다.
함수의 경우, Win32나 Winsock과 같은 API함수를 사용할 때는 범위연산자인 ::을 앞에 붙인다.
– Ex) CreateWindow(); --> ::CreateWindow();
4.1. 지역변수
다음과 같은 형식을 사용한다.
xParameterName / xxParameterName
x: 타입 첨자
C++에서 사용하는 대부분의 변수는 지역변수이다. 따라서 전역변수와 구별하기 위한 첨자로 많이 쓰이는 ‘l(Local)’은 생략하고, 전역변수인 경우에만 ‘g(Global)’첨자를 사용한다.
대강의 구분만으로 충분한 경우 다음의 접두어를 주로 사용한다.
Prefix 의미 비고
n Numeric int, short, long, unsigned등의 구분은 하지 않는다.
f Float float, double 등의 구분은 하지 않는다.
c Char 선택적으로 lpsz 를 사용할 수 있다.
좀 더 세부적으로 구분할 필요가 있을 떄는 위의 접두어 대신 다음과 같은 접두어를 조합해서 사용한다. 2개 이상 사용해도 상관 없으나 아래 적은 수의 접두어를 사용한다. (Ex: uiIndex 보다는 uIndex)
Prefix 의미 비고
I Integer
u Unsigned
j Short String 타입과 중복을 피하기 위해 j를 사용한다.
l Long
d Double
VCL에서 특별히 지원하는 클래스 타입의 경우 다음을 사용한다.
Prefix 클래스이름 비고
s String(AnsiString)
t TDateTime
m TStream TMemoryStream과 같이 TStream을 상속받은 모든 클래스에 사용
S TStrings TStringList와 같이 TStrings를 상속받은 모든 클래스에 사용
4.2. 함수 인자
다음의 형식으로 사용한다.
yxxArgumentName
y: 인자 첨자
지역변수의 접두어에 인자의 성격을 나타내는 다음의 접두어를 붙여 총 2개의 접두어를 사용한다.
Prefix 의미 비고
a Argument 함수의 입력값으로만 사용. 가급적 const를 붙여준다.
r Return 함수의 출력값으로만 사용. 반드시 포인터 또는 참조호출이 이루어져야 한다.
m Multiple 입력값과 출력값으로 사용. 두가지가 동시에 이루어지므로 반드시 포인터 또는 참조호출이 이루어져야 한다. const를 붙이지 않는다.
4.3. 인스턴스
AnsiString, TStrings, TDateTime을 제외한 다른 클래스에서 상속받은 모든 클래스를 바탕으로 생성된 인스턴스는 함수명과 동일한 표기법을 사용한다.
4.4. 멤버변수
멤버변수 규칙은 VCL과의 코드 호환을 위해 규칙이 다소 복잡하다. 기본 원칙은 멤버변수에는 필드를 제외하고는 첨자를 사용하지 않는다는 것이다.
4.4.1. Public
Public 멤버변수는 함수명과 동일한 표기법을 사용한다. 즉, 대문자로 시작되며 별도의 첨자를 붙이지 않는다.
4.4.2. Private / Protected
Private 멤버변수는 첫 단어만 소문자로 기록하고 나머지는 일반 표기법을 사용한다.
Ex) remoteSocket
단, 필드로 사용되는 멤버변수의 경우 예외적으로 F첨자를 사용하고 대문자로 시작한다.
필드란 일반 클래스 멤버 변수 중 특별히 Set/Get메쏘드를 이용한 접근을 허용하는 private 멤버 변수를 의미한다. VCL의 Property처럼 Get/Set메쏘드를 사용하여 ReadOnly 속성이나 자동 업데이트 기능을 부여할 때 사용하는 멤버라면 필드이고, 클래스 내부에서만 사용되는 것은 일반 멤버이다.
Ex) Property: HostName / FHostName / GetHostName / SetHostName
추가적으로 MFC에서처럼 일반 멤버에 m_을 붙이는 방법도 함 생각해 봤는데... 지금 그렇게 쓰고 있지는 않
습니다.
이러한 소스스타일을 표준화시킨다는건 참 어려운 일이고, 이견이 많기 마련입니다.
하지만 정식 프로젝트화 하여 몇가지 툴(소스를 긁어서 HTML문서화 해주는거...)을 만든다면
강제할 수도 있겠죠. 하여간, Q&A에서 취급할 문제는 아닐듯 합니다.
궁금하신게 있거나 의견 있으시면 메일주세요.
commune@dreamx.net 입니다.
패패루였슴다.
|