변수나 함수 그리고 클래스 이름은 다음과 같은 굵직한 질문에 모두 답해야 한다. 1. 변수(혹은 함수나 클래스)의 존재 이유는? 2. 수행 기능은? 3. 사용 방법은? 따로 주석이 필요하다면 의도를 분명히 드러내지 못했다는 말이다.
int d; // 경과 시간(단위: 날짜)
이름 d는 아무 의미도 드러나지 않는다.
int elapsedTimeInDays;
int daysSinceCreation;
int daysSinceModification;
int fileAgeInDays;
의도가 드러나는 이름을 사용하면 코드 이해와 변경이 쉬워진다.
public List<int[]> getThem() {
List<int[]> list1 = new ArrayList<int[]>();
for (int[] x : theList) {
if (x[0] == 4)
list1.add(x);
}
return list1;
}
위의 코드는 복잡한 문장도 없고 간단한 코드지만 무슨 일을 하는 것인지 짐작하기 어렵다. 문제는 코드의 단순성이 아니라 코드의 함축성이다.
만약 위의 코드가 지뢰찾기 게임을 위한 코드였고, theList가 게임판, 배열에서 0번째 값은 칸 상태를, 값 4는 깃발이 꽂힌 상태를 가리킨다. 아래와 같이 바꿔보자.
public List<int[]> getFlaggedCells() {
List<int[]> flaggedCells = new ArrayList<int[]>();
for (int[] cell : gameBoard) {
if (cell[STATUS_VALUE] == FLAGGED)
flaggedCells.add(x);
}
return flaggedCells;
}
코드의 단순성은 동일하나 어떤 동작을 하는 코드인지 명확해졌다.int 배열을 사용하는 대신, 칸을 간단한 클래스로, isFlagged라는 명시적인 함수를 사용해 FLAGGED라는 상수를 감출수도 있겠다.
public List<Cell> getFlaggedCells() {
List<Cell> flaggedCells = new ArrayList<Cell>();
for (Cell cell : gameBoard) {
if (cell.isFlagged())
flaggedCells.add(x);
}
return flaggedCells;
}