[2장] 의미 있는 이름

2장에서는 이름을 잘 짓는 간단한 규칙 몇가지를 소개한다.

의도를 분명히 밝힐 것

의도가 드러나는 이름을 사용하면 코드 이해와 변경이 쉬워진다. 아래 예시를 보자

나쁜 예시

public List<int[]> getThem(){
  List<int[]> list1 = new ArrayList<int[]>();
  for (int[] x : theList)
    if(x[0]==4)
      list1.add(x)
  return list1;
}

코드가 무슨 일을 하는지 알기 어렵다. 문장 자체는 쉽지만 코드 맥락이 명시적으로 드러나지 않는다.

  1. theList에 무엇이 들어가는가?
  2. theList에서 0번째는?
  3. 값 4의 의미는?
  4. 함수가 반환하는 리스트 list1을 어떻게 사용하는가?

좋은 예시

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

이름으로 변수가 무엇인지 명시해줌으로써 정보제공이 가능하고 함수가 하는 일을 이해하기 쉬워졌다.


그릇된 정보를 피해라

  • 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용X
  • 여러 계정을 그룹으로 묶을 때 실제 List가 아니라면 accountList와 같이 명명하지 않는다.
  • 서로 흡사한 이름을 사용하지 않도록 주의한다.
  • 유사한 개념은 유사한 표기법을 사용한다.
  • 소문자 L과 숫자 1, 대문자 O과 숫자 0은 혼동하기 쉬우니 주의한다.


의미 있게 구분하라

  • 동일한 범위 안에서 다른 두 개념에 같은 이름을 사용하지 못한다고 철자를 바꾸지 말자
  • 읽는 사람이 차이를 알도록 이름을 지어라
    • 구분이 안되는 예시) getActiveAccount(); getActiveAccounts(); getActiveAccountInfo();


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

나쁜 예시

class DtaRcrd102 {
  private Date genymdhms;
  private Date modymdhms;
  private final String pszqint = "102";
  /* ... */
  };

좋은 예시

class Customer {
  private Date generationTimeStamp;
  private Date modificationTimeStamp;
  private final String rdcordId = "102";
  };


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

  • 문자 하나를 사용하는 이름과 상수는 텍스트 코드에서 쉽게 눈에 띄지 않는다.
    • 상수 7 -> MAX_CLASSES_PER_STUDENT 이런식으로 검색하기 쉽게 사용


인코딩을 피하라

  • 헝가리식 표기법 자바는 할 필요가 없다. (타입을 변수 이름에 쓰는 방식)

나쁜 예시

PhoneNumber phoneString; // 타입이 바뀌어도 이름은 바뀌지 않는다.
  • 멤버 변수에 m_ 이라는 접두어 붙일 필요가 없다 -> IDE 발전
  • 인터페이스 클래스와 구현 클래스의 관계라면 클래스 사용자가 쉽게 접근할 수 있는 이름으로 하자


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

  • 자신이 아는 이름으로 변환하지 말고 일반적으로 사용하는 명료한 단어를 선택하자


클래스 이름

  • 명사나 명사구가 적합
  • Customer, WikiPage, Account, AddressParser 적합
  • Manager, Processor, Data, Info 등은 피하자
  • 동사 사용하지 않는다.


메서드 이름

  • 동사나 동사구 적합
  • postPayment, deletePage, save 등 적합
  • 접근자 변경자 조건자에 따라 get , set, is 사용


기발한 이름은 피하라

  • 특정 문화해서만 사용하는 농담은 피하고 의도를 분명하게 표현하라


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

  • 같은 메서드 클래스마다 일관성 있게 단어를 사용하자
    • controller, manager, driver 섞어 쓰면 혼란스럽다.


말장난을 하지마라

  • 한 단어를 두 가지 목적으로 사용하지 말 것
    • add 메서드에는 매개변수와 반환값이 의미적으로 같아야한다. 다르다면 insert 같은 새로운 이름이 적당하다.


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

  • 코드를 읽는 사람도 프로그래머이므로 전산 용어, 알고리즘 이름 등의 용어를 사용해도 괜찮다.
  • 기술 개념에는 기술이름이 가장 적합하다.


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

  • 적절한 프로그래밍 용어가 없다면 해당 문제 영역에서 이름을 가져와야한다.


의미있는 맥락을 추가하라

  • 클래스, 함수, 이름 공간에 맥락을 넣어라
  • 모든 방법이 실패하면 접두어를 붙여라
    • 예시) firstName -> addrFistName 주소의 일부라는 사실을 보여줌


불필요한 맥락을 없애라

  • 의미가 분명한 경우에 한해 이름에 불필요한 맥락을 추가하지 않도록 한다.
    • 예시) 클래스 이름: GSD , 메서드: GSDAccountAddress (x)
    • 클래스 이름: GSD , 메서드: GSDAccountAddress (o)

Reference

  • 클린코드 , 로버트C. 마틴

Leave a comment