2017. 11. 9. 19:32

이름을 잘 짓는 간단한 규칙


1. 의도를 분명히 밝혀라


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


- 변수나 함수 그리고 클래스 이름은 다음과 같은 질문에 모두 대답 가능


1. 존재 이유

2. 수행 기능

3. 사용 방법


- 따로 주석이 필요하다면 의도를 분명히 드러내지 못함


int d; // 경과 시간(단위 : 날짜)


이름 d는 아무 의미도 드러나지 않는다


- 측정하려는 값과 단위를 표현하는 이름이 필요하다


int elapsedTimeInDays;


int daysSinceCreation;


int daysSinceModification;


int fileAgeInDays;


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



다음 코드는 무엇을 할까?


public vector<int*> getThem() {

    vector<int*> list1;

    for(auto x : theList)

        if(x[0] == 4)

            list1.push_back(x);

    return list1;

}


코드가 하는 일을 짐작하기 어렵다


왜일까? 복잡한 문장은 없다


공백과 들여쓰기도 적당하다


변수는 세 개, 상수는 두 개 뿐이다


화려한 클래스나 다형성 메서드도 없다


단지 배열 목록만 사용한다


문제는 코드의 단순성이 아니라 코드의 함축성이다


다시 말해 코드 맥랙이 코드 자체에 명시적으로 드러나지 않는다


위 코드는 암암리에 독자가 다음과 같은 정보를 안다고 가정한다


1. theList에 무엇이 들어있는가?


2. theList에서 0번째 값이 어째서 중요한가?


3. 값 4는 무슨 의미인가?


4. 함수가 반환하는 리스트 list1을 어떻게 사용하는가?



위 코드 샘플엔 이와 같은 정보가 드러나지 않는다


하지만 정보 제공은 충분히 가능했었다


지뢰찾기 게임을 만든다고 가정하자


그러면 theList가 게임판이라는 사실을 안다


theList를 gameBoard로 바꿔보자


게임판에서 각 칸은 단순 배열로 표현한다


배열에서 0 번째 값은 칸 상태를 뜻한다


값 4는 깃발이 꽂힌 상태를 가리킨다


각 개념에 이름만 붙여도 코드가 상당히 나아진다



public vector<int*> getFlaggedCells( ) {

    vector<int*> flaggedCells;

     for(auto cell : gameBoard)

        if(cell[STATUS_VALUE] == FLAGGED)

            flaggedCells.push_back(cell);

    return flaggedCells;

}



연산자 수와 상수 수는 똑같다


그런데도 코드는 더욱 명확해졌다


한 걸음 나아가 int 배열을 사용하는 대신, 칸을 간단한 클래스로 만든다


isFlagged라는 좀 더 명시적인 함수를 사용해 FLAGGED라는 상수를 감춰도 된다



public vector<Cell> getFlaggedCells( ) {

    vector<Cell> flaggedCells;

     for(auto cell : gameBoard)

        if(cell.isFlagged( ))

            flaggedCells.push_back(cell);

    return flaggedCells;

}


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


이것이 좋은 이름이 주는 위력이다