[Clean Code] 의미 있는 이름

2021. 4. 21. 00:32Clean Code

1. 이름

  • 변수, 함수
  • 인수, 클래스, 패키지
  • 소스 파일, 디렉터리
  • jar, war, ear 파일

 

 

 

2. 의미 있는 이름

1) 의도를 분명히

  • 존재 이유?
  • 수행 기능?
  • 사용 방법?

의도가 드러나는 이름을 사용하면 코드 이해와 변경이 쉬워진다. 지뢰찾기 게임 예제에서는 다음과 같은 문제가 발생한다.

public List<int[]> getThem() {
  List<int[]> list1 = new ArrayList<int[]>;
  for (int[] x: theList)
    if(x[0] == 4)
      list1.add(x);
  return list1;
}
  • theList에 무엇이 들어있나?
  • theList에서 0번째 값이 왜 중요한가?
  • 값 4는 무엇을 의미하는가?
  • 함수가 반환하는 리스트 list1을 어떻게 사용하는가?

 

이 예제를 수정한다면 다음과 같다.

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

2) 그릇된 정보 회피

  • 널리 알려진 단어를 다른 의미로 사용하면 안된다. (약어)
  • 잘못된 정보를 제공하지 말아야한다.
  • 서로 흡사한 이름을 사용하지 않도록 주의한다.

 

대표적인 예시들로는 다음과 같다.

  • 여러 계정을 그룹으로 묶을 때, 실제 List가 아님에도 accountList로 명명하는 경우
  • XYZControllerForEfficientHandlingOfStrings, XYZControllerForEfficientStorageOfStrings
  • 소문자 L, 대문자 O

3) 의미 있게 구분

의미 있게 구분하지 않은 대표적인 예시들은 다음과 같다.

  • class 변수가 있을 때 klass 변수를 사용하는 경우
  • 의도가 전혀 들어가지 않은, 연속적인 숫자를 덧붙인 이름 a1, a2, a3 ...을 사용하는 경우
  • 변수 이름을 variable, 표 이름을 table로 명명하는 경우
  • monyeAmount와 money, customerInfo와 customer, accountData와 account, theMessage와 message

4) 발음하기 쉬운 이름 사용

발음하기 어려운 이름을 사용하는 예시는 다음과 같다.

  • generate date, year, month, day, hour, minute, second를 의미하는 genymdhms

5) 검색하기 쉬운 이름 사용

문자 하나를 사용하는 이름(a)과 상수(7)는 텍스트 코드에서 쉽게 눈에 발견하지 못한다. 예를 들어 일주일에 일하는 날의 수가 5라고 한다면, 코드에서 5를 찾는 것보다 WORK_DAYS_PER_WEEK 이름으로 찾는 것이 훨씬 효율적이다.

6) 인코딩 회피

대부분의 사람들은 접두어를 무시하고 이름을 해독하는 방식을 재빨리 익힌다. 즉, 접두어는 관심 밖으로 밀려난다. 멤버 변수에 'm_' 접두어가 붙었던 옛날 방식은 더이상 사용하지 않고, 다른 색상으로 표시하거나 눈에 띄게 보여주는 IDE를 사용한다.

 

또한 인터페이스 이름은 접두어를 붙이지 않는 편이 좋다. 예를 들어 도형을 생성하는 인터페이스 클래스의 이름은 IShapeFactory가 아닌 ShapeFactoryImp으로 사용하는 것이 좋다.

7) 자신의 기억력 의심

독자가 코드를 읽으면서 변수 이름을 자신이 아는 이름으로 변환해야 한다면 그 변수 이름은 바람직하지 않다.  문제 영역이나 해법 영역에서 사용하지 않는 이름을 선택했기 때문이다. 대표적으로 반복문에서 변수 i, j, k의 사용은 괜찮지만 루프 범위가 아주 작고 다른 이름과 충돌하지 않을 때만 괜찮다. 즉, 남들이 이해하는 코드를 작성하는 것이 좋다.

8) 클래스 이름

클래스 이름과 객체 이름은 명사나 명사구(Customer, WikiPage, Account, AddressParser 등)가 적합하다. Manager, Processor, Data, Info와 같은 단어는 피하고 동사는 사용하지 않는 것이 좋다.

9) 메서드 이름

메서드 이름은 동사나 동사구(postPayment, deletePage, save 등)가 적합하다. 접근자, 변경자, 조건자는 javabean 표준에 따라 값 앞에 get, set, is를 붙인다. 생성자를 중복 정의할 때는 정적 팩토리 메서드를 사용한다.

// 나쁜 예
Complex fulcrumPoint = Complex.FromRealNumber(23.0)

// 좋은 예
Complex fulcrumPoint = new Complex(23.0);

10) 기발한 이름 회피

농담을 이용한 기발한 이름을 사용한 예시는 다음과 같다.

  • DeleteItems가 아닌 HolyHandGrenade
  • kill이 아닌 whack
  • Abort가 아닌 eatMyShort

11) 한 개념에 한 단어 사용

추상적인 개념 하나에 단어 하나를 선택해 이를 고수한다. 똑같은 메서드를 클래스마다 fetch, retrieve, get으로 제각각 부르면 어느 클래스에서 어느 이름을 사용했는지 혼란스럽다. 따라서 메서드 이름은 독자적이고 일관적이여야 한다.

12) 말장난 회피

한 단어를 두 가지 목적으로 사용하는 경우를 뜻한다. 한 개념에 한 단어를 사용하는 규칙을 따라 여러 클래스에 add 메서드가 생겼다고 가정했을 때, 어떤 클래스에서는 두 개의 값을 더하거나 새로운 값을 만들고, 어떤 클래스에서는 집합에 값 하나를 추가하는 경우 혼란스러워진다. 따라서 insert나 append라는 이름으로 사용하는 것이 옳다.

13) 해법 영역, 문제 영역에서 가져온 이름 사용

전산 용어, 알고리즘 이름, 패턴 이름, 수학 용어 등을 사용해도 괜찮다. 모든 이름을 문제 영역에서 가져오는 정책은 현명하지 못하다. 하지만 적절한 프로그래머 용어가 없을 경우 문제 영역에서 이름을 가져온다.

14) 의미 있는 맥락 추가, 불필요한 맥락 삭제

예를 들어 firstName, lastName, street, housNumber, city, state, zipcode 변수가 있을 때, 주소의 의미가 담겨있는것을 확인할 수 있다. 하지만 어떠한 메서드에서 state 변수 하나만을 사용한다면, 이 변수가 주소의 일부인지 알기 힘들다. 따라서 addr이라는 접두어를 사용하여 의미 있는 맥락을 만들어주는 것이 좋다.

 

하지만 의미가 분명할 경우에는 짧은 이름이 긴 이름보다 좋기에 불필요한 맥락을 삭제해주는 것이 좋다. 예를 들어 accountAddress와 customerAddress는 Address 클래스 인스턴스로는 좋지만 클래스 이름으로는 적합하지 않다.


[참고] Clean Code

[참고] Language - Java - 명명 규칙

 

728x90

'Clean Code' 카테고리의 다른 글

[Clean Code] 함수  (0) 2021.04.21
[Clean Code] 나쁜 코드, 깨끗한 코드  (0) 2021.04.21
[Clean Code] 요약 (2)  (0) 2021.04.20
[Clean Code] 요약 (1)  (0) 2021.04.20