노션 정리
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 |
---|
댓글