티스토리 뷰

책/Clean Code

2장 의미 있는 이름

0307kjb 2021. 11. 28. 12:58

이름은 추상적이나 구체적으로 상상하게 만들고 정형화되게 생각을 묘연하게 만드는 특징이 있다.

코드에서의 이름짓기는 나 뿐만 아니라 모든 사람들에게 쉽게 이해하도록 하는 것이 목표다.

 

클린 코드 저자는 이름을 잘 짓는 간단한 규칙을 설명한다.

 

 

 

****

 

 

 

1) 의도를 분명히 밝혀라

 

코드의 함축성

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

 복잡한 문장은 없지만 맥락 자체가 명시적으로 들어나지 않는다.

theList, list1, x, x[0] == 4의 의미의 정보를 모른다.

 

하지만 지뢰찾기 게임을 만든다는 정보를 제공한다면,

theList => 게임판, 4의 의미는 깃발이 꽂힌 상태라고 가정한다.

 

//int[]를 칸을 나누는 간단한 클래스 Cell을 만듬.

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

 

이름만 고쳐도 함수가 하는 일이 쉬워지는 것을 바로 알 수 있다!!

 

 

 

****

 

 

 

2) 그릇된 정보를 피해라

 

1. 나름대로 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용하면 안된다.

(hp(유닉스 플랫폼), aix ,sco) <= 빗변 hypotenuse

2. 여러 계정을 그룹으로 묶을 때 실제 List가 아니라면 accountList라 명명하지 않는다.

프로그래머에게 List는 특수한 의미이기에 실제 List가 아니라면 프로그래머에게 그릇된 정보를 제공하기 때문.

3. 서로 흡사한 이름을 사용하지 않도록 주의한다.

네이밍부터 숫자 0과 영어 O 같이 비슷해 보이는 것들을 말한다.

 

 

 

****

 

 

 

3) 의미 있게 구분하라

 

연속된 숫자를 덧붙이거나 불용어를 추가하는 방식, 동일 구역에서 다른 두 개념을 같은 이름으로 사용하지 못하여 철자만 살짝 바꾸는 행위는 저자 의도가 들어나지 않는다.

 

public void copyChars(char[] a1, char[] a2){
	......
}

이거 보다는 밑에 코드가 가독성이 쉽다.

public void copyChars(char[] source, char[] destination){
	......
}

접두어를 사용하지 말라는 것이 아닌 어떤 x라는 이름의 변수를 사용하고 있는데도 theX라는 변수를 만들면 안된다는 의미다.

불용어는 중복이다. 예를 들어 보면 변수 이름에 variable쓰는게 맞는가?, 표 이름에 table이란 단어를 넣는게 맞는가?,

name vs nameString의 차이가 뭔가. 사실 보면 차이를 알 수 없는 것이 당연하다.

결국 읽는 사람이 차이를 알도록 이름을 짓는 것이 좋다라는 결론.

 

 

****

 

 

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

 

Date genymdhms vs Date generationTimsetamp

 

좌측 이름은 발음하기 어려워 대화도 힘들어진다. 우측에 있는 이름은 쉽게 부를 수 있으니 서로간의 의사소통이 원활하게 된다.

 

 

 

****

 

 

 

5) 검색하기 쉬운 이름을 사용하라(+ 기발한 이름을 피해라)

 

상수의 이름을 명확하게 하는 것이 포인트.

const int a = 5 VS  const int WORK_DAYS_WEEL = 5

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

즉 상수는 전범위니 길게하고 로컬 변수는 함수 내에서만 존재하니 짧게 하라는 의미)

 

 

 

****

 

 

 

6) 한 개념에 한 단어를 사용해라

 

사람들은 이름이 다르면 클래스나 타입이 다르다고 생각한다. 이러한 당연한 점을 파악해야 한다.

Controller, Manager, Service, Driver를 섞어 쓰면 헷갈리지만,

ProtocolController, DeviceManager 등의 이름을 가지게 된다면 개념이 구분되며 코드의 이해률이 높아진다.

 

 

 

****

 

 

 

7) 기타

 

인코딩 : 굳이 접두어 m_desc같은 변수 이름을 지정할 필요 없다.

 

클래스 : 명사나 명사구로 이름을 지정.

 

메서드 : 동사나 동사구, 자바빈 표준에 따라 get, set, is를 앞에 붙임.

여기서 중요한 것은 생성자를 중복 정의할 때 정적 팩토리 메서드를 사용한다는 것.

Complex fulcrumPoint = new Complex(23.0);

보다는,

Complex fulcrumPoint = Complex.FromRealNumber(23.0);

과같이 정적 메서드에서 인수의 이름을 사용해 명확히 표현하는 것이 좋다.

 

말장난 하지마라(단순히 두개를 더하는 add함수에 추가적인 작업을 한다면 문제)

해법이나 문제 영역에서 가져온 이름을 사용하라(디자인패턴이나 아키텍쳐 이름을 따오자)

의미있는 맥락을 추가하라(접두어 추가-> 함수 -> 클래스 순으로 확실하게 의미를 부여하자 <= 구성을 달리)

불필요한 맥락을 삭제하라

Address 라는 클래스가 있고 선언 시 accountAddress, customerAddress는 클래스 인스턴스 이름으로서 좋지 않다.

포트나 웹주소, 맥주소 같이 구분한다면 의미가 분명해진다.

' > Clean Code' 카테고리의 다른 글

10장 클래스  (0) 2022.04.09
9장 단위 테스트  (0) 2022.04.06
8장 경계  (0) 2022.04.04
6장 객체와 자료구조  (0) 2022.03.29
3장 함수  (0) 2021.12.02
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함