- 인코딩을 피하라
- 헝가리식 표기법을 피하라
- 멤버 변수 접두어를 피하라
public class Part{ private String m_dsc; // 설명 문자열 void setName(String name){ m_dsc = name; } }
접두어를 사용한 코드는 옛날에 작성한 구닥다리 코드라는 징표가 되어버린다.public class Part{ String description; // 설명 문자열 void setDescription(String description){ this.description = description; } }
- 인터페이스 클래스와 구현 클래스
- 인터페이스 클래스 이름과 구현 클래스 이름 중 하나를 인코딩 해야 한다면, 구현 클래스 이름을 택하는게 좋다. ShapeFactoryImpl나 CShapeFactory가 IShapeFactory보다 좋다.
- 자신의 기억력을 자랑하지 마라
- 독자가 코드를 읽으면서 변수 이름을 자신이 아는 이름으로 변환해야 한다면 변수 이름은 바람직하지 못하다.
- 클래스 이름
- 클래스 이름과 객체 이름은 명사나 명사구가 적합하다. Customer, WikiPage, Account, AddressParser 등이 좋은 예이다. Manager, Processor, Data, Info 등과 같은 단어는 피하고, 동사는 사용하지 않는다.
- 메서드 이름
- 메서드 이름은 동사나 동사구가 적합하다. postPayment, deletePage, save 등이 좋은 예이다.
- 접근자, 변경자, 조건자는 자바빈 표준에 따라 값 앞에 get, set, is를 붙인다.
String name = employee.getName(); customer.setName("mike"); if (paycheck.isPosted())....
- 생성자를 중복 정의 할 때는 정적 팩토리 메서드를 사용한다. 메서드는 인수를 설명하는 이름을 사용한다.
Complex fulcrumPoint = Complex.FromRealNumber(23.0);
위 코드가 아래 코드보다 좋다. 생성자 사용을 제한할려면 해당 생성자를 private로 선언한다.Complex fulcrumPoint = new Complex(23.0);
- 기발한 이름은 피하라
- 재미난 이름보다 명료한 이름을 선택하라
- 한 개념에 한 단어를 사용하라
- 똑같은 메서드를 클래스마다 fetch, retrieve, get으로 제각각 부르면 혼란스러워서 추상적인 개념 하나에 단어 하나를 선택해 이를 고수해야 한다.
- 일관성 있는 어휘를 사용해야 한다.
- 말장난을 하지마라
- 한 단어를 두 가지 목적으로 사용하지 마라
- 만약 지금까지 사용한 add 메서드가 2개의 값을 더하는 메서드였는데, 새로 작성하는 메서드는 집합에 값을 하나 추가한다고 가정하면 이 메서드는 add 메서드와 맥락이 다르기 때문에 add 메서드라고 부르면 안된다. insert나 append라는 이름이 적당하다.
- 해법 영역에서 가져온 이름을 사용하라
- 코드를 읽을 사람도 프로그래머라는 사실을 명심한다.
- 문제 영역으로 가져온 이름을 사용하라
- 적절한 ‘프로그래머 용어’가 없다면 문제 영역에서 이름을 가져온다.
- 의미 있는 맥락을 추가하라
- 스스로 의미가 분명한 이름이 없지 않지만, 대다수 이름은 그렇지 못하다. 그래서 클래스, 함수, 이름 공간에 넣어 맥락을 부여한다.
- addr라는 접두어를 추가해 addrFirstName, addrLastName, addrState라 쓰면 맥락이 더 분명해진다. 물론 Address라는 클래스를 생성하면 더 좋다.
위 코드는 함수가 길고, 세 변수를 함수 전반에서 사용한다. 함수를 작은 조각으로 쪼개는 클래스를 만든 후에, 세private void printGuessStatistics(char candidate, int count){ String number; String verb; String pluraModifier; if (count == 0){ number = "no"; verb = "are"; pluraModifier = "s"; } else if (count == 1){ number = "1"; verb = "is"; pluraModifier = ""; } else{ number = Integer.toString(count); verb = "are"; pluraModifier = "s"; } String guessMessage = String.format( "There %s %s %s%s", verb, number, candidate, pluraModifier); print(guessMessage); }
private void printGuessStatistics(char candidate, int count){
String number;
String verb;
String pluraModifier;
if (count == 0){
number = "no";
verb = "are";
pluraModifier = "s";
} else if (count == 1){
number = "1";
verb = "is";
pluraModifier = "";
} else{
number = Integer.toString(count);
verb = "are";
pluraModifier = "s";
}
String guessMessage = String.format(
"There %s %s %s%s", verb, number, candidate, pluraModifier);
print(guessMessage);
}
변수를 클래스에 넣으면 간단하게 사용할 수 있다.
12. 불필요한 맥락을 없애라
- 일반적으로는 짧은 이름이 긴 이름보다 좋다. 단, 의미가 분명한 경우에 한해서다. 이름에 불필요한 맥락을 추가하지 않도록 주의해야 한다.
- accountAddress와 customerAddress는 Address 클래스 인스턴스로는 좋은 이름이나 클래스 이름으로는 적합하지 못하다. Address는 클래스 이름으로 적합하다.
'Book Review > Clean Code' 카테고리의 다른 글
클린코드 5장_형식 맞추기 (0) | 2022.09.06 |
---|---|
클린코드 4장_주석 (0) | 2022.08.30 |
클린 코드 3장 정리 #1 (0) | 2022.07.30 |
클린 코드 2장 정리 #1 (0) | 2022.07.28 |
클린 코드 1장 정리 (0) | 2022.07.28 |