본문 바로가기

클린코드

[클린코드 독서] 2장 - 의미 있는 이름

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로 시작하게 짓는것은 바보같은짓임. 쓸데없는 맥락!
    • 의미가 분명할때는 맥락을 추가하지 말기