변수, 함수, 클래스 이름은 아래 질문에 모두 답해야함
만약 따로 주석이 필요하다면 의도를 분명히 드러내지 못했다는 것
// 이름으로 의도를 드러내지 못한 코드
int d; // 경과 시간(단위: 날짜)
// 이름으로 의도를 드러낸 코드
int daysSinceCreation;
아래 함수는 복잡한 로직이 없지만, 함수가 하는 일을 짐작하기 어려움
public List<int[]> getThem() {
List<int[]> list1 = new ArrayList<int[]>();
for (int[] x : theList)
if (x[0] == 4)
list1.add(x);
return list1;
}
위 코드는 독자가 다음 정보를 안다고 가정
이러한 정보에 대해 아래처럼 적절하게 이름을 붙혀주기만 해도 코드가 훨씬 나아짐
public List<int[]> getFlaggedCells() {
List<int[]> flaggedCells = new ArrayList<int[]>();
for (int[] cell : gameBoard)
if (cell.isFlagged())
flaggedCells.add(cell);
return flaggedCells;
}
아래와 같이 같은 범위에 있는 두 변수를 단순히 숫자로 구분하는 것은 좋지 않음
public static void copyChars(char a1[], char a2[]) {
for (int i = 0; i< a1.length; i++) {
a2[i] = a1[i];
}
}
아래와 같이 같은 범위의 각 변수에 의미 있는 이름을 붙혀야함(연속된 숫자 → 의미 있는 이름)
public static void copyChars(char source[], char destination[]) {
for (int i = 0; i< source.length; i++) {
destination[i] = source[i];
}
}
// 나쁜 코드
class DtaRcrd102 {
private Date genymdhms;
private Date modymdhms;
private final String pszqint = "102";
/* ... */
};
// 좋은 코드
class Customer {
private Date generationTimeStamp;
private Date modificationTimeStamp;
private final String rdcordId = "102";
};
의미가 있는 상수나 텍스트는 아래와 같이 눈에 띄고, 검색하기 쉽도록 강조
// 나쁜 코드
if(age >= 20) ...
// 좋은 코드
if(age >= ADULT_AGE) ...
헝가리식 표기법(타입을 변수 이름에 쓰는 방식)
자바는 변수 이름에 타입을 인코딩할 필요 X
// 나쁜 예시
PhoneNumber phoneString; // 타입이 바뀌어도 이름은 바뀌지 않는다.
멤버 변수 접두어
멤버 변수에 m_ 이라는 접두어를 붙일 필요 X
public class Part {
private String m_dec; // 설명 문자열
void setName(PString name) {
m_dsc = name;
}
}
인터페이스 클래스와 구현 클래스
ShapeFactory implements IShapeFactory
보다ShapeFactoryImpl implements ShapeFactory
가 낫다. → 인터페이스 명을 그냥 짓고, 구현 클래스에 Impl을 붙히는 방식추상적인 개념 하나에 단어 하나를 선택해 이를 고수
→ 일관성 있게 사용하자
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) {
number = "1";
verb = "is";
pluralModifier = "";
} else {
number = Integer.toString(count);
verb = "are";
pluralModifier = "s";
}
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 thereAreManyLetters(int count) {
number = Integer.toString(count);
verb = "are";
pluralModifier = "s";
}
private void thereIsOneLetter(){
number = "1";
verb = "is";
pluralModifier = "";
}
private void thereAreNoLetter(){
number = "no";
verb = "are";
pluralModifier = "s";
}
}
일반적으로 짧은 이름이 긴 이름보다 좋음. But 의미가 분명해야함
accountAddress
와 customerAddress
는 Address
클래스 인스턴스로는 좋은 이름이나 클래스 이름으로는 적합하지 못하다. Address
는 클래스 이름으로 적합하다.