의도를 분명히 밝혀라
변수, 함수, 클래스 이름을 정할 때 아래의 세가지 질문에 대답이 가능 하도록 이름을 짓는다.
1) 존재 이유
2) 수행 기능
3) 사용 방법
예)
1
2
|
int d; //경과 시간
int elaspedTimeInDays;
|
cs |
단순히 변수 명을 d라고 쓰는 경우보다 아래와 같이 구체적으로 사용하는게 좋다.
또한 함수가 어떤 일을 하는지 이해하기 쉽게 기술하도록 노력한다
예)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
Member* getThem() {
for(vector<Member*>::size_type i = 0; i<members.size(); i++) {
if((*members[i]).leader)
return members[i];
}
}//어떤 일을 하는지 이해하기 어렵다.
Member* getLeadMember() {
vector<Member*>::iterator iter;
for(iter = members.begin(); iter != members.end(); ++iter) {
if((*iter)->isLeader())
return (*iter);
}
}//앞의 함수보다 이해하기
|
cs |
로직은 동일하지만 이름을 신경씀으로써 함수를 이해하는데 사용하는 시간이 줄어든다.
그릇된 정보를 피하라
약어를 잘못사용하면 코드를 읽는 독자에게 그릇된 정보를 전달할 수 있다.
예를 들어 빗볏(hypotenuse)를 hp로 줄여쓰는 경우 독자에 따라 다르게 이해할 수 있는 소지가 있다.
accountList라는 명명보다는 accountGroup, Accounts등으로 사용한다. List를 이름에 사용하는 순간 다른 독자는 데이터 타입을 List로 이해할수도 있다.(실제로는 List타입이 아님에도 불구하고)
의미 있게 구분하라
이름에 연속된 숫자를 추가하거나 불용어(noise word)를 사용하지 않는다.
변수에 a1, a2와 같이 이름에 숫자를 붙이기 보다는 명확한 이름을 사용한다.
예)
1
2
3
4
5
6
7
8
9
10
11
12
13
|
void copyChars(char a1[], char a2[]) {
for(int i=0; i<strlen(a1); i++) {
a2[i] = a1[i];
}
}
void copyChars(char source[], char destination[]) {
int sourceLength = strlen(source);
for(int i=0; i<sourceLength; i++) {
destination[i] = source[i];
}
}
|
cs |
클린코드를 읽기전까지 아래 예제처럼 불용어(Noise word)를 자주 사용했다.
예)
ProductInfo, ProductData => Product로 대체
CustomerObject => Customer로 대체
NameString => Name으로 대체
.
.
.
생각해보면 필요없는 사족이고 오히려 가독성을 저해하는 원인이 되는 것 같다.
인코딩을 피하라
헝가리식 표기법은 사용하지 않는다.
멤버 변수에 접두어는 쓰지 않는다.
인터페이스 클래스에 접두어 I쓰지 않는다.
예) IShapeFactory 보다는 그냥 ShapeFactory 혹은 반드시 표기해야 겠다면 ShapeFactoryImp정도?
클래스 이름
클래스 이름과 객체 이름은 명사나 명사구를 사용한다.
메서드 이름
메서드 이름은 동사나 동사구를 사용한다.
한 개념에 한 단어를 사용해라
추상적인 개념 하나에 단어 하나를 선택한다.
같은 일을 하는 메서드를 클래스마다 다르게 사용한지 않는다.
예를 들면 Person 클래스에서는 fetch(), Animal 클래스에서는 get(), Robot클래스 에서는 retrieve()로 이름을 다르게 사용하지 않고 하나를 고수한다.
또한 동일한 코드 기반에서 controller, manager, driver를 섞어쓰지 않는다. 실제로 많은 legacy에서는 이러한 부분이 섞어서 쓰는 경우가 많다. 정확히 어떤 의미적 차이가 있는지 모르는 경우가 대부분이다.
불필요한 맥락을 없애라
고급 휘발유 충전소(Gas Station Delux)라는 서비스를 개발한다고 할때 모든 클래스 이름 앞에 GSD를 붙이는 것은 불필요한 맥락을 추가하는 것이다.
아무리 내가 작성한 코드라도 시간이 지나면 잊어 먹기 쉽다.
내가 짠 코드라도 언젠가 나도 내 코드를 읽어야 하는 독자가 되는 상황이 온다.
내 코드를 읽을 독자들을 위해 이름에 좀 더 신경써야겠다.
'좋은 코드 만들기 > 클린코드' 카테고리의 다른 글
[클린코드] 6. 객체와 자료 구조 (0) | 2021.04.25 |
---|---|
[클린코드] 5. 형식 맞추기 (0) | 2021.04.11 |
[클린코드] 4. 주석 (0) | 2021.03.28 |
[클린코드] 3. 함수 (0) | 2021.03.21 |
[클린코드] 1. 깨끗한 코드 (0) | 2021.02.28 |