티스토리 뷰
| 2. 의미 있는 이름
Summary.
의미 있고 발음하기 쉽고 검색하기 쉽게 이름을 지어주자.
(존재 이유, 수행 기능, 사용 방법이 드러나도록)
...
|| 의도를 분명히
--
변수나 함수 그리고 클래스 이름은 아래 질문에 모두 답해야 한다
1. 변수(함수 or 클래스)의 존재 이유는?
2. 수행 기능은?
3. 사용 방법은?
* 따로 주석이 필요하다면 의도를 분명히 드러내지 못했다는 말.
1 2 3 4 | int elapsedTimeInDays; int daySinceCreation; int daySinceModification; int fileAgeInDays; | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | // 의도가 분명하지 않은 코드 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<Cell> getFlaggedCells() { List<Cell> flaggedCells = new ArrayList<Cell>(); for (Cell cell : gameBoard) if(cell.isFlagged()) flaggedCells.add(cell); return flaggedCells; } | cs |
|| 그릇된 정보를 피하기
- 그릇된 정보를 제공하는 약어 피하기
- 서로 흡사한 이름을 사용하지 않도록 주의
- 일관성이 떨어지는 표기법은 주의
|| 의미 있게 구분
읽는 사람이 차이를 알도록 이름을 짓자
아래는 오류 형태의 예시이다.
어느 함수를 호출할지 어떻게 알까?
getActiveAccount();
getActiveAccounts();
getActiveAccountInfo();
|| 발음하기 쉬운 이름 사용
지적인 대화가 가능한 이름을 사용하자.
- genymdhms => generationTimestamp;
- modymdhms => modificationTimestamp;
- pszqint => recordId;
|| 검색하기 쉬운 이름 사용
--
- 긴 이름이 짧은 이름보다 좋다.
- 검색하기 쉬운 이름이 상수보다 좋다.
1 2 3 4 5 6 7 8 | int realDaysPerIdealDay = 4; const int WORK_DAYS_PER_WEEK = 5; int sum = 0; for (int j=0; j < NUMBER_OF_TASKS; j++) { int realTaskDays = tsakEstimate[j] * realDaysPerIdealDay; int realTaskWeeks = (realTaskDays / WORK_DAYS_PER_WEEK); sum += realTaskWeeks; } | cs |
|| 인코딩 피하기
--
- 헝가리식 표기법 : 변수 이름에 타입을 인코딩할 필요가 없다.
- 멤버 변수 접두어 : 클래스와 함수는 접두어가 필요없을 정도로 작아야 마땅하다.
- 인터페이스 클래스와 구현 클래스 : 인코딩이 필요한 경우이다. 보통 구현 클래스에 인코딩을 해준다. (ShapeFactoryImpl)
|| 클래스 이름
--
- 클래스 이름과 객체 이름은 명사나 명사구가 적합.
좋은 예는 Customer, WikiPage, Account, AddressParser ..
|| 메서드 이름
--
- 메서드 이름은 동사나 동사구가 적합.
좋은 예는 postPayment, deletePage, save ..
- 접근자, 변경자, 조건자는 javabean 표준에 따라 값 앞에 get, set, is 사용
- 생성자를 overload 할 때는 정적 팩토리 메서드를 사용
- 메서드는 인수를 설명하는 이름을 사용
1 2 3 4 5 | // 좋지 않은 코드 Complex fulcrumPoint = new Complex(23.0); // 좋은 코드 Complex fulcrumPoint = Complex.FromRealNumber(23.0); | cs |
|| 한 개념에 한 단어 사용
--
- 추상적인 개념 하나에 단어 하나를 선택해 이를 고수
- 클래스의 메서드 이름은 독자적이고 일관적이어야 함. 주석을 뒤져보지 않고 메서드를 선택하기 위해
|| 해법 영역에서 가져온 이름을 사용
--
- 전산 용어, 알고리즘 이름, 패턴 이름, 수학 용어 등 사용해도 좋다.
- 기술 개념에는 기술 이름이 가장 적합한 선택
|| 의미 있는 맥락을 추가
--
클래스, 함수, 이름 공간에 넣어 맥락을 부여
ㅇ맥락이 불분명한 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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); } | cs |
ㅇ 맥락이 분명한 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | public class printGuessStatisticsMessage { 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"; } } | cs |
|| 불필요한 맥락을 없애라
--
일반적으로 짧은 이름이 긴 이름보다 좋다.
단, 의미가 분명한 경우에 한해서!
이름에 불필요한 맥락을 추가하지 않도록 주의하자.
출처 : 클린 코드 (Robert C. Martin)
'Books' 카테고리의 다른 글
[클린 코드: Clean Code] 4. 주석(comment) (0) | 2021.01.11 |
---|---|
[클린 코드: Clean Code] 3. 함수(Function) (0) | 2021.01.11 |
[JPA] 엔티티 비교, 프록시, 성능 최적화 (4) | 2020.12.29 |
[JPA] 엔티티 그래프 (Entity Graph) (0) | 2020.12.29 |
[JPA] 영속성(persistence) 관리 (OSIV) (0) | 2020.12.28 |