★ retval이라는 이름은 정보를 제대로 담고 있지 않다. 대신 변수값을 설명하는 이름을 사용하라.
하지만 보편적인 이름이 필요한 의미를 더 전달하는 경우도 있다.
★ tmp라는 이름은 대상이 짧게 임시적으로만 존재하고, 임시적 존재 자체가 변수의 가장 중요한 용도일때에 한해서 사용해야한다.
1
2
3
4
5
if (right<left) {
tmp=right;
right=left;
left=tmp;
} // Acceptable tmp
루프 반복자에 조건문의 이니셜 등을 첨자로 넣으면 더 좋은 이름이 된다.
★ tmp, it, retval 같은 보편적인 이름을 사용하려면, 꼭 그렇게 해야 하는 이유가 있어야 한다.
__03. 추상적인 이름보다 구체적인 이름을 선호하라
이름을 지을 때, 추상적인 방식이 아니라 구체적인 방식으로 묘사하라.
예1 : 서버가 어느 TCP/IP 포트를 사용할 수 있는지 검사하는 내부 메소드의 이름은 ServerCanStart()보다 CanListenOnPort()가 더 구체적이다.
예2 : DISALLOW_EVIL_CONSTRUCTOR라는 구글이 사용하던 매크로의 명칭은 사악한(evil)이라는 단어가 너무 강한 표현이고, 매크로가 금지하는(disallowing)대상이 명확하지 않기 때문에 좋은 이름이 아니다. 이 이름은 DISALLOW_COPY_AND_ASSIGN으로 대체되었다.
예3 : 저자들이 사용했던 --run_locally라는 명령행 플래그(command-lind flag) 옵션
1. 새로운 사람이 무엇을 위한 플래그인지 알기 어렵고,
2. 원격으로 실행되는 프로그램에 쓰이기에는 부적절한 이름이었고,
3. 성능 저하의 가능성이 있다는 사실을 담고 있지 않다는 문제점이 있었다.
핵심은 이 이름이 실제 내용보다 주로 사용되는 환경을 나타내는 방식으로 지어졌다는 점이다. 이 이름보다는 --extra_logging이라는 이름이 더 직접적이고 명확하다. 만약 이 플래그가 다른 작업도 수행하며 그 이름이 두 가지 모두를 포괄할 수 있다 하더라도 그럴때는 새로운 역할을 구체적으로 표현하는 새로운 플래그를 만드는 것이 더 좋다.
__04. 추가적인 정보를 이름에 추가하기
이름 안에 들어간 추가 정보는 사용할 때마다 전달된다. 따라서 사용자가 반드시 알아야 하는 정보를 이름에 포함시키는 것이 좋다.
변수가 시간의 양이나 바이트의 수와 같은 측정치를 담고 있다면, 변수명에 단위를 포함시키는게 좋다.
변수의 의미를 제대로 이해하는 것이 중요하다면 그 의미를 드러내는 정보를 변수의 이름에 포함시켜야 한다.
__05. 이름은 얼마나 길어야 하는가?
좁은 범위에서는 짧은 이름도 좋다. 하지만 어떤 이름이 넓은 범위에서 사용된다면, 의미를 분명하게 하는 것이 더 중요하다.
팀에 새로 합류한 사람이 이름이 의미하는 바를 이해할 수 있다면 괜찮은 이름이다.
제거해도 정보가 손실 되지 않는 단어는 제거하는 것이 좋다.
__06. 이름 포메팅으로 의미를 전달하라
밑줄(underscores)과 대시(dashes) 그리고 대문자를 잘 이용하면 이름에 더 많은 정보를 담을 수 있다.
1
2
3
4
5
6
7
8
9
staticconstint kMaxOpenFiles =100; // NOT MACRO_NAME to be easily distinguished
classLogReader { // CamelCase for class names
public:void OpenFile(string local_file); // lower_separated for variable name
private:int offset_; // class member variable ends with an underscore
DISALLOW_COPY_AND_ASSIGN(LogReader);
};
문법적 차이가 드러나게 서로 다른 개체의 이름에 다른 포맷팅 방식을 적용하는 것은 코드를 더 읽기 쉽게 해준다.
__Summary
Use specific words—for example, instead of Get, words like Fetch or Download might be
better, depending on the context.
Avoid generic names like tmp and retval, unless there’s a specific reason to use them.
Use concrete names that describe things in more detail—the name ServerCanStart() is
vague compared to CanListenOnPort().
Attach important details to variable names—for example, append ms to a variable
whose value is in milliseconds or prepend raw to an unprocessed variable that needs
escaping.
Use longer names for larger scopes—don’t use cryptic one- or two-letter names for
variables that span multiple screens; shorter names are better for variables that span only
a few lines.
Use capitalization, underscores, and so on in a meaningful way—for example, you
can append “_” to class members to distinguish them from local variables.