[clean code] 2. 의미 있는 이름

dev-log·2022년 1월 28일
0

cleancode

목록 보기
1/1

2장 이름을 잘 짓는 몇가지 규칙을 소개한다.

1. 의도를 분명히 밝혀라

  • 의도가 드러나는 이름을 사용하면 코드의 이해와 변경이 쉬워진다.
  • 변수나 함수 그리고 클래스 이름은 존재 이유,수행 기능,사용 방법에 대한 질문에 주석없이 답변해야 한다.

bad code

int d;

good code

int daysSinceCreation
int fileAgeInDays

bad code

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

good code

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

2. 그릇된 정보를 피하라

  • 나름대로 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용하면 안 된다.
  • 여러 계정을 그룹으로 묶을 때 실제 List가 아니라면, accountList라고 명명하지 않는다.
  • 서로 흡사한 이름을 사용하지 않도록 주의한다.
  • 유사한 개념은 유사한 표기법을 사용한다.
  • 소문자 l과 숫자 1, 대문자 O와 숫자 0은 혼동되니 주의한다.

3. 의미 있게 구분하라

  • 동일한 범위안에서는 다른 두 개념에 같은 이름을 사용하지 못한다.
  • 연속된 숫자를 덧붙이거나 불용어를 추가하는 방식은 사용하지 말자

bad code 연속된 숫자

public static void copyChars(char a1[], char a2[]) {
	for (int i = 0; i< a1.length; i++) {
    	a2[i] = a1[i]; 
    } 
}

good code 의미 있는 이름으로 변경

public static void copyChars(char source[], char destination[]) {
	for (int i = 0; i< source.length; i++) {
    	destination[i] = source[i]; 
   } 
}

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

bad code

class DtaRcrd102 { 
  private Date genymdhms; 
  private Date modymdhms; 
  private final 
  String pszqint = "102"; 
/* ... */ 
};

good code

class Customer { 
  private Date generationTimeStamp; 
  private Date modificationTimeStamp; 
  private final String rdcordId = "102"; 
};

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

  • 문자 하나를 사용하는 이름과 상수는 텍스트 코드에서 쉽게 눈에 띄지 않는다.
  • 이런 관점에서 긴 이름이 짧은 이름보다 좋다.
  • 검색하기 쉬운 이름이 상수보다 좋다.
    MAX_CLASSES_PER_STUDENT (o)
    7,e (x)

6. 인코딩을 피하라

  • 인코딩한 언어는 발음하기 어려우며 오타가 생기기도 쉽다.
  • 더이상 헝가리식 표기법은 사용하지 않는다.

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

  • 자신만 기억하는 이름이 아닌 명료한 단어를 선택하자

8. 클래스 이름

  • 클래스 이름/객체 이름은 명사명사구가 적합하다.
  • Customer,Wikipage,Account 등이 좋은 예다.
  • 동사는 사용하지 않는다.

9. 메서드 이름

  • 메서드 이름은 동사동사구가 적합하다.
  • postPayment, deletePage, save 등이 좋은 예다.
  • 접근자,변경자,조건자는 javabean 표준에 따라 값 앞에 get,set,is를 붙인다.
    생성자를 중복정의할 때는 정적 팩토리 메서드를 사용한다.
    good code
    Complex fulcrumPoint = Complex.FromRealNumber(23.0);
    bad code
    Complex fulcrumPoint = new Complex(23.0);
  • 생성자 사용을 제한하려면 해당 생성자를 private으로 선언한다.

10. 기발한 이름은 피하라

  • 특정 문화에서만 사용하는 농담은 피한다. 의도를 분명하고 솔직하게 표현하자

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

  • 추상적인 개념 하나에 한 단어 하는 선택해 이를 고수한다.
    - 똑같은 메서드를 클래스마다 fetch,retrieve,get으로 제각각 부르면 혼란스럽다.
  • 일관성 있게 단어를 사용하자

12.말 장난을 하지 마라

  • 한 단어를 두 가지 목적으로 사용하지 마라

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

  • 코드를 읽는 사람도 프로그래머이므로 전상 용어, 알고리즘 이름,패턴 이름 수학 용어 등을 사용해도 괜찮다.

  • JobQueue와 같이 기술 개념에는 기술 이름이 가장 적합한 선택이다.

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

  • 적절한 프로그래밍 용어가 없다면 문제 영역(도메인 관련 전문 이름)에서 이름을 가져온다.
  • 문제 영역 개념과 관련이 깊은 코드라면 문제 영역에서 이름을 가져와야 한다.

15. 의미 있는 맥락을 추가하라

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

16. 불필요한 맥락을 없애라

  • 일반적으로 짧은 이름이 긴 이름보다 좋다. 단, 의미가 분명한 경우에 한해서다. 이름에 불필요한 맥락을 추가하지 않도록 주의한다.

accountAddress와 customerAddress는 Address 클래스 인스턴스로는 좋은 이름이나 클래스 이름으로는 적합하지 못하다. Address는 클래스 이름으로 적합하다.
포트 주소, MAC 주소, 웹 주소를 구분해야 한다면 PostalAddress, MAC, URI라는 이름도 괜찮다.

reference

  • clean code
profile
배운 걸 기록하는 곳입니다.

0개의 댓글