[클린 코드(Clean Code) ] Ch2 - 의미 있는 이름

2021. 1. 20. 19:0004. Archives/독서

728x90
반응형

Ch2. 의미 있는 이름

의도를 분명히 밝혀라

  • 변수나 함수 그리고 클래스 이름은 다음과 같은 굵직한 질문에 모두 답해야 한다.
    • 변수 (혹은 함수나 클래스)의
      • 존재 이유는?
      • 수행 기능은?
      • 사용 방법은?
    • 따로 주석이 필요하다면 의도를 분명히 드러내지 못했다는 것

의미 있게 구분해라

  • 컴파일러나 인터프리터만 통과하려는 생각으로 코드를 구현하면 언젠가는 문제가 생기기 마련

  • 연속된 숫자를 덧붙이거나 불용어(의미가 불분명하거나 없어도 되는 단어)를 추가하는 방식은 적절하지 못함

    • 이름이 달라야 한다면 의미도 달라져야 한다.

    • 변수의 이름으로 아무런 정보를 제공 받지 못하는 예시

        public static void copyChars(char a1[], char a2[]){
            for (int i = 0; i < a1.length; i++) {
                a2[i] = a1[i];
            }
        }
      • 수정하면 아래와 같다.

        public static void copyChars(char source[], char destination[]){
          for (int i = 0; i < source.length; i++) {
              destination[i] = source[i];
          }
        }

발음하기 쉬운 이름을 사용하라

  • 날짜 및 시간 정보를 제공해주는 이름의 경우

      genymdhms // generate date; 'y'ear, 'm'onth, 'd'ay, 'h'our, 'm'inute, 's'econd
      // 어떻게 읽어야할지 감도 안잡히는 단어
    
      // vs //
      generationTimestamp; 
      // 좀 길지만 의미도 정확하고 명확하게 읽을 수 있는 단어 -> 더 좋은 이름

검색하기 쉬운 이름을 사용하라

  • 변수나 상수를 코드 여러 곳에서 사용한다면 검색하기 쉬운 이름이 바람직하다

      for (int j=0; j<34; j++){
      s += (t[j]*4)/5;
      }
    
      // vs //
    
      int realDayPerIdealDay = 4;
      const int WORK_DAYS_PER_WEEK = 5;
      int sum = 0;
    
      for (int j=0; j < NUMBER_OF_TASKS; j++){
          int realTaskDays = taskEstimate[j] * realDaysPerIdealDay;
          int realTaskWeeks = (realTaskDays / WORK_DAYS_PER_WEEK);
          sum += realTaskWeeks;
      }
    • 같은 의미를 가지고 알아보기 쉬운만큼 변수의 길이는 훨씬 길다
    • 그래도 프로젝트의 사이즈가 커지면 위의 값들을 검색을 통해 찾기 훨씬 용이하다

인코딩을 피하라

  • 헝가리식 표기법
    • 예전 프로그래밍 언어들은 이름의 길이가 제한되어 있었기 때문에 이런 방식이 도움이 됐지만
    • 지금은 헝가리식 표기법이나 인코딩 방식이 컴파일이나 타입 오류를 발견하는데 많은 영향을 주진 않기 때문에 오히려 방해가 됨

자신의 기억력을 자랑하지 마라

  • 루프에서 반복 횟수를 세는 변수 i, j, k를 제외하면 문자 하나만 사용하는 변수 이름은 문제가 있음
  • 전문가 프로그래머는 명료함이 최고라는 사실을 이해한다.
    • 클래스 이름, 객체 이름
      • 명사나 명사구가 적합하다.
      • 동사는 사용하지 않는다.
    • 메서드 이름
      • 동사나 동사구가 적합
      • 접근자, 변경자, 조건자는 작성하는 언어의 표준에 따라 값 앞에 get, set, is와 같은 접두어를 붙임

한 개념에 한 단어를 사용해라

  • 추상적인 개념 하나에 단어 하나를 선택한다.
    • ex) 똑같은 메서드를 클래스마다 fetch, retrieve, get과 같이 제각각으로 부르면 안됨
  • 단, 맥락이 다르다면 다른 단어를 이용해야함

의미 있는 맥락을 추가하라

  • ex) firstName, lastName, street, houseNumber, city, state, zipcode 라는 변수가 있을 때,
    • 변수 전체를 보면 주소임을 추론할 수 있지만, 만약 어느 메서드가 state만을 이용한다면 해당 변수만을 보고 이 변수가 주소의 state임을 추론하기는 어렵다
    • 따라서 addr와 같은 접두어를 추가하여 보면 읽는 사람이 더 이해하기 쉽다.
    • 물론 Address라는 클래스를 생성하면 훨씬 더 명확해진다.

불필요한 맥락을 없애라

  • 일반적으로 짧은 이름이 긴 이름보다 좋다.
    • 단, 의미가 분명한 경우에 한해서
반응형