클린 코드 2장에서는 코딩에서의 이름을 잘 지어야 하는 이유와 더불어서 이름을 잘 짓는 몇가지 규칙을 소개해 주고 있다.
의도를 분명히 밝혀라
- 의도가 드러나는 이름을 사용하면 코드의 이해와 변경이 쉬워진다.
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의 의미는 무엇인가?
- 함수가 반환하는 list1을 어떻게 사용하는가
이러한 코드를 다음과 같이 변경하면 코드가 상당히 읽기 편하다.
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 배열대신 간단한 클래스로 만들고, isFlagged라는 좀 더 명시적인 함수를 사용해 FLAGGED라는 상수를 감춰도 좋다.
public List<int[]> getFlaggedCells() {
List<int[]> flaggedCells = new ArrayList<int[]>();
for (Cell cell : gameBoard)
if (cell.isFlagged())
flaggedCells.add(cell);
return flaggedCells;
}
그릇된 정보를 피하라
- 코드에 그릇된 단서를 남겨서는 안된다.
- 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용해도 안된다.
- 여러 계정을 그룹으로 묶을때, accountList라고 명명하지 않는다. 프로그래머에게 List는 특수한 의미이기 때문
- accountGroup, bunchOfAccounts, Accounts라고 명명하는게 좋다.
- 서로 흡사한 이름을 사용하지 않도록 주의할것
- 유사한 개념은 유사항 표기법을 사용할것
의미있게 구분하라
연속된 숫자를 덧붙이거나(a1, a2, a3…) 불용어를 추가하는 것은 적절하지 않다.
발음하기 쉬운 이름을 사용하라
회사에서 다른 사람들과 토론할때 발음이 가능한 단어가 토론하기에 좋다.
우리 두뇌에서 상당 부분이 단어라는 개념을 전적으로 처리한다.
검색하기 쉬운 이름을 사용하라
검색하기 좋은 관점에서 긴 이름이 짧은 이름보다 좋으며, 검색하기 쉬운 이름이 상수보다 좋다.
인코딩을 피하라
유형이나 범위정보까지 인코딩에 넣으면 그만큼 이름을 해독하기 어려워 진다.
자바의 객체는 강한 타입(Strongly-typed)이며, IDE는 코드를 컴파일하지 않고도 타입 오류를 감지할 정도로 발전했다. 이는 인코딩 방식이 방해가 될뿐이다.
자신의 기억력을 자랑하지 마라
- 독자가 코드를 읽으면서 변수이름을 자신이 아는 이름으로 변환해야 한다면 그 변수의 이름은 바람직하지 못하다.
- 문자 하나만 사용하는 변수이름은 문제가 있다.(루프에서 반복횟수를 세는 i, j, k는 괜찮다)
- 명료함이 최고다.
클래스의 이름을 지정하는 방법
- 클래스나 객체의 이름은 명사나 명사구가 적합하다.
- 좋은예 : Customer, WikiPage, Account, AddressParser 등
- 나쁜예 : Manager, Processor, Data, Info 등
메서드의 이름을 지정하는 방법
- 메서드의 이름은 동사나 동사구가 적합하다
- 좋은예 : postPayment, deletePage, save 등
- javabean 표준에따라 get, set, is를 붙여도 된다.
- 생성자를 오버로딩할 때는 정적 팩토리 메서드를 사용한다. → 생성자를 통해 객체를 생성하는 것이 아닌 메서드를 통해서 객체를 생성하는 것
Complex fulcrumPoint = Complex.FromRealNumber(23.0)
기발한 이름은 피하라
- 재미난 이름보다 명료한 이름을 선택하라
- 의도를 분명하고 솔직하게 표현하라
한 개념에 한 단어를 사용하라
추상적인 개념 하나에 단어 하나를 선택해 이를 고수한다. → 똑같은 메서드를 클래스마다 fetch, retrieve, get으로 제각각 부르면 혼란스럽다.
메서드이름은 독자적이고 일관적이어야 한다. 그래야 주석을 뒤져보지 않고 프로그래머가 올바른 메서드를 선택할 수 있다.
말장난을 하지마라
- 한 단어를 두가지 목적으로 사용하지마라
- 일관성을 지키려고 같은 단어를 선택하기보다는 목적과 맥락을 고려해서 목적에 따라 이름을 지정해야 한다.
해법 영역에서 가져온 이름을 사용하라
- 코드를 읽는 사람도 프로그래머이기 때문에 전산, 알고리즘이름, 패턴, 수학 용어등을 사용해도 괜찮다.
- 기술 개념에는 기술이름이 가장 적합한 선택이다.
해법 영역에 없다면 문제 영역에서 가져온 이름을 사용하라
- 적절한 프로그래머 용어가 없다면 문제영역에서 이름을 가져온다.
의미 있는 맥락을 추가하라
예를 들어 firstName, lastName, street, houseNumber, city, state, zipcode라는 변수가 있을때, 이는 주소라는 사실을 알아챌 수 있다. 하지만 어떤 메서드가 state라는 변수 하나만 사용하면 해당 변수가 주소의 일부라는 사실을 알아채기 어렵다.
이를 방지하기 위해서 addr이라는 접두어를 붙이면 맥락이 분명해진다. addrFirstName, addrLastName, addrState 처럼 말이다.
하지만 Address라는 클래스를 생성하는것이 가장 좋다.
불필요한 맥락을 없애라
고급 휘발유 충전소라는 애플리케이션을 만들때, 모든 클래스 이름에 GSD(Gas Station Deluxe)라는 접두어를 붙이는 것은 바람직하지 못하다. → IDE에서 검색할때 G를 누를시 모든 클래스가 검색되기 때문