본문 바로가기

도서/Clean Code

[Clean Code/클린 코드] 2장 의미있는 이름

2장 의미있는 이름

📖  좋은 이름을 지으려면 시간이 걸리지만 좋은 이름으로 절약하는 시간이 훨씬 더 많다.

 

 

목차

     


    🗒️ 책에서 기억하고 싶은 내용

    의도를 분명히 밝혀라

    // before
    public List<int[]> getThem() {
      List<int[]> list1 = new ArrayList<int[]>();
      for (int[] x : theList)
        if (x[0] == 4)
          list1.add(x);
      return list1;
    }
    
    // after
    public List<Cell> getFlaggedCells() {
      List<Cell> flaggedCells = new ArrayList<Cell>();
      for (Cell cell : gameBoard)
        if (cell.isFlagged())
          flaggedCells.add(cell);
      return flaggedCells;
    }

    그릇된 정보를 피하라

    여러 계정을 그룹으로 묶을 때, 실제 List가 아니라면, accountList라 명명하지 않는다.
    프로그래머에게 List라는 단어는 특수한 의미다.
    계정을 담는 컨테이너가 실제 List가 아니라면 프로그래머에게 그릇된 정보를 제공하는 셈이다.

    의미 있게 구분하라

    컴파일러를 통과할지라도 연속된 숫자를 덧붙이거나 불용어를 추가하는 방식은 적절하지 못하다.
    이름이 달라야 한다면 의미도 달라져야 한다.


    불용어는 중복이다. 변수 이름에 variable이라는 단어는 단연코 금물이다.
    표 이름에 table이라는 단어도 마찬가지다. NameString이 Name보다 뭐가 나은가?
    Name이 부동소수가 될 가능성이 있던가? 그렇다면 앞서 언급한 "그릇된 정보를 피하라" 규칙을 위반한다.
    코드를 읽다가 Customer라는 클래스와 CustomerObject라는 클래스를 발견했다면 차이를 알겠는가?

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

    // before
    for (int j = 0; j < 34; j++) {
      s += (t[j] * 4) / 5;
    }
    
    // after
    int realDaysPerIdealDay = 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;
    }

    ETC

    클래스, 객체 : 명사, 명사구

    메서드 : 동사, 동사구

     

    접근자, 변경자, 조건자는 javabean 표준에 따라 값 앞에 get, set, is를 붙인다.

    https://www.oracle.com/java/technologies/javase/javabeans-spec.html

    🗒️ 소감

    깨끗한 코드를 짜기 위해서는 중복을 최대한 줄이는 것이 가장 중요하다고 생각했는데,

    2장을 읽고 가독성의 중요성에 대해 깊이 생각할 수 있었다.

     

    짧고 이해할 수 없는 코드보다 조금 길더라도

    의도를 한눈에 파악할 수 있는 코드가 훨씬 나음을 예시를 보며 느끼게 되었다.

     

    누가 보아도 의도를 파악할 수 있도록 가독성 좋은 코드를 작성할 수 있도록 노력해야겠다.

     

    🗒️ 궁금하거나 어려웠던 내용

    X