Skip to content

Latest commit

 

History

History
217 lines (144 loc) · 6.1 KB

File metadata and controls

217 lines (144 loc) · 6.1 KB

2장. 의미 있는 이름

프로그래머가 가장 힘들어하는 일 중 1순위가 '이름 짓기'일 정도로 가장 중요한 부분이다.
따라서 2장은 주의깊게 읽을 필요가 있다.
좋은 코드는 이해하기 편하고 누구나 쉽게 읽힐 수 있어야 하며 이를 만족하기 위해서는 이름을 잘 짓는 것이 중요하다.
이름을 짓는 부분이 가장 힘들고 어려울 수 있지만 더 나은 프로그램을 위해서 이름 짓기는 명심해야 할 부분이다.


1️⃣ 의도를 분명히 밝혀라

  • 좋은 이름을 지으려면 시간이 걸리지만 좋은 이름으로 절약하는 시간이 훨씬 많다.
  • 변수나 함수, 클래스 이름을 정할 때 필요한 질문
    • 변수(혹은 함수나 클래스)의 존재 이유는?
    • 수행 기능은?
    • 사용 방법은?
  • 따로 주석이 필요하다면 이름에 의도를 분명히 드러내지 못한 것
Bad

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;
}

Good

int elapsedTimeInDays;
int daysSinceCreation;

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

2️⃣ 그릇된 정보를 피하라

  • 그릇된 단서는 코드의 의미를 흐린다.
  • 의미가 다양하게 해석되는 중의적인 단어는 적합하지 않다.
    • accountList (X) → accountGroup, bunchOfAccount, Accounts(O)
  • 서로 흡사한 이름을 사용하지 않도록 주의한다.
  • 이름 쓰는 것을 조심한다.
    • 소문자 L이나 대문자 O 변수 주의, 1과 0 과 비슷

3️⃣ 의미있게 구분하라

  • 연속된 숫자를 덧붙이거나 불용어(noise word)를 추가하는 방식은 적절하지 않다.
    → 아무런 정보를 제겅하지 못하는 이름. 저자의 의도가 전혀 드러나지 않음
  • 불용어 : 인터넷 검색 시 검색 용어로 사용하지 않는 단어.
    텍스트에서 큰 의미가 없는 단어들
    ex) the, a, is, i 등 문장 구성 시 의미적으로 크게 중요하지 않는 단어 제거

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

  • 발음하기 어려운 이름은 토론하기도 어렵다. → 프로그래밍은 사회 활동
Bad
class DtaRcrd102 {
    private Date genymdhms;
    ...
};

Good
class Customer {
    private Date generationTimestamp;
    ...
};

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

  • 문자 하나를 사용하는 이름과 상수의 문제점
    : 텍스트 코드에서 쉽게 눈에 띄지 않음
  • 긴 이름이 짧은 이름보다 좋다. 검색하기 쉬운 이름이 상수보다 좋다.
  • 이름 길이는 범위 크기에 비례해야 한다.

6️⃣ 인코딩을 피하라

헝가리식 표기법

변수 이름에 타입을 인코딩할 필요가 없다.

멤버 변수 접두어

멤버 변수에 m_ 같은 접두어를 붙이지 않는다.

인터페이스 클래스와 구현 클래스

인터페이스 클래스 이름과 구현 클래스 이름 중 하나를 인코딩해야 한다면 쿠현 클래스 이름을 택한다.


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

  • 독자가 코드를 읽으면서 변수 이름을 자신이 아는 이름으로 변환해야 하는 변수는 바람직하지 못하다.
  • 문자 하나만 사용하는 변수 이름은 문제가 있다.
    • 루프에서 반복 횟수를 세는 변수 i,j,k는 괜찮다.
      →범위가 작고 다른 이름과 충돌하지 않는다는 전제
  • 명료함이 최고다. → 남들이 이해하는 코드

8️⃣ 클래스 이름

  • 클래스 이름과 객체 이름은 명사나 명사구가 적합하다.
    → Customer, WikiPage, Account, AddressParser 등
  • 적합하지 않은 이름 →Manager, Processor, Data, Info 등
  • 동사는 사용하지 않는다.

9️⃣ 메서드 이름

  • 메서드 이름은 동사나 동사구가 적합하다.
    → postPayment, deletePage, save 등
  • 접근자, 변경자, 조건자는 앞에 get, set, is를 붙인다.
  • 생성자를 중복정의할 때
    → 정적 팩토리 메서드를 사용한다.
    → 메서드는 인수를 설명하는 이름을 사용한다.
    → 생성자 사용을 제한하려면 생성자를 private로 선언한다.

1️⃣0️⃣ 기발한 이름은 피하라

  • 재미난 이름보다 명료한 이름을 선택한다.
  • 특정 문화에서만 사용하는 농담은 피하는 편이 좋다.

1️⃣1️⃣ 한 개념에 한 단어를 사용하라

  • 추상적인 개념 하나에 단어 하나를 선택한다.

1️⃣2️⃣ 말장난을 하지 마라

  • 한 단어를 두 가지 목적으로 사용하지 않는다.
    • 기존 add 메서드 → insert나 append 라는 새 메서드

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

  • 전산 용어, 알고리즘 이름, 패턴 이름, 수학 용어 등을 사용해도 괜찮다.
    • JobQueue, AccountVisitor

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

  • 적절한 프로그래머 용어가 없다면 문제 영역에서 이름을 가져온다.

1️⃣5️⃣ 의미 있는 맥락을 추가하라

  • 클래스, 함수, 이름 공간에 넣어 맥락을 부여한다.
firstName, lastName, street, houseNumber, city, state, zipcode

>> 접두어 추가하면 맥락이   분명해짐

addrfirstName, addrlastName, addrState


>> Address 라는 클래스를 생성하면  좋음

public class Address {
	private String firstName,
	private String lastName,
	...
}
  • 맥락을 개선하면 함수를 쪼개기 쉬워지며 알고리즘도 좀 더 명확해진다.

1️⃣6️⃣ 불필요한 맥락을 없애라

  • 이름에 불필요한 맥락을 추가하지 않도록 주의한다.