ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 의미있는 이름[의도를 분명하게 밝혀라]
    CleanCode 2021. 5. 13. 10:39

    의도를 분명하게 밝혀라

    의도가 드러나는 이름을 사용하면 코드 이해변경이 쉬워집니다.

    Bad!

    int a;  // 경과시간

    위와 같이 a 만 보고는 무슨 의미인지 알 수 없습니다.

    다행이도 친절히 주석을 써줬기 때문에 무슨 의미인지 알 수 있었지만 

    a를 사용하는 모든 코드 line에 a 가 경과시간이라는 주석을 단다는 것은 너무 과하다 생각 됩니다.

    또한, 선언부를 찾아가면 되잖아요? 라고 한다면 그건 너무 비효율적인 일이 되지 않을까 싶습니다.

    Good!

    int elapsedTimeInDays;
    int daysSinceCreation;
    int daysSinceModification;
    int fileAgeInDays;

     

    우선 저희가 미국 사람이라고 가정하겠습니다.

    모르는 영어단어가 없다고 가정하는 것이지요.

    아래는 구글 번역기를 돌렸을때의 뜻 입니다.

    elapsedTimeInDays : 경과 시간 (일)
    daysSinceCreation : 창조 이후 일수
    daysSinceModification : 수정 이후 일수
    fileAgeInDays : 파일 사용 기간 (일)

    저희는 미국사람이기 때문에 번역하지 않아도 이미 다 알고 있었던 단어들이죠.

    위 처럼 이름을 짓게 되면 변수명만 보고도 어떤 의미를 가지고 있는 알 수 있습니다.


    아래 메서드는 무슨 일을 하는 메서드인지 알 수 없습니다.

    Bad!

    public List<int[]> getThem() {
      List<int[]> list1 = new ArrayList<int[]>();
      for (int[] x : theList)
        if (x[0] == 4)
          list1.add(x);
      return list1;
    }

    여기서 문제되는 이름을 나열해 보겠습니다.

    • getThem : getThem? 그들을 얻는다고? 그들이 뭐지?
    • list1 : 목록1 에는 무엇이 담겨 있을까?
    • x : 왜 x라고 했지 a라고 해도 되지 않나?
    • 0 : 0부터 뭘 하는건가?
    • theList : 그목록은 무슨 목록이지?
    • 숫자 4 : 4는 뭘까? 숫자 3도 있으려나?

    지뢰찾기 게임을 만들었다고 가정하고 이름을 지어보겠습니다.

    위에서 어떤 의미를 가지고 있는지 알 수 없는 이름들에 의미를 담은 이름으로 변경해 보겠습니다.

    Good!

    public List<int[]> getFlaggedCells() {
      List<int[]> flaggedCells = new ArrayList<int[]>();
      for (int[] cell : gameBoard)
        if (cell[STATUS_VALUE] == FLAGGED)
          flaggedCells.add(cell);
      return flaggedCells;
    }
    • getThem > getFlaggedCells : 깃발이 곶힌 칸 가져오기
    • list1 > flaggedCells : 깃발이 꽂힌 칸
    • x > cell : 지뢰찾기의 각 칸
    • 0 > STATUS_VALUE : 상태 값
    • theList > gameBoard : 게임판
    • 4 > FLAGGED : 깃발이 꽂힌 상태

     

    코드의 단순성은 변하지 않았습니다. 

    연산자 수와 상수 수, 들여쓰기는 모두 동일합니다.

    그런데도 코드가 더욱 명확해 진 걸 보실 수 있습니다.

     

    여기서 한단계 더 업그레이드 해보겠습니다.

    int 배열을 사용하는 대신 Cell 클래스로 만들어 봅니다.

    isFlagged 라는 좀 더 명시적인 함수를 사용해 FLAGGED라는 상수를 감춰도 좋을것 같습니다.

    Good!

    public List<Cell> getFlaggedCells() {
      List<Cell> flaggedCells = new ArrayList<Cell>();
      for (Cell cell : gameBoard)
        if (cellisFlagged())
          flaggedCells.add(cell);
      return flaggedCells;
    }

    단순히 이름만 고쳤는데도 함수가 하는 일을 이해하기 쉬워졌습니다.

    이것이 좋은 이름이 주는 위력입니다!

     

    ※ CleanCode 책에 있는 내용을 정리하였습니다.

    참고도서 : Clean Code 클린코드 애자일 소프트웨어 장인 정신

    댓글

Designed by Tistory.