이름을 잘 짓는 간단한 규칙
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;
}
단순히 이름만 고쳤는데도 함수가 하는 일을 이해하기 쉬워졌다
이것이 좋은 이름이 주는 위력이다