티스토리 뷰

반응형


| 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)



반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday