새로운 독자가 코드를 즉시 이해할 수 있도록 하는 것이 훨씬 더 중요하므로 가로 공간 절약에 대해 걱정하지 마십시오.
프로젝트 외부의 누군가에게 알려지지 않았을 가능성이 있는 약어(특히 두문자어 및 이니셜)의 사용을 최소화하십시오.
단어 내에서 글자를 삭제하여 축약하지 마십시오. 경험에 비추어 볼 때 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와 같이 일반적으로 알려진 특정 약어는 괜찮습니다.
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++ 엔터티와 유사한 이름을 지정하는 경우 기존 명명 규칙 체계를 따를 수 있습니다.
댓글