본문 바로가기
C++

Google C++ Style Guide 번역 - Naming

by Sondho 2022. 2. 17.

노션 정리

 

Naming

바로 가기

sondho.notion.site


Naming

General Naming Rules

  • 다른 팀에 있는 사람들도 알아볼 수 있는 이름을 사용하여 가독성을 최적화합니다.
  • 대상의 목적이나 의도를 설명하는 이름을 사용하십시오.
  • 새로운 독자가 코드를 즉시 이해할 수 있도록 하는 것이 훨씬 더 중요하므로 가로 공간 절약에 대해 걱정하지 마십시오.
  • 프로젝트 외부의 누군가에게 알려지지 않았을 가능성이 있는 약어(특히 두문자어 및 이니셜)의 사용을 최소화하십시오.
  • 단어 내에서 글자를 삭제하여 축약하지 마십시오. 경험에 비추어 볼 때 Wikipedia에 나열되어 있는 약어는 아마도 괜찮을 것입니다.
  • 일반적으로 설명성은 이름의 가시성 범위에 비례해야 합니다. 예를 들어, n5줄 함수 내에서는 괜찮은 이름일 수 있지만 클래스 범위 내에서는 너무 모호할 수 있습니다.
// Good
class MyClass {
 public:
  int CountFooErrors(const std::vector<Foo>& foos) {
    int n = 0;  // Clear meaning given limited scope and context
    for (const auto& foo : foos) {
      ...
      ++n;
    }
    return n;
  }
  void DoSomethingImportant() {
    std::string fqdn = ...;  // Well-known abbreviation for Fully Qualified Domain Name
  }
 private:
  const int kMaxAllowedConnections = ...;  // Clear meaning within context
};
// Bad
class MyClass {
 public:
  int CountFooErrors(const std::vector<Foo>& foos) {
    int total_number_of_foo_errors = 0;  // Overly verbose given limited scope and context
    for (int foo_index = 0; foo_index < foos.size(); ++foo_index) {  // Use idiomatic `i`
      ...
      ++total_number_of_foo_errors;
    }
    return total_number_of_foo_errors;
  }
  void DoSomethingImportant() {
    int cstmr_id = ...;  // Deletes internal letters
  }
 private:
  const int kNum = ...;  // Unclear meaning within broad scope
};
  • for문에서의 반복 변수의 경우 i, 템플릿 매개 변수의 경우 T와 같이 일반적으로 알려진 특정 약어는 괜찮습니다.
  • camel Case나 Pascal Case의 경우, 약어는 대문자로 표시하는 것을 선호합니다. e.g. StartRpc() 보다는 StartRPC().

File Names

  • 파일 이름은 모두 소문자여야 하며 밑줄(_) 또는 대시(-)를 포함할 수 있습니다 따라야 할 일관된 로컬 패턴이 없으면 _를 선호합니다.
  • C++ 파일은 .cc로 끝나야 하고 헤더 파일은 .h로 끝나야 합니다. (self-contained headers 참조).
  • /usr/include와 같이 에 이미 있는 파일 이름을 사용하지 마십시오 예를 들어db.h.
  • 일반적으로, 여러분의 파일 이름을 매우 구체적으로 만드세요. 예를 들어 logs.h 대신 http_server_logs.h를 사용합니다.
  • 매우 일반적인 경우는 foo_bar.h와 foo_bar.cc라는 이름의 파일 쌍을 갖는 것이다. FooBar이라는 클래스를 정의합니다.

Type Names

  • Type names 종류 ⇒ classes, structs, type aliases, enums, and type template parameters
  • Type names는 대문자로 시작하고 밑줄 없이 각각의 새 단어에 대해 대문자를 사용합니다: MyExcitingClass, MyExcitingEnum.
  • 모든 type names는 동일한 명명 규칙을 갖습니다.
  • Type names는 대문자로 시작해야 하며 각각의 새 단어에 대해 문자를 사용해야 합니다. 밑줄은 없습니다.
  • // classes and structs class UrlTable { ... class UrlTableTester { ... struct UrlTableProperties { ... // typedefs typedef hash_map<UrlTableProperties *, std::string> PropertiesMap; // using aliases using PropertiesMap = hash_map<UrlTableProperties *, std::string>; // enums enum class UrlTableError { ...

Variable Names

  • 변수(함수 매개변수 포함) 및 데이터 멤버의 이름은 모두 소문자이며 단어 사이에 밑줄이 있습니다.
  • 클래스의 데이터 멤버(구조체 제외)에는 추가로 후행 밑줄이 있습니다.
  • 예를 들어: a_local_variable, a_struct_data_member , a_class_data_member_.

Common Variable names

std::string table_name;  // OK - lowercase with underscore.

std::string tableName;   // Bad - mixed case.

Class Date Members

  • 정적 및 비정적 클래스의 데이터 멤버는 일반 비멤버 변수처럼 이름이 지정되지만 뒤에 밑줄이 붙습니다.
class TableInfo {
  ...
 private:
  std::string table_name_;  // OK - underscore at end.
  static Pool<TableInfo>* pool_;  // OK.
};

Struct Data Members

  • 정적 및 비정적 구조체의 데이터 멤버는 일반 비멤버 변수처럼 이름이 지정됩니다. 클래스의 데이터 멤버에 있는 후행 밑줄이 없습니다.
struct UrlTableProperties {
  std::string name;
  int num_entries;
  static Pool<UrlTableProperties>* pool;
};

Constant Names

  • constexpr 또는 const로 선언되고 프로그램 기간 동안 값이 고정된 변수는 앞에 "k"가 붙은 다음 대소문자가 혼합되어 이름이 지정됩니다.
  • 대문자를 구분에 사용할 수 없는 드문 경우에 밑줄을 구분 기호로 사용할 수 있습니다. 예를 들어:
  • const int kDaysInAWeek = 7; const int kAndroid8_0_0 = 24; // Android 8.0.0

Function Names

  • 일반 함수에는 대소문자가 혼합되어 있습니다.
  • accessors와 mutators는 변수처럼 이름을 지정할 수 있습니다.
  • 일반적으로 함수는 대문자로 시작하고 각각의 새 단어에 대해 대문자를 사용해야 합니다.
AddTableEntry()
DeleteUrl()
OpenFileOrDie()
  • (API의 일부로 노출되고 함수처럼 보이도록 의도된 클래스 및 네임스페이스 범위 상수에도 동일한 이름 지정 규칙이 적용됩니다. 왜냐하면 함수가 아니라 객체라는 사실이 구현 세부사항에서 중요하지 않기 때문입니다.)
  • A와ccessors와 mutators(get 및 set 함수)는 변수처럼 이름을 지정할 수 있습니다.
  • 이들은 종종 실제 멤버 변수에 해당하지만 필수는 아닙니다. 예를 들어, int count()및 void set_count(int count).

Namespace Names

  • 네임스페이스 이름은 모두 소문자이며 단어는 밑줄로 구분됩니다.
  • 최상위 네임스페이스 이름은 프로젝트 이름을 기반으로 합니다. 중첩된 네임스페이스와 잘 알려진 최상위 네임스페이스 간의 충돌을 피하십시오.
  • 최상위 네임스페이스의 이름은 일반적으로 해당 네임스페이스에 코드가 포함된 프로젝트 또는 팀의 이름이어야 합니다. 해당 네임스페이스의 코드는 일반적으로 기본 이름이 네임스페이스 이름과 일치하는 디렉토리(또는 그 하위 디렉토리)에 있어야 합니다.
  • 축약된 이름에 대한 규칙 은 변수 이름만큼 네임스페이스에도 적용 된다는 점을 명심하십시오 . 네임스페이스 내부의 코드는 네임스페이스 이름을 언급할 필요가 거의 없으므로 일반적으로 특별한 약어는 필요하지 않습니다.
  • 잘 알려진 최상위 네임스페이스와 일치하는 중첩된 네임스페이스를 피하십시오. 네임스페이스 이름이 충돌하면 이름 조회 규칙으로 인해 빌드 중단이 발생할 수 있습니다. 특히 중첩된 std 네임스페이스를 생성하지 마십시오. websearch::util와 같이 충돌하기 쉬운 이름보다 고유한 프로젝트 식별자 (websearch::index, websearch::index_util)를 선호합니다. 또한 지나치게 깊은 중첩 네임스페이스를 피하십시오( TotW #130 ).
  • 내부 네임스페이스의 경우 다른 코드가 동일한 내부 네임스페이스에 추가되어 충돌(팀 내 내부 도우미는 관련성이 있는 경향이 있으며 충돌을 초래할 수 있다.)이 발생하지 않도록 주의하십시오. 이러한 상황에서 파일 이름을 사용하여 고유한 내부 이름을 만드는 것이 도움이 됩니다(frobber.h에서 사용할 websearch::index::frobber_internal).

Enumerator Names

  • 열거자(범위가 지정된 열거형 및 범위가 지정되지 않은 열거형 모두에 대해)는 매크로가 아니라 상수처럼 이름을 지정해야 합니다 . 즉, ENUM_NAME이 아닌 kEnumName을 사용합니다.
// Good
enum class UrlTableError {
  kOk = 0,
  kOutOfMemory,
  kMalformedInput,
};
// Bad
enum class AlternateUrlTableError {
  OK = 0,
  OUT_OF_MEMORY = 1,
  MALFORMED_INPUT = 2,
};
  • 2009년 1월까지는 매크로와 같이 열거형 값의 이름을 붙이는 방식이 사용되었다. 이로 인해 열거형 값과 매크로 간의 이름 충돌 문제가 발생했습니다. 따라서 상수 스타일 명명을 선호하는 변경 사항이 적용되었습니다. 새 코드는 상수 스타일 이름을 사용해야 합니다.

Macro Names

  • 매크로 를 정의하지 하실건가요? 그렇게 하면 다음과 같습니다: MY_MACRO_THAT_SCARES_SMALL_CHILDREN_AND_ADULTS_ALIKE.
  • 매크로에 대한 설명을 참조하십시오. 일반적으로 매크로를 사용하면 안 됩니다. 그러나 반드시 필요한 경우 모든 대문자와 밑줄(_)을 사용하여 이름을 지정해야 합니다
#define ROUND(x) ...
#define PI_ROUNDED 3.0

Exceptions to Naming Rules

  • 기존 C 또는 C++ 엔터티와 유사한 이름을 지정하는 경우 기존 명명 규칙 체계를 따를 수 있습니다.
  • bigopen()
    • 함수 이름은 open()의 형식을 따릅니다.
  • uint
    • typedef
  • bigpos
    • struct 또는 class는 pos다음 형식을 따릅니다.
  • sparse_hash_map
    • STL과 유사한 엔티티; STL 명명 규칙을 따릅니다.
  • LONGLONG_MAX
    • INT_MAX와 같은 상수

 


Google C++ Guide 바로가기

'C++' 카테고리의 다른 글

struct를 초기화 하는 3가지 방법  (0) 2022.02.17

댓글