의도를 분명히 밝혀라
의도가 분명하게 들어나있는 이름을 지어라.
좋은 이름을 지으려면 시간이 걸리지만 좋은 이름으로 절약하는 시간이 훨씬 더 많다.
그러므로 이름을 주의 깊게 살펴 더 나은 이름이 떠오르면 개선하기 바란다.
변수나 함수 그리고 클래스 이름은 존재의 이유, 수행기능, 사용 방법을 주석으로 설명하지 않아도 알 수 있어야 한다.
public Set<Integer> getNumbers() {
Set<Integer> numbers = new HashSet<>();
while (numbers.size() < 7) {
Integer number = (int) (Math.random() * 45) + 1;
numbers.add(number);
}
return numbers;
}
위 함수는 1부터 45까지 중복이 없는 랜덤한 7개의 숫자를 반환한다. 이 코드를 보면 어떤 시스템에 사용하는지 알 수 있겠는가?
이렇게 의미없는 이름으로 구현하게 되면 어떤 시스템에서 사용하는지 어떻게 사용하는지 알 수 없다.
이 함수는 바로 로또 번호를 발급하는 로직이다. 그럼 의도가 들어나도록 코드를 수정해보자.
public Set<Integer> getLottoNumbers() {
int minNumber = 1;
int maxNumber = 45;
int numbersSize = 7;
Set<Integer> numbers = new HashSet<>();
while (numbers.size() < numbersSize) {
Integer number = (int) (Math.random() * maxNumber) + minNumber;
numbers.add(number);
}
return numbers;
}
단순히 함수 이름만 변경하고, 각 숫자들이 어떤 의미를 하는지 변경해주기만 해도 함수가 하는 일이 무엇인지 이해하기 쉬워졌다.
그릇된 정보를 피하라
프로그래머는 코드에 그릇된 단서를 남겨서는 안 된다. 그릇된 단서는 코드 의미를 흐린다.
get...List라는 함수가 실제로 반환하는 데이터가 List가 아니라면 이것도 그릇된 정보다.
그릇된 단서를 남기지 않으려면 아래 항목을을 주의해야 한다.
- 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용해선 안된다.
- 서로 흡사한 이름을 사용하지 않도록 주의해야 한다.
- 유사한 개념은 유사한 표기법을 사용한다.
- 일관성이 떨어지는 표기법을 사용해선 안된다.
의미있게 구분하라
컴파일러나 인터프리터만 통과하려는 생각으로 코드를 구현하는 프로그래머는 스스로 문제를 일으킨다.
예를 들어 다른 두 개념에 같은 이름을 사용하게 된다면 컴파일 되지 않을 것이다.
그럼 몇몇 프로그래머는 이름에 연속된 숫자를 붙히거나 불용서를 추가하는 방식으로 고치곤 한다.
하지만 이런 방식은 적절하지 못하다. 이런 방식은 아무런 정보도 제공하지 못한다.
이름이 달라야 한다면 의미도 달라져야 한다.
getAccount 함수와 getAccountInfo 함수의 차이점을 한눈에 알겠는가?
안쪽 코드를 보지 않는 이상은 아무도 구분하지 못할 것이다. 읽는 사람이 차이를 알도록 이름을 지어라.
발음하기 쉬운 이름을 사용하라
발음하기 어려운 이름은 발음하며 토론하기 어렵다.
쉬운 발음의 단어는 지적인 대화가 가능하고 토론을 할 때도 쉽게 커뮤니케이션이 가능하다.
검색하기 쉬운 이름을 사용하라
문자 하나를 사용하는 이름이나 상수는 텍스트 코드에서 쉽게 눈에 띄지 않는다.
문자 하나마늘 사용하는 변수 이름은 루프에서 반복 횟수를 세는 변수(i, j, k)로만 사용해야 한다. 그 외에는 적절하지 않다.
변수나 상수를 코드 여러 곳에서 사용한다면 검색하기 쉬운 이름이 바람직하다.
이름을 의미있게 지으면 함수가 길어지지만 검색하기 쉬워진다.
인코딩을 피하라
대개 새로운 개발자가 익힐 코드 양은 상당히 많다. 거기에 인코딩 언어까지 익히라는 요구는 비합리적이다.
문제 해결에 집중하는 개발자에게 인코딩은 불필요한 정신적 부담이다.
인코딩한 이름은 발음하기 어려우면 오타가 생기기도 한다.
접두어는 접어두라
클래스와 함수는 접두어가 필요없을 정도로 작아야 마땅하다.
또한 멤버 변수를 다른 색상으로 표시하거나 눈에 띄게 보여주는 IDE를 사용해야 마땅하다.
코드를 읽을수록 접두어는 관심 밖으로 밀려나고, 결국은 옛날에 구닥다리 코드라는 징표가 된다.
인터페이스와 구현 클래스
개발을 하다보면 인터페이스를 만들고 구현할 클래스를 만들때가 있다.
인터페이스에 접두어(예를 들어 MemberJoinInterface)가 붙게 되면 주의를 흐트리고 과도한 정보를 제공할 수도 있다.
차라리 구현 클래스의 이름을 MemberJoinImpl이나 CMemberJoin를 권장한다.
클래스 이름
클래스 이름과 객체 이름은 명사나 명사구가 적합하다.
Customer, WikiPage, Account, AddressParser 등이 좋은 예다.
Manager, Processor, Data, Info 등과 같은 단어는 피하고 동사는 사용하지 않는다.
메서드 이름
메서드 이름은 동사나 동사구가 적합하다.
postPayment, deletePage, save 등이 좋은 예다.
접근자(Accessor), 변경자(Mutator), 조건자(Predicate)는 javabean 표준에 따라 값 앞에 get, set, is를 붙인다.
생성자를 중복 정의(overload)할때는 정적 팩토리 메서드(static method)를 사용하고, 메서드는 인수를 설명하는 이름을 사용한다.
한 개념에 한 단어를 사용하라
추상적인 개념 하나에 단어 하나를 선택해 이를 고수한다.
예를 들어 똑같은 개념의 메서드를 클래스마다 다른 이름으로 제각각 부르면 혼란스럽다.
메서드 이름은 독자적이고 일관적이어야 한다. 그래야 주석을 뒤져보지 않고도 개발자가 올바른 메서드를 선택한다.
비지니스 영역에서 이름을 가져와라
적절한 프로그래머 용어가 없다면 코드를 보수하는 프로그래머가 분야 전문가에게 의미를 물어 파악할 수 있다.
우수한 프로그래머라면 비지니스 영역을 구분할 수 있을 것이다.
또한 비지니스 영역 개념과 관련이 깊은 코드라면 문제 영역에서 이름을 가져와야 한다.
의미있는 맥락을 추가하라
스스로 의미가 분명한 이름이 없지 않다. 하지만 대다수 이름은 그렇지 못하다.
그래서 클래스, 함수, 이름 공간에 넣어 맥락을 부여한다. 모든 방법이 실패하면 마지막 수단으로 접두어를 붙인다.
일반적으로 짧은 이름이 긴 이름보다 좋다. 단, 의미가 분명한 경우에 한해서다. 이름에 불필요한 맥락을 추가하지 않도록 주의한다.
'클린코드' 카테고리의 다른 글
[클린코드] 6. 객체와 자료 구조 (0) | 2023.07.30 |
---|---|
[클린코드] 5. 형식 맞추기 (2) | 2023.07.21 |
[클린코드] 4. 주석 (0) | 2023.07.19 |
[클린코드] 3. 함수 (0) | 2023.07.12 |
[클린코드] 1. 깨끗한 코드 (0) | 2022.04.12 |