본문 바로가기

C/C++

[Google C++ Style Guide] 6. Naming

Google C++ Style Guide

 

 

 

 

6. Naming

 

A.     General Naming Rules (일반적인 네이밍 규칙)

함수 이름변수 이름파일 이름은 설명적이어야 한다생략을 피한다타입과 변수는 명사이며 함수는 명령형’ 동사 이어야 한다.

 

How to Name (이름 짓는 방법)

이름은 가능한 설명적으로 짓는다공간 절약이 중요한 게 아니라코드를 즉시 보고 이해할 수 있어야 한다아래 예는 좋은 이름들이다.

int num_errors;                    // Good.

int num_completed_connections;   // Good.

 

모호한 약어나 의미를 알 수 없는 임의의 문자를 사용하지 않는다.

int n;                           // Bad – 의미 없음

int nerr;                        // Bad – 모호한 약어

int n_comp_conns;               // Bad – 모호한 약어

 

타입과 변수명은 명사로 이름을 짓는다, FileOpener, num_errors

 

함수 이름은 명령형으로 짓는다, OpenFile(), set_num_errors(). 접근자는 예외인데접근하려는 변수와 같은 이름을 짓는다, num_errors()

 

Abbreviations (축약)

프로젝트 외부에서 잘 알려지지 않은 축약어는 사용하지 않는다. :

// Good

// 축약어 없이 적절한 이름을 짓는 

int num_dns_connections;  // 대부분의 사람들이 "DNS" 무엇인지 안다.

int price_count_reader;   // OK, price count. Makes sense.

 

 

B.      File Names (파일명)

파일명은 모두 소문자로 하며언더라인(_)이나 대쉬(-)를 포함할 수도 있다지금 하고 있는 프로젝트의 컨벤션을 따른다일관성 있게 사용하는 패턴이 없으면 “_“를 선호한다.

 

예를 들면 다음과 같은 이름을 사용할 수 있다.

my_useful_class.cc
my-useful-class.cc
myusefulclass.cc
myusefulclass_test.cc // _unittest and _regtest are deprecated.

 

C++파일은 .cc로 끝나고헤더 파일은 .h로 끝난다.

 

db.h 처럼 /usr/include 에 이미 존재하는 이름은 사용하지 않는다.

 

일반적으로 파일 이름은 매우 명확하게 만든다예를 들어, logs.h보다 http_server_logs.h를 사용한다흔히 FooBar 클래스를 정의한다면 foo_bar.h foo_bar.cc처럼 쌍으로 파일이름을 짓는다.

 

Inline 함수는 .h파일에 정의되어야 한다. inline함수가 매우 짧으면 .h 파일에 작성하되코드가 길어지면 –inl.h 로 끝나는 파일에 정의한다.  그래서 inline 코드가 많을 경우 다음의 세가지 파일을 갖을 것이다.

url_table.h      // The class declaration.

url_table.cc     // The class definition.

url_table-inl.h  // Inline functions that include lots of code.

 

-inl.h Files 항목을 참고한다.

 

 

C.      Type Names (타입명)

타입명은 대문자로 시작하며각 새로운 단어마다 대문자를 갖으며 언더라인을 사용하지 않는다. : MyExcitingClass, MyExcitingEnum

 

모든 타입(클래스구조체, typedef, enum)의 이름은 같은 네이밍 컨벤션을 갖는다타입명은 대문자로 시작하며 각 새로운 단어마다 대문자를 쓴다언더라인을 사용하지 않는다.

 

// classes and structs

class UrlTable { ...

class UrlTableTester { ...

struct UrlTableProperties { ...

 

// typedefs

typedef hash_map<UrlTableProperties *, stringPropertiesMap;

 

// enums

enum UrlTableErrors { ...

 

 

D.     Variable Names (변수명)

변수명은 모두 소문자이며 단어 사이에 언더라인을 사용한다클래스 멤버 변수는 언더라인으로 끝난다my_exciting_local_variable, my_exciting_member_variable_

 

Common Variable names (공통 변수 이름)

예를 들어,

string table_name;  // OK - uses underscore.

string tablename;   // OK - all lowercase.

 

string tableName;   // Bad - mixed case.

 

Class Data Members (클래스 데이터 멤버)

데이터 멤버 (인스턴스 변수나 멤버 변수)는 일반적인 변수명처럼 언더라인을 포함하는 것은 선택사항이지만 항상 언더라인으로 끝난다.

string table_name_;  // OK - underscore at end.

string tablename_;   // OK.

 

Struct Variables (구조체 변수)

구조체의 데이터 멤버는 일반적인 변수처럼 이름을 짓는다클래스처럼 언더라인으로 끝나지 않는다.

struct UrlTableProperties {

  string name;

  int num_entries;

}

구조체와 클래스를 언제 사용하는지는 Structs vs. Classes를 참고한다.

 

Global Variables (전역 변수)

전역 변수는 특별한 요구사항이 없으며거의 사용을 하지 않는다만약 사용한다면g_로 시작하거나 로컬 변수와 구별되는 표시를 한다. 

 

 

E.      Constant Names (상수명)

k로 시작하며 대소문자를 섞어서 사용한다 : kDaysInAWeek

 

모든 컴파일타임 상수들은 지역적이든지전역적이든지클래스의 부분으로서든지 다른 변수와는 약간 다른 네이밍 컨벤션을 따른다. k로 시작하며, k다음 첫 문자는 대문자를 사용한다.

 

const int kDaysInAWeek = 7;

 

 

F.      Function Names (함수명)

일반적인 함수는 대소문자를 혼용한다접근자와 수정자(get, set)는 변수 이름과 일치시킨다 :

MyExcitingFunction(), MyExcitingMethod(),

my_exciting_member_variable(), set_my_exciting_member_variable()

 

Rugular Functions (일반적인 함수)

함수는 대문자로 시작하며각 새로운 단어마다 대문자를 사용한다언더라인은 사용하지 않는다.

 

에러를 발생시킬 것 같은 함수는 함수 이름에 OrDie를 붙인다이것은 생산 코드(production code)에서 사용될 수 있는 함수와 정상적인 연산에 발생할 것 같은 에러에 대해서만 적용한다.

 

AddTableEntry()

DeleteUrl()

OpenFileOrDie()

 

Accessors and Mutators (접근자와 수정자)

접근자와 수정자(get, set 함수) get/set 하는 변수의 이름과 일치해야 한다클래스의 멤버 변수가 num_entries_일 경우의 예이다.

 

class MyClass {

 public:

  ...

  int num_entries() const { return num_entries_; }

  void set_num_entries(int num_entries) { num_entries_ = num_entries; }

 

 private:

  int num_entries_;

};

 

매우 짧은 인라인 함수에 소문자를 사용해도 좋다.

 

 

G.     Namespace Names (네임스페이스 이름)

네임스페이스는 모두 소문자로 하며프로젝트 이름이나 디렉토리 구조에 기반한다

google_awesome_project

 

Namespaces 항목을 참고한다.

 

H.     Enumerator Names (열거자 이름)

열거자(enum)은 상수처럼 아니면 매크로처럼 이름 짓는다. : kEnumName or ENUM_NAME

 

Enum은 상수명처럼 이름 짓는 것을 선호하지만매크로처럼 지어도 된다.

 

enum UrlTableErrors {

  kOK = 0,

  kErrorOutOfMemory,

  kErrorMalformedInput,

};

 

enum AlternateUrlTableErrors {

  OK = 0,

  OUT_OF_MEMORY = 1,

  MALFORMED_INPUT = 2,

};

 

 

2009 1월까지 enum 이름은 매크로처럼 지었으며, Enum 값과 매크로 사이의 이름이 충돌하는 문제가 발생했었다그래서 상수 스타일의 이름으로 바뀌으며가능하면 상수 스타일의 이름을 선호한다그러나 기존 코드가 문제되지 않으면상수 스타일로 굳이 변경할 필요는 없다.

 

I.       Macro Names (매크로 이름)

정말 매크로를 정의하고 싶은가?(가능한 매크로 사용은 자제하란 의미). 그렇다면 이렇게 사용한다. :

MY_MACRO_THAT_SCARES_SMALL_CHILDREN

 

일반적으로 매크로는 사용하지 않는다그러나 절대 필요하다면다음과 같이 모두 대문자로 하면 언더라인을 갖는다.

 

#define ROUND(x) ...

#define PI_ROUNDED 3.0

 

 

J.      Exceptions to Naming Rules (네이밍 룰의 예외)

기존의 C/C++ 개체에 아날로그적인 이름을 갖고 있으면기존의 네이밍 컨벤션을 따를 수 있다.

 

bigopen()

function name, follows form of open()

uint

typedef

bigpos

struct or class, follows form of pos

sparse_hash_map

STL-like entity; follows STL naming conventions

LONGLONG_MAX

a constant, as in INT_MAX