2장 - 의미 있는 이름을 짓자
소프트웨어에서 이름은 어디나 쓰인다. 변수, 함수, 인수와 클래스, 패키지에도 이름을 붙인다. 이런 이름을 잘 지으면 여러모로 편하다. 그래서 이 장에서는 이름을 잘 짓는 규칙을 소개한다.
1. 의도를 분명히 밝혀라
- 이름을 지을때 생각해야 하는 부분들
- 변수의 존재 이유는?
- 수행 기능은?
- 사용 방법은?
- 이것을 생각하고 이름을 짓는다면 주석이 필요하지 않다.
- 예시
/*BAD*/
public List<int[]> getThem() { //무엇을 get하는 함수인지 알수없음
List<int[]> list1 = new ArrayList<int[]>();
for (int[] x : theList) //theList가 무엇을 담는지 알수없음
if (x[0] == 4)
list1.add(x);
return list1;
}
/*GOOD*/
public List<int[]> getFlaggedCells() { //깃발이 꽂힌 cell을 가져온다는 것을 알게됨
List<int[]> flaggedCells = new ArrayList<int[]>();
for (int[] cell : gameBoard) //theList도 gameboard라고 명명
if (cell[STATUS_VALUE] == FLAGGED) //0과4에 이름을 붙이니 이해하기 쉬워짐
flaggedCells.add(cell);
return flaggedCells;
}
/*BEST*/
public List<Cell> getFlaggedCells() { //int배열 대신 Cell이라는 클래스로 변경
List<Cell> flaggedCells = new ArrayList<Cell>();
for (Cell cell : gameBoard)
if (cell.isFlagged())
flaggedCells.add(cell);
return flaggedCells;
}
2. 그릇된 정보를 피하라
- 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용하지 말것
- 서로 다른 모듈에게 흡사한 이름을 사용하지 않기
- 유사한 개념의 경우엔 유사하게 표기하기
- 소문자 L하고 대문자 O 쓰지말기 (1과 0처럼 보임)
3. 의미 있게 구분하라
- 컴파일만 되게 하려고 코드를 이상하게 구현하지 말기 (내가 하는짓...ㅎ)
- 불용어를 추가하지 말것(내용을 분석하는데 큰 의미가 없는 단어)
- 예시 - Product / ProductInfo / ProductData 로 3개의 클래스를 생성하는경우
- 솔직히 셋이 뭐가 다른지 알 수 없음
- 불용어 = 중복
4. 발음하기 쉬운 이름을 사용하라
- 막 이상한 줄임말해서 말하기 어렵게 하지말기
- 회사에서는 변수이름을 말하면서 회의도 할텐데 이름이 어려우면 어이없어짐
- ex - genymdhms (generate year month day hour minute second)
5. 검색하기 쉬운 이름을 사용하라
- e라는 변수명은 모든 파일이름이나 수식이 다 검색되므로 해당 값을 찾기 어려움 (막 establish.js이런것도 다 검색될거임)
- 검색을 해야하는 경우, 긴 이름이 훨씬 좋음
- 이름길이는 범위 크기에 비례해야함
- 간단한 메서드의 로컬변수 정도는 한문자를 사용
- 코드 여러곳에서 사용한다면 검색 쉽게 ex) WORK_DAYS_PER_WEEK
6. 인코딩을 피하라 (어차피 이젠 IDE가 좋아서 다 표시해줌)
- 인코딩 종류에는 여러가지가 있는데 이와같음
- 헝가리안 표기법 (어떤 타입인지 적어놓는거임 nphone (int phone))
- 멤버 변수 접두어 (m_dsc)
- 인터페이스 클래스, 구현클래스로 나누어서 만들었을때는 이왕이면 구현클래스를 인코딩하기 (인터페이스는 ShapeFactory, 구현은 CShapeFactory 이런식으로)
7. 기억력을 자랑하지 마라
- 클래스 이름 / 객체이름
- 명사 / 명사구
- Customer, Account (good)
- Manager, Processor, Data, Info 단어 피하기 (bad)
- 동사 사용 금지
- 메서드 이름
- 동사 / 동사구
- postPayment
- 접근자, 변경자, 조건자같은 경우는 get,set,is등을 붙임
- customer.setName("mike");
- 생성자 중복정의시에는 정적 팩토리 메서드 사용하기
- 생성자 사용 제한위해선 private로 선언하기
//정적 팩토리 메서드
/*BAD*/
Complex fulcrumPoint = new Complex(23.0);
/*GOOD*/
Complex fulcrumPoint = Complex.FromRealNumber(23.0);
8. 기발한 이름 피하기
- 쓸데없이 kill() 대신에 kkang()쓰지말기
9. 이름을 통일하자
- 한개념에 한 단어 사용하기
- 같은 메소드를 클래스마다 fetch, get등등으로 다르게 부르면 혼란스러움. 통일하기!
- controller, manager, driver 로 다르게 부르면 헷갈림 역시 통일!
- 말장난 하지 말기
- 같은 맥락이 아닌데 한개념에 한단어 적용을 한답시고 같게 짓지 말기
- 기존값에 두개를 더하거나 이어서 새로운값을 만드는 함수들을 다 add method로 칭했음
- 통일성을 위해서 집합에 값 하나를 추가하는 메서드도 add라고 칭해야할까? ->NO
- 이럴 경우엔 insert, append등의 이름을 붙이기
10. 해법 영역, 문제영역에서 적절히 가져오기
- 대부분의 경우 해법 영역에서 가져오기
- 문제영역, 도메인에서 가져올 필요가 없다는거 (customer 영역)
- 잘 모르는 분야의 이름을 쓰지말고 그냥 프로그래머들이 잘 아는 기술 이름으로 지어주기
- 문제영역에서 가져온 이름 사용하기?
- 적절한 프로그래머 용어가 없을시에!!! 문제영역에서 가져오기.
11. 맥락을 추가하자
- 의미있는 맥락 추가하기
- 주소를 구성하는 변수로 firstName, lastName, street ... city, state등이 있다고 치자
- 훑어보면 주소를 구성한다는 것을 알지만
- 실제로 사용할때 state라는 한 변수만 가져와서 사용한다면, 이게 주소 중 한 부분인지 알기 어렵다.
- 이럴경우, Address라는 클래스를 생성해서 그 안에 해당 변수들을 넣어놓는식으로, 맥락을 주기
- 불필요한 맥락 없애기
- 쓸데없이 모든곳에 맥락 붙이지 말기
- 고급 휘발유 충전소 어플리케이션을 짠다고 하자. (Gas Station Delux)
- 모든 클래스 이름을 GSD로 시작하게 짓는것은 바보같은짓임. 쓸데없는 맥락!
- 의미가 분명할때는 맥락을 추가하지 말기
'클린코드' 카테고리의 다른 글
[클린코드 독서] 5장 - 형식 맞추기 (0) | 2022.03.09 |
---|---|
[클린코드 독서] 6장 - 객체와 자료구조 (0) | 2022.02.20 |
[클린코드 독서] 4장 - 주석 (0) | 2022.02.06 |
[클린코드 독서] 3장 - 함수 (0) | 2022.01.30 |
[클린코드 독서] 1장 - 깨끗한 코드 (0) | 2022.01.23 |