본문 바로가기

책/클린코드

클린코드 02장 의미있는 이름

2. 의미있는 이름

의도를 분명히 밝혀라

나쁜 코드의 예시

public List<int[]> getThem(){
	List<int[]> list1 = new ArrayList<int[]>();
    for(int[] x : theList)
    	if(x[0] == 4)
	    	list1.add(x);
    return list1;
}

- 코드 맥락이 코드 자체에 명시적으로 드러나지 않음

1.  the List에 무엇이 들었는지

2.  theList[0] 값이 어째서 중요한지?

3. 값 4는 어떤 의미인지?

4. 함수가 반환하는 list1을 어떻게 사용하는지

 

 

정보제공을 충분히 고려한 코드의 예시

public List<int[]> getFlaggedCells(){
	List<int[]> flaggedCells = new ArrayList<int[]>();
    for(int[] cell : gameBoard)
    	if(cell[STATUS_VALUE] == FLAGGED)
	    	flaggedCells.add(x);
    return flaggedCells;
}

각 개념에 이름만 붙여도 코드가 상당히 나아진다.

 

 

int 배열을 사용하는 대신, 칸을 간단한 클래스로 만든 코드의 예시

public List<Cell> getFlaggedCells(){
	List<Cell> flaggedCells = new ArrayList<Cell>();
    for(Cell cell : gameBoard)
		if(cell.isFlagged())
        	flaggedCells.add(cell);
    return flaggedCells;
}

 

 

그릇된 정보를 피해라

ex. 빗변(hypotenuse) 을 hp로 표현

 

실제 컨테이너가 List가 아니면 accountList 라고 명명하지 않는다.

- 대체 : accountGroup, bunchOfAccounts, Account

- 실제 컨테이너가 List라고 할지언정, 컨테이너 유형을 이름에 넣지 않는 것이 바람직하다.

 

흡사한 이름을 사용하지 않는다. 내가 제일 못하는 것

- XYZControllerForEfficientHandlingOfStrings

- XYZControllerFOrEfficientStorageOfStrings

 

유사한 개념은 유사한 표기법을 사용한다.

 

소문자 L, 대문자 O는 변수명으로 절대 사용하지 않는다.

 

의미 있게 구분하라

의미없이 연속된 숫자를 덧붙이거나 noise word를 추가한 경우

- copyChar(char a1[], char a2[])  대신  source, destination

- 불용어를 추가한 경우

       Product 클래스의 상대로 ProductInfo 혹은 ProductData 

 

NameString이 Name보다 나은게 뭔데?

Customer와  CustomerObject의 차이가 뭔데?

읽는 사람이 차이를 알도록 이름을 지어라.

 

발음하기 쉬운 이름을 사용하라

private Date genymdhms;    //젠 야 무다 힘즈

private Date generationTimestamp;

 

검색하기 쉬운 이름을 사용하라

숫자 7 대신 MAX_CLASSES_PER_STUDENT

긴 이름이 짧은 이름보다 좋다(검색하기 쉽기 때문)

이름 길이는 범위 크기에 비례해야 한다.

 

인코딩을 피하라

헝가리식 표기법 구닥다리..?

m_의 접두어 필요 없을정도로 클래스와 함수는 작아야 함..?

- 해당 부분은 동의하지 않아서 옮겨적지 않기로 했다.

 

자신의 기억력을 자랑하지 마라

변수이름을 자신이 아는 이름으로 변환해야 한다면, 그 이름은 바람직하지 못하다.

꼬마 루프에서의 i, j, k (l은 never) 제외하고는 적절하지 못하다.

클래스 이름은 명사나 명사구가 적합하다

Customer, WikiPage, Account, AddressParser (O)

Manager, Processor, Data, Info(X)

동사 (X)

 

메서드 이름은 동사나 동사구가 적합하다

postPayment, deletePage, save (O)

접근자 - get

변경자 - set

조건자 - is

 

생성자를 overload 할 때는 정적팩토리메서드를 사용한다.

//정적 팩토리 메소드 이용한 더 좋은 코드
Complex fulcrumPoint = Complex.FromRealNumber(23.0);

//걍 코드
Complex fulcrumPoint = new Complex(23.0);

 

기발한 이름은 피하라

GoodThinkMode (X)
BattleField_LOLMode (O)

 

한 개념에 한 단어를 사용하라

똑같은 메소드면 이름 통일

controller, Manager, Drive 섞어쓰지 않기

fetch, retrieve, get 섞어쓰지 않기

 

말장난을 하지 마라

다른 개념에 같은 단어를 사용하지 마라

add, insert, append 

 

해법 영역에서 가져온 이름을 사용하라

코드를 읽을 사람도 프로그래머이므로 전산용어, 알고리즘이름, 패턴이름, 수학용어를 사용해도 좋다.

 

문제영역에서 가져온 이름을 사용하라

'적당한 프로그래밍 용어가 없을 시'

혹은 문제영역과 관련이 깊은 코드일 때

 

의미 있는 맥락을 추가하라

클래스, 함수, 이름공간에 넣어 맥락을 부여한다. 모든 방법이 실패하면 접두어를 붙인다.

 

firstName, lastName, street, houseNumber, city, state, zipcode

 

주소를 나타내는 변수들이지만, 특정 메소드가 state라는 변수 하나만 사용했을 때는?

 

 

addrFirstName, addrLastName, addrState 는 맥락이 더 분명해진다.

 

불필요한 맥락을 없애라.