[Clean Code] 1장 깨끗한 코드 & 2장 의미있는 이름
1장 깨끗한 코드
이 책을 읽는다고 뛰어난 프로그래머가 된다는 보장은 없다. ‘코드 감각’을 확실히 얻는다는 보장도 없다. 단지 뛰어난 프로그래머가 생각하는 방식과 그들이 사용하는 기술과 기교와 도구를 소개할 뿐이다.
2장 의미있는 이름
의도를 분명히 밝혀라
그릇된 정보를 피하라
int a =l;
if(O == l)
a = O1;
else
L = 01;
위와 같은 0(영)이나 O(영어 오) 등의 경우
의미있게 구분하라
customerInfo는 customer과 accountData는 account와 theMessage는 message와 구분이 안 된다. 읽는 사람이 차이를 알도록 이름을 지어라.
발음하기 쉬운 이름을 사용하라
검색하기 쉬운 이름을 사용하라
인코딩을 피하라
-헝가리식 표기법
-인터페이스 클래스와 구현 클래스
인터페이스 클래스 이름과 구현 클래스 이름 중 하나를 인코딩해야 한다면 구현 클래스 이름을 택하겠다. ShapeFactoryImp나 심지어 CShapeFactory가 IShapeFactory보다 좋다.
자신의 기억력을 자랑하지 마라
루프에서 반복 횟수 변수는 전통적으로 i,j,k와 같이 한글자를 사용한다.그 외에 대부분은 적절하지 못하다. 최악은 a와 b를 사용하므로 c를 선택한다는 논리다.
클래스 이름과 객체 이름은 명사나 명사구가 적합하다.
메서드 이름은 동사나 동사구가 적합하다.
기발한 이름은 피하라
한 개념에 한 단어를 사용하라
말장난을 하지 마라
다른 개념에 같은 단어를 사용한다면 그것은 말장난에 불과하다.
프로그래머는 코드를 최대한 이해하기 쉽게 짜야 한다.
해법 영역에서 가져온 이름을 사용하라
기술 개념에는 기술 이름이 가장 적합한 선택이다.
문제 영역에서 가져온 이름을 사용하라
우수한 프로그래머와 설계자라면 해법 영역과 문제 영역을 구분할 줄 알아야 한다.
의미 있는 맥락을 추가하라
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 = "no";
verb = "are";
pluralModifier = "s";
}
private void thereIsOneLetter(){
number = "1";
verb = "is";
pluralModifier = "";
}
private void thereAreNoLetters(){
number = Integer.toString(count);
verb = "are";
pluralModifier = "s";
}
}
불필요한 맥락을 없애라
일반적으로 짧은 이름이 긴 이름보다 좋다. 단, 의미가 분명한 경우에 한해서다.
accountAddress와 customerAddress는 Adress 클래스 인스턴스로는 좋은 이름이나 클래스 이름으로는 적합하지 못하다.
회사에서 findDataById라고 메서드를 만들고 설명을 주석으로 한 적이 있다. 코드 리뷰 시간에 메서드 명으로 의미를 파악하기 힘들다고 리뷰를 받았다. 이 책을 읽으면서 의미있는 이름이 얼마나 중요한지 다시 깨달을 수 있었다.
아래는 카카오페이 개발자 페스티벌에서 1등한 프로젝트이다. 대기업에서 조차 변수명으로 많이 헤매고 있는 것 같다는 생각이 들면서 의미있는 이름을 사용하는 것에 대해 생각해보는 시간을 가질 수 있었다.
https://tech.kakaopay.com/post/variable-name-bot-haero-sery-bread/
변수명..변수명이 떠오르지 않아! - "너의 변수명은." 챗봇 개발 일지 | 카카오페이 기술 블로그
카카오페이 개발자 페스티벌 - 카페톤 1등 수상작, "변수명 추천 봇"이 만들어진 과정을 소개합니다!
tech.kakaopay.com