// 잘못된 예
int 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;
}
코드가 하는 일을 짐작하기 어렵다.
복잡한 문장도, 공백 들여쓰기도 적당하다. 변수 상수도 몇 개 안된다.
화려한 클래스나 다형 메서드도 없다.
문제는 코드의 단순성이 아니라 코드의 함축성이다.
코드 맥락이 코드 자체에 명시적으로 드러나지 않는다,.
지뢰찾기를 만드는 문제라면?
public List<int[]> getFlaggedCells() { List<int[]> flaggedCells = new ArrayList<int[]>();
for (int[] cell : gameBoard)
if (cell[STATUS_VALUE] == 4)
flaggedCells.add(cell);
return flaggedCells;
}
- 게임에서 각 칸은 단순 배열로 표현한다.
- 0번째 값은 칸 상태를 뜻한다.
- 값 4는 깃발이 꽂힌 상태를 가리킨다.
> 한걸음 더 나아가보기
> - int 배열을 사용하는 대신, 칸을 간단한 클래스로 만들기
> - isFlagged라는 좀 더 명시적인 함수를 사용해 FLAGGED라는 상수를 감추기
```java
public List<Cell> getFlaggedCells() {
List<Cell> flaggedCells = new ArrayList<Cell>();
for (Cell cell : gameBoard)
if (isFlagged())
flaggedCells.add(cell);
return flaggedCells;
}
- 빗변을 나타내려고 만든 변수명 hp(hypotenuse)는 노트북일지도...?
- accountList 보다는 accountGroup, bunchOfAccount가 났다.
- XYZControllerForEfficientHandlingOfStrings 와 XYZControllerForEfficientStorageOfStrings 같은 두 비슷한 단어를 쓰지 않는다.
- a1, a2, a3 ... an 은 안좋다.
- Product라는 클래스가 있는데 ProductInfo, ProductData 클래스를 쓰는건 의미가 불분명하다.
- 고객 급여를 알고 싶다면 Customer 클래스와 CustomerObject 클래스 중 어떤 것을 뒤져야할지 모른다.
- a, an, the도 마찬가지로 불용어다.
- 변수 이름에 variable, 표에 table같은 것 쓰지 않는다.
int WORK_DAYS_PER_WEEK = 5
를 사용하자.변수 이름이 firstName, lastName, houseNumber, street, city, state 등이 있다면 코드가 있는 부분이 주소를 의미한다는 사실을 쉽게 알 수 있다.
마치면서
- 암기는 도구에게 맡기고, 우리는 문장, 문단처럼 읽히는 코드 아니면 적어도 표나 자료 구조처럼 읽히는 코드를 짜는 데만 집중해야한다.