[2장] 의미 있는 이름
2장에서는 이름을 잘 짓는 간단한 규칙 몇가지를 소개한다.
의도를 분명히 밝힐 것
의도가 드러나는 이름을 사용하면 코드 이해와 변경이 쉬워진다. 아래 예시를 보자
나쁜 예시
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;
}
이름으로 변수가 무엇인지 명시해줌으로써 정보제공이 가능하고 함수가 하는 일을 이해하기 쉬워졌다.
그릇된 정보를 피해라
- 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용X
- 여러 계정을 그룹으로 묶을 때 실제 List가 아니라면 accountList와 같이 명명하지 않는다.
- 서로 흡사한 이름을 사용하지 않도록 주의한다.
- 유사한 개념은 유사한 표기법을 사용한다.
- 소문자 L과 숫자 1, 대문자 O과 숫자 0은 혼동하기 쉬우니 주의한다.
의미 있게 구분하라
- 동일한 범위 안에서 다른 두 개념에 같은 이름을 사용하지 못한다고 철자를 바꾸지 말자
- 읽는 사람이 차이를 알도록 이름을 지어라
- 구분이 안되는 예시) getActiveAccount(); getActiveAccounts(); getActiveAccountInfo();
발음하기 쉬운 이름을 사용하라
나쁜 예시
class DtaRcrd102 {
private Date genymdhms;
private Date modymdhms;
private final String pszqint = "102";
/* ... */
};
좋은 예시
class Customer {
private Date generationTimeStamp;
private Date modificationTimeStamp;
private final String rdcordId = "102";
};
검색하기 쉬운 이름을 사용하라
- 문자 하나를 사용하는 이름과 상수는 텍스트 코드에서 쉽게 눈에 띄지 않는다.
- 상수 7 -> MAX_CLASSES_PER_STUDENT 이런식으로 검색하기 쉽게 사용
인코딩을 피하라
- 헝가리식 표기법 자바는 할 필요가 없다. (타입을 변수 이름에 쓰는 방식)
나쁜 예시
PhoneNumber phoneString; // 타입이 바뀌어도 이름은 바뀌지 않는다.
- 멤버 변수에 m_ 이라는 접두어 붙일 필요가 없다 -> IDE 발전
- 인터페이스 클래스와 구현 클래스의 관계라면 클래스 사용자가 쉽게 접근할 수 있는 이름으로 하자
자신의 기억력을 자랑하지 마라
- 자신이 아는 이름으로 변환하지 말고 일반적으로 사용하는 명료한 단어를 선택하자
클래스 이름
- 명사나 명사구가 적합
- Customer, WikiPage, Account, AddressParser 적합
- Manager, Processor, Data, Info 등은 피하자
- 동사 사용하지 않는다.
메서드 이름
- 동사나 동사구 적합
- postPayment, deletePage, save 등 적합
- 접근자 변경자 조건자에 따라 get , set, is 사용
기발한 이름은 피하라
- 특정 문화해서만 사용하는 농담은 피하고 의도를 분명하게 표현하라
한 개념에 한 단어를 사용하라
- 같은 메서드 클래스마다 일관성 있게 단어를 사용하자
- controller, manager, driver 섞어 쓰면 혼란스럽다.
말장난을 하지마라
- 한 단어를 두 가지 목적으로 사용하지 말 것
- add 메서드에는 매개변수와 반환값이 의미적으로 같아야한다. 다르다면 insert 같은 새로운 이름이 적당하다.
해법 영역에서 가져온 이름을 사용하라
- 코드를 읽는 사람도 프로그래머이므로 전산 용어, 알고리즘 이름 등의 용어를 사용해도 괜찮다.
- 기술 개념에는 기술이름이 가장 적합하다.
문제의 영역에서 가져온 이름을 사용하라
- 적절한 프로그래밍 용어가 없다면 해당 문제 영역에서 이름을 가져와야한다.
의미있는 맥락을 추가하라
- 클래스, 함수, 이름 공간에 맥락을 넣어라
- 모든 방법이 실패하면 접두어를 붙여라
- 예시) firstName -> addrFistName 주소의 일부라는 사실을 보여줌
불필요한 맥락을 없애라
- 의미가 분명한 경우에 한해 이름에 불필요한 맥락을 추가하지 않도록 한다.
- 예시) 클래스 이름: GSD , 메서드: GSDAccountAddress (x)
- 클래스 이름: GSD , 메서드: GSDAccountAddress (o)
Reference
- 클린코드 , 로버트C. 마틴
Leave a comment