책을 읽게 된 계기
개발일을 하다 보면 내 코드도 시간이 지나 이해되지 않았던 적이 많았습니다.
이 책은 그러한 습관들로부터 벗어날 수 있는 방법을 제시해 주었고,
계속 상기시키기 위해 정리를 하게 되었습니다.
책의 내용이 많아서 챕터별로 정리를 하도록 하겠습니다.
책의 내용 - 의미 있는 이름
의도를 분명히 밝혀라!
'좋은 이름을 지으려면 시간이 걸리지만 좋은 이름으로 절약하는 시간이 훨씬 더 많다.'
예를 들면 아래와 같은 코드가 있다고 해봅시다.
public List<int[]> getThem() {
List<int[]> list 1 = new ArrayList<int[]>();
for (int[] x : theList)
if (x[0] == 4)
list1.add(x);
return list1;
}
코드가 하는 일을 짐작하기 어렵습니다.
TheList에 무엇이 들었는가?
TheList에서 0번째 값이 어째서 중요한가?
값 4는 무슨 의미인가?
함수가 반환하는 리스트 list1을 어떻게 사용하는가?
이처럼 의도가 분명하지 않은 변수명은 프로그래머가 무엇을 말하고 어떤 프로그램을 짜는지 알 수 없게 만듭니다.
public List<int[]> getThem() {
List<int[]> flaggedCells = new ArrayList<int[]>();
for (cell cell : gemeBoard)
if (cell.isFlagged())
flaggedCells.add(cell);
return flaggedCells;
}
theList -> gameBoard로 변경
List1 -> flaggedCells로 변경
이 두 개의 변수만 변경한 것으로 게임이라는 것을 추측할 수 있고,
또한 셀의 상태 값에 따라 깃발이 꽂히는 거라고 이해할 수 있습니다.
그릇된 정보를 피하라
1. 그릇된 단서
예를 들면 계정 그룹을 묶을 때, 실제 List가 아니라면 accountList라 명명하지 않습니다.
프로그래머에게 List라는 단어는 특수한 의미입니다.
계정을 담는 컨테이너가 실제 List가 아니라면 프로그래머에게 그릇된 정보를 제공하는 셈입니다.
그러므로 accountGroup, 아니면 단순히 Accounts라 명명합니다.
2. 서로 흡사한 이름을 사용하지 않도록 한다.
최신 자바 환경은 코드 자동완성 기능을 제공합니다.
이름만 몇 자만 입력해도 사용할 수 있으므로 흡사한 이름으로 헷갈리게 사용하지 않습니다.
3. 정보와 목적을 사용한다면 코드 읽기가 쉬워진다.
예를 들어 Product라는 클래스가 있다고 가정해 봅시다.
다른 클래스를 ProductInfo 혹은 ProductData라 부른다면 개념을 구분하지 않은 채 이름만 다른 경우입니다.
이와 마찬가지로 의미가 불분명한 불용어를 사용하면 안 됩니다.
읽는 사람이 차이를 알도록 이름을 지어라.
클래스 이름
클래스 이름과 객체 이름은 명사나 명사구가 적합합니다.
메서드 이름
메서드 이름은 동사나 동사구가 적합합니다.
해법 영역에서 가져온 이름을 사용하라
코드를 읽는 사람도 프로그래머라는 사실을 명심합니다. 그러므로 프로그램 용어를 사용해도 됩니다.
MAP, LIST, QUEUE를 모르는 프로그래머가 있을까요? 기술 개념에는 기술 이름이 가장 적합한 선택입니다.
문제 영역에서 가져온 이름을 사용하라
적절한 프로그래머 용어가 없다면 문제 영역에서 이름을 가져옵니다. 코드를 보수하는 프로그래머가 분야 전문가에게 의미를 물어 파악할 수 있게 하기 위해서입니다.
의미 있는 맥락을 추가하라
모든 방법이 실패하면 마지막 수단으로 접두어를 붙입니다.
예를 들어 firstName, LastName, Street라는 변수가 있습니다. 변수를 훑어보면 주소라는 사실을 금방 알아챕니다. 하지만 street라는 변수 하나만 사용한다면? 추측하지 못할 것입니다. 이럴 때 접두어 addrStreet을 사용합니다. 더 나아가 객체를 만들고 해당하는 객체의 함수를 사용하면 독자에게는 더 쉽게 다가올 것입니다. Address()를 만들고, Address().getStreet()을 사용하는 것처럼입니다.
리뷰
오늘은 클린 코드 1장 의미 있는 이름에 대해서 읽었습니다.
객체와 함수의 이름을 어떻게 지으면 좋을지와,
어떤 순으로 생각하는지 파악할 수 있었고,
'최대한 나의 프로그램이 남들도 볼 수 있게 구현되었으면 좋겠습니다.
댓글
GitHub 계정으로 로그인하시면 댓글과 질문을 남기실 수 있습니다. 남겨 주신 글은 이 저장소의 Discussions에 쌓입니다.