728x90
2장. 의미 있는 이름
의도를 분명히 밝혀라
int d; // 경과 시간(단위 : 날짜)
- 위의 변수만 봤을때는 경과 시간이라는걸 전혀 알수가 없다.
- 여기서의 바로 문제는 단순성이 아니라 함축성이다. 코드 맥락이 코드 자체에 명시적으로 드러나 있지 않다는 것이다.
public List<int[]> getThem() {
List<int[]> list1 = new ArrayList<int[]>();
for (int[] x : theList)
if (x[0] == 4)
list1.add(x);
return list1;
- 여기서의 문제는?
- theList에는 뭐가 들어 있는 것인가?
- theList의 0번째 값이 왜 중요한가?
- 값 4의 의미는 무엇인가?
- 함수가 반환하는 리스트 list1을 어떻게 사용하는가?
public List<int[]> getFlaggedCells() {
List<int[]> flaggedCells = new ArrayList<int[]>();
for (int[] cell : gameBoard)
if (cell[STATUS_VALUE] == FLAGGED)
flaggedCells.add(cell);
return flaggedCells;
}
- 단순히 변수명만 고쳤는데도 위와 같이 이해하기 편해졌다.
그릇된 정보를 피하라
- 나름대로 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용하면 안된다.
- 예를 들어, hp, aix, sco 같은 단어는 유닉스 플랫폼이나 유닉스 변종을 가리키는 이름이기 떄문에 다른 의미로 사용하면 안된다.
- 예를 들어 여러 계정을 그룹으로 묶을때 accountList라고 쓴다면 개발자들은 List 자료구조를 사용했다고 할 수 있다. 이런 경우에는 accounts와 같이 복수를 사용하라.
- 또한 서로 흡사한 이름을 사용하면 안된다.
- 유사한 개념은 유사한 표기법을 사용하자.
- 그릇된 정보중 끔찍한 것은 영문
O
와 숫자0
, 영문l
과 숫자1
이다. 둘이 비슷하기 때문에 같이 사용하면 혼동이 올수가 있다.
의미있게 구분하라.
- 불용어를 추가하는 방식을 사용하지 말아라.
- Info나 Data는 a, an, the와 마찬가지로 의미가 불분명한 불용어다.
- 불용어는 중복이다. 예를들어 NameString와 Name 중 뭐가 더 나은가? Name이 다른 자료형을 가질수도 있는 것인가? 바로 이게 그릇된 정보를 피하라 규칙을 위반한 것이라고 알 수 있다.
- 명확한 관례를 만들어라. 명확한 관례가 없다면 moneyAmount와 money가 구분이 되지 않는다.
- VO를 만드는 것도 방법이다.
발음하기 쉬운 이름을 사용하라.
- 사람은 단어에 능숙하고 단어라는 개념만 전적으로 처리한다. 단어는 발음이 가능하기 때문에 발음하기 쉬운 걸 사용하는게 좋다.
검색하기 쉬운 이름을 사용하라.
- 문자 하나를 사용하는 이름과 상수는 테스트 코드에서 쉽게 눈에 띄지 않는다는 문제가 있다.
s
와sum
둘중에 어떤게 더 검색하기 편할까?- 단순한 숫자
5
와WORD_DAYS_PER_WEEK
중 어떤게 검색하기 편할까?
인코딩을 피하라.
헝가리 표기법
최신 프로그래밍 언어는 강한 타입이기 때문에 헝가리식 표기법이나 기타 인코딩 방식이 오히려 방해 될수 있다.
PhoneNumber phoneString; // 타입이 바뀌어도 이름은 바뀌지 않는다.
멤버 변수 접두어
m_
과 같이 멤버 변수를 나타내는 접두어가 더 방해가 된다.
인터페이스 클래스와 구현 클래스
- 인터페이스 클래스 이름과 구현 클래스 이름 중 하나를 인코딩해야 한다면 구현 클래스 이름을 택하는 것이 좋다.
자신의 기억력을 자랑하지 마라.
- 변수 이름을 자신이 아는 이름으로 변환해야 한다면 그 변수 이름은 바람직하지 못하다.
- 루프에서 반복 횟수를 세는 변수 i,j,k를 제외한 문자 하나만 사용하는 변수는 절대 쓰면 안된다.
- 전문가 프로그래머는 명료함이 최고라는 사실을 이해한다.
클래스 이름
- 클래스 이름과 객체 이름은 명사나 명사구가 적합하다.
- Manager, Processor, Data, Info 등과 같은 단어는 피하고, 동사는 사용하지 않는다.
메서드 이름
- 메서드 이름은 동사구가 적합
- 접근자, 변경자, 조건자는 javabean 표준에 따라 값 앞에 get, set, is를 붙인다.
- 생성자를 중복정의 할 때는 정적 팩토리 메서드를 사용한다.
기발한 이름은 피하라.
- 의도를 분명하고 솔직하게 표현하라.
한 개념에 한 단어를 사용하라.
- 똑같은 메서드를 클래스마다 fetch, retrieve, get으로 제각각 부르면 혼란스럽다.
말장난을 하지 마라
- 한 단어를 두 가지 목적으로 사용하지마라. 다른 개념에 같은 단어를 사용한다면 그것은 말장난 불과하다.
- 그러나 한 개념에 한 단어를 사용하라는 규칙을 사용하다보니 여러 클래스에 add라는 클래스가 생기게 된다. add 메서드의 매개변수와 반환값이 의미적으로 똑같다면 문제가 없다.
- 그러나 일관성을 고려해 add를 사용하면 안된다. insert나 append와 같은 다른 단어를 찾아봐라.
- 의미를 해독할 책임이 독자에게 있는 논문 모델이 아니라 의도를 밝힐 책임이 저자에게 있는 잡지 모델이 바람직하다는 의미다.
해법 영역에서 가져온 이름을 사용하라.
- 코드를 읽을 사람도 프로그래머다. 따라서 관련된 해법 영역에서 가져온 이름을 사용하는게 좋다. 모든 이름을 문제영역(domain)에서 가져오는 것은 현명하지 못한다.
문제 영역에서 가져온 이름을 사용하라
- 적절한 프로그래머 용어가 없다면 문제 영역(domain)에서 가져와라.
의미 있는 맥락을 추가하라
- 스스로 의미가 분명한 이름이 없지 않다. 그래서 클래스, 함수, 이름 공간에 넣어 맥락을 부여하고 모든 방법이 실패하면 마지막 수단으로 접두어를 붙여라.
- 함수를 작은 단위로 쪼개 맥락을 분명히 해라.
불필요한 맥락을 없애라
- 일반적으로 짧은 이름이 긴 이름보다 좋지만 의미가 분명한 경우에 한해서다. 이름에 불필요한 맥락을 추가하지 않도록 주의하라.
728x90
728x90
'Book' 카테고리의 다른 글
[만들면서 배우는 클린 아키텍처] 2. 의존성 역전하기 (2) | 2022.01.23 |
---|---|
[만들면서 배우는 클린 아키텍처] 1. 계층형 아키텍처의 문제는 무엇일까? (2) | 2022.01.22 |
[클린코드] 1장. 깨끗한 코드 (0) | 2021.10.04 |
[SQL 첫걸음] 1장. 데이터베이스와 SQL (0) | 2021.09.22 |
[함께 자라기] 3장. 애자일 (0) | 2020.10.01 |