의미를 분명히 밝혀라
- 변수의 존재 이유, 수행 기능, 사용법 등이 변수/함수/클래스명에 드러나야 한다. 따로 주석이 필요하지 않을 정도로
- 의미를 함축하거나 독자(코드를 읽는 사람)이 사전지식을 가지고 있다고 가정하지 말자
// bad
int d; // elapsed time in days
// good
int elapsedTimeInDays;
int daysSinceCreation;
int daysSinceModification;
....
- 아래의 코드는 독자가 다음과 같은 정보를 안다고 가정한다
- TheList에 무엇이 들었는가
- theList에서 해당 값이 어떤 의미를 가지는가?
- 함수가 반환하는 list1은 어떻게 사용하는가?
- 이름만 잘 붙여도 훨씬 명확해진다
//bad
public List<int[]> getThem(){
List<int[]> list1 = new ArrayList<int[]>();
if(list1[0][0] == 4)
list1.add(x);
return list1;
}
//good
public List getFlaggedCells(){
List flaggedCells = new ArrayList<>();
for(Cell cell : gameBoard)
if(cell.isFlagged())
flaggedCells.add(cell);
return flaggedCells;
}
// bad
public getUserInfo(Long id); // 회원가입했고 인증이 완료된 유저 정보 조회
public List<> getThem();
//good
public getAuthedUserInfoById(Long id)
public List<> getFlaggedCells();
그릇된 정보를 피해라
- 중의적으로 해석될 수 있는 이름 지양하기
- 개발자에게는 특수한 의미를 가지는 단어(List 등등)는 실제 컨테이너가 List가 아닌 이상, accountList와 같이 변수명에 붙이지 말자. 차라리 accountGroup, accounts 등으로 명명하자
- 비슷해 보이는 명명에 주의하자
의미 있게 구분하라(불용어를 쓰지 말자)
- 말이 안되는 단어(a1, a2, ..)과 같이 숫자로 구분하는 경우 주의
- 클래스 이름에 Info, Data 같은 불용어를 붙이지 말자. 정확한 개념 구분이 되지 않음
getActiveAccount()
,getActiveAccounts()
,getActiveAccountInfo()
- 이렇게 혼재할 경우 서로의 역할을 정확히 구분하기 어렵다
money
vsmoneyAmount
발음하기 쉬운 이름을 사용하라
말그대로
검색하기 쉬운 이름을 사용하라
- 상수는 static final 과 같이 정의해 쓰자
- 변수 이름의 길이는 변수의 범위에 비례해서 길어진다
인코딩을 피하라(변수에 부가 정보를 덧붙여 표기하는 것을 뜻함)
- 헝가리안 표기법
- 변수명에 해당 변수의 타입(String, Int 등)을 적지 말자
- 자바의 경우는 타입이 강제된다, 그래서 필요없다
- 타입이 바껴도 변수명은 변하지 않는다
- 멤버 변수 접두어
- 멤버 변수에 접두어를 붙이지 말자
- 인터페이스와 구현
- 인터페이스 클래스와 구현 클래스를 나눠야 한다면 구현 클래스의 이름에 정보를 인코딩하자
자신의 기억력을 자랑하지 마라
- 독자가 머리속으로 한번 더 생각해 변환해야 할만한 병수명을 쓰지 말라.(URL에서 호스트와 프로토콜을 제외한 소문자 주소를 r이라는 변수로 명명하는 일 등)
- 똑똑한 프로그래머와 전문가 프로그래머를 나누는 기준 한가지는 "Clarity(명료함)"이다.
클래스 이름
- 클래스 이름과 객체 이름은 명사 혹은 명사구를 사용하라
- Manager, Processor, Data, Info와 같은 단어는 피하자
- 동사는 사용하지 않는다
메서드 이름
- 동사 혹은 동사구를 사용하라(postPayment, deletePayment, deletePage, save 등)
- 접근자, 변경자, 조건자는 get, set, is로 시작하자.
- 생성자를 오버로드할 경우 정적 팩토리 메서드를 사용하고 해당 생성자를 private으로 선언한다
기발한 이름은 피하라
- 특정 문화에서만 사용되는 재미있는 이름보다 의도를 분명히 표현하는 이름을 사용하라
- HolyHandGrenade?? -> DeleteItems
- whack()?? -> kill()
한 개념에 한 단어를 사용하라
- 추상적인 개념 하나에 단어 하나를 사용하자
- fetch, retrieve, get
- controller, manager, driver
말장난을 하지 말라
- 한 단어를 두 가지 목록으로 사용하지 말자. 아래와 같은 경우에는 두 번째 메서드를 append 혹은 insert 로 바꿔라
public static String add(String message, String messageToAppend)
public List add(Element element)
해법 영역(Solution Domain) 용어를 사용하자
- 개발자라면 당연히 알고 있을
JobQueue
,AccountVisitor
등을 사용하지 않을 이유가 없다. 전산용어, 알고리즘, 패턴 이름, 수학 용어 등은 사용하자.
문제영역 용어를 사용하자
- 적절한 프로그래밍 용어가 없거나 문제영역과 관련이 깊은 용어의 경우 문제 영역 용어를 사용하자
의미 있는 맥락을 추가하라
- 클래스, 함수, namespace 등으로 감싸서 맥락을 표현하라
int street, state, city, zipcode;
// 주소인 것을 바로 알 수 있다
int state;
//단독으로 있으면 어떤 뜻인지 알기 어렵다
int addrState;
// 이럴 때 접두어를 붙이자
- 그래도 불문명하다면 접두어를 사용하자
// bad
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 ....", verb, number);
}
// Good
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 thereAreNoLetters() {
number = "no";
verb = "are";
pluralModifier = "s";
}
불필용한 맥락을 없애라
- 주유소라는(Gas station Deluxe) 애플리케이션에서 모든 클래스 이름을 GSD로 시작하는 것은 바람직하지 않다
- 의미가 분명한 경우에는 이름이 긴 경우가 좋지만, 불필요한 맥락을 추가하지 않도록 주의하자
- accountAddress, customerAddress는 인스턴스로는 좋은 이름이지만, 클래스 이름으로는 적절하지 못하다
'CS > 클린코드' 카테고리의 다른 글
[클린코드] chapter-6 객체와 자료구조 (0) | 2022.08.28 |
---|---|
[클린코드] chapter-5 형식 맞추기 (0) | 2022.08.25 |
[클린코드] chapter-4 주석 (0) | 2022.08.23 |
[클린코드] chapter-3 함수 (0) | 2022.08.21 |
[클린코드] Chapter-1 (0) | 2022.08.17 |