의미 있는 이름 쓰는 법
의도를 분명히 밝혀라
- 변수, 함수, 클래스의 존재 이유나 수행 기능, 사용 방법이 주석 없이도 이해될 수 있게 작성되어야 한다.
- 네이밍을 너무 함축적으로 할 경우 코드 맥락이 코드 자체에 드러나지 않는다.
그릇된 정보를 피해라 / 의미 있게 구분하라
- 약어가 다른 의미로 혼동될 수 있을 경우 사용을 피한다. (ex. add -> address or addition, dir -> direction or directory)
- 자료구조 등과 같이 프로그래머에게 특수한 의미를 가진 단어를 사용할 때 주의한다. (ex.
accountList: HashMap<Account>
)
발음하기 쉬운 이름을 사용하라 / 검색하기 쉬운 이름을 사용하라
- genymdhms(generate year-month-day-hour-minute-seconds) vs. generationTimestamp
- 이름의 길이는 범위 크기에 비례해야 한다.
- 간단한 메서드 내에서 사용되는 로컬 변수의 경우 한 단어 정도로 짧을 수 있겠다.
- 코드 여러 곳에서 사용하는 변수나 상수는 검색하기 쉬우면서 정확한 의미를 표현해야 한다.
- 검색하기 쉽다 = 긴 이름이 구체적이고 프로젝트 코드 내 사용처가 특정적이다.
인코딩을 피하라
- IDE가 발전하여 이제 코드 컴파일 이전에도 타입 오류를 감지할 수 있고, 빠른 확인이 가능해졌다. 따라서 네이밍에 타입을 기억할 단서를 넣지 않아도 된다.
- (ex.
phoneString
) 변수, 함수, 클래스 이름이나 타입을 바꾸기 어려워질 뿐이다.
자신의 기억력을 자랑하지 마라
- 일반적으로 사용하는 용어, 문맥상 이해 가능한 단어를 사용하여 이름의 의미를 기억하지 않고도 직관적으로 이해할 수 있어야 한다.
한 개념에 한 단어를 사용하라 / 말장난을 하지 마라
- add와 append와 같이 공통 기능을 구분하라.
- 이미 사용한 단어를 혼란스럽게 두 가지 목적으로 사용하지 마라.
해법, 문제 영역에서 가져온 이름을 사용하라
- 문제 영역: domain → 도메인(비지니스 로직 등)의 개념과 관련이 깊은 코드라면 문제 영역에서 가져와 이름을 쓰는 것이 더욱 의미가 분명하다.
- 해법 영역: programming → 프로그래머로서 알 수 있는 전산, 알고리즘, 설계 패턴, 수학 등의 용어를 사용하면 코드를 일고 쓸 다른 프로그래머에게도 의미가 분명하다.
불필요한 맥락을 없애라
- 제외시켜도 이해에 전혀 문제가 없는 과다한 맥락과 의미의 단어는 제외시킨다. 그것이 더욱 가독성있게 만든다.
예제 연습해보기
public getThem(arr): any[] {
let list: Array<any> = [];
for (let x of arr) {
for (let y of x) {
if (y === 1) {
list.push(y);
}
}
}
return list;
}
public getFlaggedCells(board: Board): BoardCell[] {
let flaggedCells: Array<BoardCell> = [];
for (let row of board) {
for (let cell of row) {
if (cell.isFlagged()) {
flaggedCells.push(cell);
}
}
}
return flaggedCells;
}
출처
《클린 코드》, 22-38p