Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 객사오
- 파이썬
- Python
- thymeleaf
- Gradle
- go
- H2 설치
- Codeup
- java
- MySQL
- springboot
- 클린 코드
- 코드업
- Git
- 기초100제
- Vue.js
- 오블완
- Postman
- 클린코드
- mariadb
- GitHub
- 알고리즘
- golang
- JPA
- Spring
- spring security
- Spring Boot
- 스프링
- 롬복
- 티스토리챌린지
Archives
- Today
- Total
nyximos.log
[Clean Code] 2장, 의미 있는 이름 본문
클린 코드, 애자일 소프트웨어 장인정신
Robert C. Martin
들어가면서
소프트웨어에서 이름은 어디에나 쓰인다.
많이 사용하므로 이름을 잘 지으면 편하다.
이 장에서는 이름을 잘 짓는 간단한 규칙을 소개한다.
의도를 분명히 밝혀라
변수나 함수 그리고 클래스 이름은 다음과 같은 굵직한 질문에 모두 답해야 한다.
- 변수(혹은 함수나 클래스)의 존재 이유는?
- 수행 기능은?
- 사용 방법은?
따로 주석이 필요하다면 의도를 분명히 드러내지 못했다는 말이다.
의도가 드러나는 이름을 사용하면 코드 이해와 변경이 쉬워진다.
중요한 것은 코드의 함축성이다.
int d; // 경과 시간(단위 : 날짜)
int elapsedTimeIndays;
int daysSinceCreation;
int daysSinceModification;
int fileAgeInDays;
그릇된 정보를 피하라
- 프로그래머는 코드에 그릇된 단서를 남겨서는 안 된다.
→ 그릇된 단서는 코드 의미를 흐린다. (List) - 나름대로 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용해도 안된다.
- 서로 흡사한 이름을 사용하지 않도록 주의한다.
- 유사한 개념은 유사한 표기법을 사용한다.
- 안 좋은 예) 소문자 L이나 대문자 O를 변수로 사용하면 1과 0으로 보이므로 사용하지 않도록 하자.
의미 있게 구분하라
- 컴파일러나 인터프리터만 통과하려는 생각으로 코드를 구현하려는 프로그래머는 스스로 문제를 일으킨다.
- 동일한 범위 안에서는 다른 두 개념에 같은 이름을 사용하지 못한다.
- 컴파일러를 통과하더라도 연속된 숫자를 덧붙이거나(a1, a2),
불용어 noise word(변수이름에서 variable, 표이름에 table 등)를 추가하는 방식은 적절하지 못하다. - 읽는 사람이 차이를 알도록 이름을 지어라.
발음하기 쉬운 이름을 사용하라
- 발음하기 어려운 이름은 토론하기도 어렵다.
- 프로그래밍은 사회 활동이므로 발음하기 쉬운 이름은 중요하다.
class DdtaRcrd102 {
private Date genymdhms;
private Date modymdhms;
private final String pszqint = "102";
}
class Customer {
Date generationTimestamp;
Date modificationTimestamp;
private final String recordId = "102";
}
검색하기 쉬운 이름을 사용하라
- 문자 하나를 사용하는 이름과 상수는 텍스트 코드에서 쉽게 눈에 띄지 않는다.
- 검색 또한 어렵다.
- 긴 이름이 짧은 이름보다 좋다.
- 검색하기 쉬운 이름이 상수보다 좋다. (ex. 5 와 WORK_DATYS_PER_WEEK)
- 이름 길이는 범위 크기에 비례해야 한다.
- 변수나 상수를 코드 여러 곳에서 사용한다면 검색하기 쉬운 이름이 바람직하다.
인코딩을 피하라
- 인코딩한 이름은 거의 발음하기 어려우며 오타가 생기기도 쉽다.
- 자바 프로그래머는 변수 이름에 타입을 인코딩할 필요가 없다. (phoneString)
- 코드를 읽을수록 접두어(또는 접미어)는 관심 밖으로 밀려난다.(멤버 변수의 경우 '_m')
- 눈에 띄게 보여주는 IDE를 사용하자.
때로는 인코딩이 필요한 경우도 있다. (인터페이스 클래스와 구현 클래스)
- 두 클래스 중 하나를 인코딩 한다면 구현 클래스 이름을 택하자.
- 인터페이스 클래스 - ShapeFactory
- 구현 클래스 - ShapeFactoryImpl
자신의 기억력을 자랑하지 마라
- 전문가 프로그래머는 명료함이 최고라는 사실을 이해한다.
- 전문가 프로그래머는 자신의 능력을 좋은 방향으로 사용해 남들이 이해하는 코드를 내놓는다.
클래스 이름
- 클래스 이름과 객체 이름은 명사나 명사구가 적합하다.
- 좋은 예) Costomer. WikiPage, Account, AddressParser
- 동사, Manage, Processor, Data, Info 등의 단어는 피하자.
메서드 이름
- 동사나 동사구가 적합하다.
- 좋은 예) postPayment, deletePage, save 등
- 접근자 Accessor, 변경자 Mutator, 조건자 Predicate의 경우, javabean 표준에 따라 값 앞에 get, set, is를 붙인다.
- 생성자 사용을 제한 하려면 해당 생성자를 private로 선언한다.
- 생성자 constructor를 중복정의 overload 할 때는 정적 팩토리 메서드를 사용한다.
- 메서드는 인수를 설명하는 이름을 사용한다.
Complex fulcrumPoint = Complex.FromRealNumber(23.0); // 좋은 예
Complex fulcrumPoint = new Complex(23.0);
기발한 이름은 피하라
- 재미난 이름보다 명료한 이름을 선택하라.
- 특정 문화에서만 사용하는 농담을 피하는 편이 좋다.
- 의도를 분명하고 솔직하게 표현하라.
한 개념에 한 단어를 사용하라
- 추상적인 개념 하나에 단어 하나를 선택해 고수한다.
- 똑같은 메서드를 클래스마다 fetch, retrieve, get으로 제각각 부르면 혼란 스럽다.
- 마찬가지로, 동일 코드 기반에 controller, manager, driver를 섞어 쓰면 혼란스럽다.
말장난을 하지 마라
- 한 단어를 두가지 목적으로 사용하지 마라.
- 같은 맥락이 아닌데도 '일관성'을 고려하여 똑같은 단어를 사용하지 마라. (add, insert, append)
- 프로그래머는 코드를 대충 훑어봐도 최대한 이해하기 쉽게 짜야한다.
해법 영역에서 가져온 이름을 사용하라
- 코드를 읽을 사람도 프로그래머이니 전산 용어, 알고리즘 이름, 패턴 이름, 수학 용어 등을 사용해도 괜찮다.
- 모든 이름을 문제 영역 domain 에서 가져오는 정책은 현명하지 못하다.
- 기술 개념에는 기술 이름이 가장 적합한 선택이다.
문제 영역에서 가져온 이름을 사용하라
- 적절한 '프로그래머 용어'가 없다면 문제 영역에서 이름을 가져온다.
- 우수한 프로그래머와 설계자라면 해법 영역과 문제 영역을 구분할 줄 알아야 한다.
- 문제 영역 개념과 관련이 깊은 코드라면 문제 영역에서 이름을 가져와야 한다.
의미 있는 맥락을 추가하라
- 클래스, 함수, 이름 공간에 넣어 맥락을 부여한다.
- 모든 방법이 실패하면 마지막 수단으로 접두어를 붙인다.
맥락이 불분명한 변수
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 createDependentMessageParts(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";
}
}
불필요한 맥락을 없애라
- 의미가 분명한 경우에 한해서 일반적으로는 짧은 이름이 긴 이름보다 좋다.
- 이름에 불필요한 맥락을 추가하지 않도록 주의한다.
마치면서
- 이 장에서 소개한 규칙 몇 개를 적용해 코드 가독성이 높아지는지 살펴보라.
- 다른 사람이 짠 코드를 손본다면 리팩터링 도구를 사용해 문제 해결 목적으로 이름을 개선하라.
- 단기적인 효과는 물론 장기적인 이익도 보장한다.
'Books' 카테고리의 다른 글
[Clean Code] 6장, 객체와 자료 구조 (0) | 2022.02.22 |
---|---|
[Clean Code] 5장, 형식 맞추기 (0) | 2022.02.18 |
[Clean Code] 4장, 주석 (0) | 2022.02.16 |
[Clean Code] 3장, 함수 (0) | 2022.02.12 |
[Clean Code] 1장, 깨끗한 코드 (0) | 2022.02.10 |