이름은 어디에나 쓰인다. 변수, 함수, 인수, 클래스, 패키지, 소스 파일, 파일이 담긴 디렉터리 ... 등 수 많은 곳에 이름을 붙인다.
2장에서는 이름을 잘 짓는 간단한 규칙에 대한 내용.
의도를 분명히 밝혀라
변수나 함수 그리고 클래스의 이름은 다음과 같은 굵직한 질문에 모두 답해야한다.
변수(함수 / 클래스)의 존재 이유는? 수행 기능은? 사용 방법은?
int d; // 경과 시간(단위: 날짜)
d는 아무 의미도 드러나지 않는다. 측정하려는 값과 단위를 표현하는 이름이 필요하다.
int elapsedTimeInDays;
int daysSinceCreateion;
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에 무엇이 들어가는가
- theList의 0번째 값이 왜 중요한가?
- 4는 무슨 의미인가?
- 함수가 반환하는 리스트1을 어떻게 사용하는가?
위의 사항들을 보충해서 수정한다면
public List<int[]> getFlaggedCells() {
List<int[]> flaggedCells = new ArrayList<int[]>();
for (int[] cell : gameBoard)
if (cell[STATUS_VALUE] == FLAGGED)
flaggedCells.add(cell);
return flaggedCells;
}
이렇게 된다. 코드의 단순성은 변하지 않았음에도 불구하고 코드는 더욱 명확해졌다. 조금 더 명확히 하자면 int배열이 아닌 Cell을 간단한 클래스로 만드는것도 좋겠다.
그리고 isFlagged라는 좀 더 명시적인 함수를 사용해 FLAGGED라는 상수를 감춰도 좋겠다.
여기까지 개선하면
public List<Cell> getFlaggedCells() {
List<Cell> flaggedCells = new ArrayList<Cell>();
for (Cell cell : gameBoard)
if (cell.isFlagged())
flaggedCells.add(cell);
return flaggedCells;
}
이런 코드가 나오겠다. 이름만 고쳤는데도 함수가 하는 일을 이해하기 쉬워졌다.
'개발서적 > CleanCode' 카테고리의 다른 글
Clean Code - [ 1장 ] 깨끗한 코드 (2) | 2021.08.26 |
---|