# 의미 있는 이름

## 의도를 분명히 하라

변수나 함수 그래고 클래스 이름은 다음과 같은 굵직한 질문에 모두 답해야 한다.

> 변수(혹은 함수나 클랫그)의 존재 이유는?\
> 수행기능은?\
> 사용방법은?\
> 따로 주석이 필요하다면 의도를 분명히 드러내지 못했다는 말이다.

***

## 그릇된 정보를 피하라

그릇된 단서는 코드의 의미를 흐린다.\
나름대로 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용해도 안된다.

> `List`라는 단어는 프로그래머에게는 특수한 의미이다.

실제 List가 아니라면, `accountList`라 명명하지 않아야 한다. 실제 List가 아니라면 프로그래머에게 그릇된 정보를 제공하는 셈이다.

***

## 의미 있게 구분하라

명확한 관례가 없다면 `moneyAmount`는 `money`와 구분이 안된다.

`customerInfo`는 `customer`\
`accountData`는 `account`\
`theMesage`는 `message`와 구분이 안된다.

> 읽는 사람이 차이를 알도록 이름을 지어라.\
> 불용어[1](#footnote_1)를 추가한 이름은 아무런 도움이 되지 않는다.

불용어: 불용어란 앞서 말한 a 와 the 같이 자주 등장하지만 중요한 의미를 가지고 있지 않은 단어들을 말함. (큰 의미가 없는 단어)

***

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

말을 처리하려고 발달한 두뇌를 활용하지 않는다면 안타까운 손해다.\
그러므로 발음하기 쉬운 이름을 선택한다.\
발음하기 어려운 이름은 토론하기도 어렵다.

***

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

문자 하나를 사용하는 이름과 상수는 텍스트코드에서 쉽게 눈에 띄지 않는다는 문제점이 있다.

```
숫자와 문자`e`라는 문자도 변수 이름으로 적합하지 않다.
검색이 어려운 탓이다.
`e`는 영어에서 가장 많이 쓰이는 문자다.
긴 이름이 짧은 이름보다 좋다.
검색하기 쉬운 이름이 상수보다 좋다.
```

> 저자는 간단한 메서드에서 로컬 변수만 한 문자를 사용한다.\
> 이름 길이는 범위 크기에 비례해야 한다.

```javascript
for (const j = 0; j < 34; j++) {
  s += (t[k]*4)/5;
}


const realDaysPerIdealDay = 4;
const WORK_DAYS_PER_WEEK = 5;
let sum = 0;
for (j = 0; j < NUMBER_OF_TASKS; j++){
  realTaskDays = taskEstimate[j] * realDaysPerIdealDay;
  realTaskWeeks = (realTaskDayas/ WORK_DAYS_PER_WEEK);
  sum += realTaskWEeeks;
}
```

***

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

문자 하나만 사용하는 변수 이름은 문제가 있다.\
루프에서 반복횟수를 세는 변수 `i, j, k`는 괜찮다. `l은 절대 안된다.`

> 명료함이 최고\
> 자신의 능력을 좋은 방향으로 사용해 남들이 이해하는 코드를 내놓는다.

***

## 클래스 이름

클래스 이름과 객체 이름은 명사나 명사구가 적합하다.

> 동사는 사용하지 않는다.

```
서적에서 제시한 `Customer, WikiPage, Account, AddressParser`등이 좋은 예이고, `Manager, Procesor, Data, Info`등이 좋지 않다고 하였다.

둘다 명사인데 왜 좋은예와 안좋은 예로 하는지 고민해보았는데, 의미가 좀더 좁혀져 있는 명사를 사용하라는 것 같다.
```

## 메서드 이름

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

> postPayment, deletePayment, save 등이 좋은 예다.

접근자(Accessor), 변경자(Mutator), 조건자(Predicate)는 javabean 표준에 따라 값 앞에 `get`, `set`, `is`를 붙인다.

```javascript
const name = employee.getName();
customer.setName('mike');
```

[자바 명명규칙](https://tecoble.techcourse.co.kr/post/2020-04-26-Method-Naming/)

***

## 기발한 이름은 피하라

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

***

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

추상적인 개념 하나에 단어 하나를 선택해 이를 고수한다.\
예를 들어, 똑같은 메서드를 클래스마다 `fetch, retrieve, get`으로 제각각 부르면 혼란스럽다.

> 일관성 있는 어휘는 코드를 사용할 프로그래머가 반갑게 여길 선물이다.

***

## 말장난을 하지 마라

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

"한 개념에 한 단어를 사용하라"는 규칙을 따랐더니, 예를 들어, 여러 클래스에 `add`라는 메서드가 생겼다. 모든 `add`메서드의 매개변수와 반환값이 의미적으로 똑같다면 문제가 없다.

하지만 같은 맥락이 아닌데도 `일관성`을 고려해 `add`라는 단어를 선택한다.

> 프로그래머는 코드를 최대한 이해하기 쉽게 짜야 한다.\
> 집중적인 탐구가 필요한 코드가 아니라 대충 훑어봐도 이해할 코드 작성이 목표다.\
> 의미를 해독할 책임이 독자에게 있는 논문 모델이 아니라 의도를 밝힐 책임이 저자에게 있는 잡지모델을 생각하면 된다.

***

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

전산 용어, 알고리즘 이름, 패턴 이름, 수학 용어 등을 사용해도 괜챃다.\


> 모든 이름을 문제 영역(domain)에서 가져오는 정책은 현명하지 못하다.

***

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

적절한 `프로그래머 용어`가 아니면 문제 영역에서 이름을 가져온다. 그러면 코드를 보수하는 프로그래머가 분야 전문가에게 의미를 물어 파악할 수 있다.

***

## 의미 있는 맥락을 추가하라

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


```javascript
// 주소와 관련된 변수

// AS-IS
firstName
lastName
street
houseNumber
city
state
zipcode
```

`addr`라는 접두어를 추가하면 맥락이 좀 더 분명해진다.

```javascript
addrFirstName
addrLastName
addrStreet
addrHouseNumber
addrCity
addrState
addrZipcode
```

`Address` 클래스를 생성해도 좋다.

***

## 불필요한 맥락을 없애라

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