코드 가독성의 핵심: 효과적인 명명 전략

  1. 전문 용어 선택

GetPage(url) 대신 FetchPage(url) 또는 DownloadPage(url) 사용

BinaryTree::Size() 대신 BinaryTree::Height(), BinaryTree::NodeCount(), 또는 BinaryTree::MemoryUsage()로 변경

Thread::Stop() 대신 Thread::Terminate() 또는 Thread::Suspend() 사용

  1. 표현력 있는 단어 선택

send → deliver, dispatch, announce, distribute, route find → search, extract, locate, recover start → launch, create, begin, open make → create, establish, build, generate, compose, add, construct

  1. tmp나 retval 같은 일반적인 이름 피하기

예시 1:

1 total += data[index] * data[index];
2 
3 // 나쁜 예: "반환값" 외에 추가 정보 없음
4 return_value += data[index];
5 
6 // 좋은 예: "제곱합" 의미 명확히 표현
7 sum_of_squares += data[index]; // 버그를 더 빨리 발견 가능

예시 2:

 1 // tmp가 적절한 경우: 범위가 작고 임시 저장 용도
 2 if (right < left) {
 3     temp = right;
 4     right = left;
 5     left = temp;
 6 }
 7 
 8 // 범위가 작지만 임시 저장보다 사용자 정보에 초점
 9 String user_data = user.name();
10 user_data += " " + user.phone_number();
11 user_data += " " + user.email();
12 ...
13 template.set("user_info", user_data);
14 
15 // tmp가 정확하지 않으므로 _file 접미사 추가
16 temp_file = tempfile.NamedTemporaryFile()
17 ...
18 SaveData(temp_file, ...)
  1. 반복 변수 사용

일반적으로 i, j, iter, it은 인덱스와 반복 변수로 널리 사용됩니다. 의미가 일반적이지만 모두가 이해합니다.

그러나 더 적절한 이름이 필요한 경우도 있습니다:

// 나쁜 예
if (clubs[i].members[k] == users[j])

// 좋은 예: club_idx, members_idx, users_idx 사용
if (clubs[club_idx].members[user_idx] == members[member_idx]) // 버그! 첫 글자 불일치

tmp, retval 같은 일반적인 이름 사용은 신중해야 합니다. 몇 초 더 생각하여 더 나은 이름을 선택하면 명명 능력이 빠르게 향상됩니다.

  1. 구체적인 이름으로 추상적인 이름 대체
(1) 특정 TCP/IP 포트에서 서비스가 수신 가능한지 확인
    IsServerReadyForPort()
    // 더 구체적인 이름으로 변경
    CanAcceptConnectionsOnPort()

(2) 복사 및 할당 생성자 비활성화
    DISABLE_COPY_AND_ASSIGN
    // 덜 과장되고 더 구체적인 이름으로 변경
    #define DISABLE_COPY_AND_ASSIGN(ClassName) \
    ClassName(const ClassName&); \
    void operator=(const ClassName&);
    // 사용 예시:
    class MyClass {
    private:
        DISABLE_COPY_AND_ASSIGN(MyClass);
    public:
        ...
    };

(3) 명령줄 플래그
    // 디버그 정보 출력; 실행 속도 감소하므로 주로 로컬에서 사용
    --run_locally
    // 두 개로 분리하여 더 명확하게
    --verbose_logging 과 --local_database_only

(4) 이름에 더 많은 정보 추가
    session_id; // 예: "af84ef845cd8"
    // 변경
    session_identifier_hex;

(5) 단위가 포함된 변수가 더 정확
    start_time_ms      // start보다 나음
    delay_duration    // delay보다 나음
    file_size_mb       // size보다 나음
    max_transfer_rate      // limit보다 나음

(6) 다른 속성 추가
    unencrypted_password       // password보다 나음
    raw_text_comment      // comment보다 나음
    html_content_utf8              // html보다 나음
    encoded_data            // data보다 나음
  1. 이름 길이

(1) 작은 범위에서는 짧은 이름 사용 가능

(2) 팀 신입 구성원이 이름의 의미를 이해할 수 있는지 확인

eval은 evaluation, doc는 document, str은 string을 의미할 수 있습니다. 따라서 FormatStr()은 이해하기 쉽습니다.

BEManager는 BackEndManager로 작성해야 합니다. BE가 BackEnd를 의미한다는 것을 추측하기 어렵습니다.

  1. 불필요한 단어 제거

ConvertToString() → ToString() ExecuteServiceLoop() → ServiceLoop()

  1. 이름 형식으로 의미 전달

클래스명: 단어 첫 글자 대문자 CamelCase 변수명: 밑줄로 구분 lower_separated 상수 형식: kConstantName而不是CONSTANT_NAME (매크로 형식과 구분하기 위함)

통일된 클래스 멤버 변수 명명 규칙 사용, 예: member_ 접두사 사용

태그: 코딩 표준 변수 명명 코드 가독성 프로그래밍 스타일 소프트웨어 개발

6월 14일 23:13에 게시됨