[Clean Code] 2. 의미있는 이름
좋은 이름을 지으려면 시간이 걸리지만, 좋은 이름으로 절약하는 시간이 훨씬 더 많다.
이름에 의도를 분명히 밝혀라
측정하려는 값과 단위를 표현하는 이름이어야 한다.
int elapsedTimeInDays;
int daysSinceCreation;
int daysSinceModification;
int fileAgeInDays;
의미 있게 구분하라
Product 클래스와 ProductInfo, ProdouctData라는 클래스가 있다면, 개념을 구분하지 않은 채 이름만 달리한 경우다.
읽는 사람이 차이를 알도록 이름을 지어라.
발음하기 쉬운 이름을 사용하라
genymdhms → generationTimestamp
검색하기 쉬운 이름을 사용하라
문자 하나 또는 상수는 텍스트 코드에서 찾기 어려우므로 이름에 사용하지 말자.
l(L의 소문자)이나 0(숫자 0)은 절대 금물이다.
변수나 상수를 코드 여러 곳에서 사용한다면 검색하기 쉬운 이름이 바람직하다.
이름 길이는 범위의 크기에 비례해야 한다.
자신의 기억력을 자랑하지 마라
루프에서 반복 횟수 변수는 전통적으로 한글자를 사용하므로 괜찮지만 그 외에는 대부분 적절하지 않다.
클래스 이름
- 좋은 예 : Customer, WikiPage, Account, AddressParser 와 같은 명사나 명사구
- 나쁜 예 : Manager, Processor, Data, Info 와 같은 단어나 동사
메서드 이름
- 좋은 예 : postPayment, deletePage, save 와 같은 동사나 동사구
- 접근자, 변경자, 조건자는 javabean 표준에 따라 get, set, is를 붙인다.
- 생성자를 중복정의 할 때는 정적 팩토리 메서드를 사용한다. Complex fulcrumPoint = Complex.FromRealNumber(23.0);
한 개념에 한 단어를 사용하라
추상적인 개념 하나에 단어 하나를 선택해 이를 고수하라. 동일 코드 기반에 controller, manager, driver를 섞어 쓰면 혼란스럽다.
한 단어를 두가지 목적으로 사용하지 마라
기존에 add가 기존 값 두개를 더해 새로운 값을 만든다고 가정하자.
만약 집합에 값 하나를 추가하는 메소드라면 add가 아닌 insert, append와 같이 다른 이름을 사용해라
의미있는 맥락을 추가하라
독자가 메서드만 훑어서는 변수의 의미를 알 수 없고, 알고리즘을 통해 맥락을 유추해야 한다면 잘못된 코드다.
- 나쁜 예
private void printGuessStatistics(char candidate, int count) {
String number;
String verb;
String pluralModifier;
if(count == 0){
number = "no";
verb = "are";
pluralModifier = "s";
} else if(count == 1){
} else {
}
String guessMessage = String.format(
"There %s %s %s%s", verb, number, candidate, pluralModifier
)
print(guessMessage);
}
- 좋은 예
public class GuessStatisticsMessage {
private String number;
private String verb;
private String pluralModifier;
public String make(char candidate, int count) {
createPluralDependentMessageParts(count);
return String.format(
"There %s %s %s%s", verb, number, candidate, pluralModifier
)
}
private void createPluralDependentMessageParts(int count) {
if(count == 0){
thereAreNoLetters();
} else if(count == 1) {
thereIsOneLetter();
} else {
thereAreManyLetters(count);
}
}
private void thereAreNoLetters(int count) {
number = Integer.toString(count);
verb = "are";
pluralModifier = "s";
}
private void thereIsOneLetter() {}
private void thereAreManyLetters(int count) {}
}
불필요한 맥락을 없애라
고급 휘발유 충전소(GSD) 애플리케이션의 모든 클래스 이름을 GSD로 시작하는 것은 바람직하지 못하다.
accountAddress, customerAddress는 Address 클래스 인스턴스로는 좋은 예이지만, 클래스 이름으로는 부적절하다.
포트 주소, MAC 주소 등을 구분해야 한다면 PostalAddress, MAC 등의 이름을 통해 의미를 분명히 할 수 있다.