-
의미있는 이름[의도를 분명하게 밝혀라]CleanCode 2021. 5. 13. 10:39
의도를 분명하게 밝혀라
의도가 드러나는 이름을 사용하면 코드 이해와 변경이 쉬워집니다.
Bad!
int a; // 경과시간
위와 같이 a 만 보고는 무슨 의미인지 알 수 없습니다.
다행이도 친절히 주석을 써줬기 때문에 무슨 의미인지 알 수 있었지만
a를 사용하는 모든 코드 line에 a 가 경과시간이라는 주석을 단다는 것은 너무 과하다 생각 됩니다.
또한, 선언부를 찾아가면 되잖아요? 라고 한다면 그건 너무 비효율적인 일이 되지 않을까 싶습니다.
Good!
int elapsedTimeInDays; int daysSinceCreation; int daysSinceModification; int fileAgeInDays;
우선 저희가 미국 사람이라고 가정하겠습니다.
모르는 영어단어가 없다고 가정하는 것이지요.
아래는 구글 번역기를 돌렸을때의 뜻 입니다.
elapsedTimeInDays : 경과 시간 (일)
daysSinceCreation : 창조 이후 일수
daysSinceModification : 수정 이후 일수
fileAgeInDays : 파일 사용 기간 (일)저희는 미국사람이기 때문에 번역하지 않아도 이미 다 알고 있었던 단어들이죠.
위 처럼 이름을 짓게 되면 변수명만 보고도 어떤 의미를 가지고 있는 알 수 있습니다.
아래 메서드는 무슨 일을 하는 메서드인지 알 수 없습니다.
Bad!
public List<int[]> getThem() { List<int[]> list1 = new ArrayList<int[]>(); for (int[] x : theList) if (x[0] == 4) list1.add(x); return list1; }
여기서 문제되는 이름을 나열해 보겠습니다.
- getThem : getThem? 그들을 얻는다고? 그들이 뭐지?
- list1 : 목록1 에는 무엇이 담겨 있을까?
- x : 왜 x라고 했지 a라고 해도 되지 않나?
- 0 : 0부터 뭘 하는건가?
- theList : 그목록은 무슨 목록이지?
- 숫자 4 : 4는 뭘까? 숫자 3도 있으려나?
지뢰찾기 게임을 만들었다고 가정하고 이름을 지어보겠습니다.
위에서 어떤 의미를 가지고 있는지 알 수 없는 이름들에 의미를 담은 이름으로 변경해 보겠습니다.
Good!
public List<int[]> getFlaggedCells() { List<int[]> flaggedCells = new ArrayList<int[]>(); for (int[] cell : gameBoard) if (cell[STATUS_VALUE] == FLAGGED) flaggedCells.add(cell); return flaggedCells; }
- getThem > getFlaggedCells : 깃발이 곶힌 칸 가져오기
- list1 > flaggedCells : 깃발이 꽂힌 칸
- x > cell : 지뢰찾기의 각 칸
- 0 > STATUS_VALUE : 상태 값
- theList > gameBoard : 게임판
- 4 > FLAGGED : 깃발이 꽂힌 상태
코드의 단순성은 변하지 않았습니다.
연산자 수와 상수 수, 들여쓰기는 모두 동일합니다.
그런데도 코드가 더욱 명확해 진 걸 보실 수 있습니다.
여기서 한단계 더 업그레이드 해보겠습니다.
int 배열을 사용하는 대신 Cell 클래스로 만들어 봅니다.
isFlagged 라는 좀 더 명시적인 함수를 사용해 FLAGGED라는 상수를 감춰도 좋을것 같습니다.
Good!
public List<Cell> getFlaggedCells() { List<Cell> flaggedCells = new ArrayList<Cell>(); for (Cell cell : gameBoard) if (cellisFlagged()) flaggedCells.add(cell); return flaggedCells; }
단순히 이름만 고쳤는데도 함수가 하는 일을 이해하기 쉬워졌습니다.
이것이 좋은 이름이 주는 위력입니다!
※ CleanCode 책에 있는 내용을 정리하였습니다.