2장. 의미 있는 이름

의도가 분명하게 이름을 지으라

의도가 분명하게..?

말은 쉽지

좋은 이름은 의도가 분명한 이름이다. 조금 길더라도 가독성을 해치지 않는 선에서라면 말이다.

변수나 함수 그리고 클래스 이름은 다음과 같은 굵직한 질문에 모두 답해야 한다.

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

변수명만으로도 이것들이 표현되어야 한다. 만약 주석을 써야한다면... 의도를 드러내지 못했다는 뜻이기도 하다.

날짜라는 의미의 date를 줄여서 d라고 지어보자.

int d;

음.. d가 무엇을 의미하는지 와닿지 않는다.

기왕이면 측정하려는 값과 단위까지 표현해보자

int elapsedTimeInDays; // 하루동안의 경과시간
int daysSinceCreation; // 생성일자
int daysSinceModification; // 수정일자
int fileAgeInDays; // 생성 후 경과일자

어차피 독후감이니 주석을 달았지만, 실제 코드에서 주석이 없더라도 충분히 무슨 값을 담고 있는지 파악이 가능하다.

사람에 따라 변수명이 조금 길다고 느낄 수 있지만, 개인적으로는 줄여쓰는건 안하니만 못하다고 생각해서... 저정도면 괜찮다고 본다.


이번엔 코드를 살펴보자. 아래의 메서드가 무슨 일을 하는지 한 눈에 안들어온다.

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

나는 위의 코드를 보고 이런 생각이 들었다.

  1. 0번째 인덱스를 검사하는거보면 4일 때 무언가 특별한 조건이 있는건가...?
  2. 그럼 4는 무엇을 의미하는거지?

책에서도 비슷한 이야기를 한다.

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

사실 여기에서 변수, 함수의 네이밍만 수정해주어도 의도를 어느정도 드러낼 수 있다.

아니면 클래스를 새로 만들어서 제네릭에 사용하면 int[]보다 명확하게 의도를 드러낼 수 있다.


그릇된 정보를 피하라

프로그래머는 코드에 그릇된 단서를 남겨서는 안 된다.

예를 들면, 여러 계정을 그룹으로 묶을 때, 실제 List 타입이 아니라면 accountList라 명명하지 않는다.

코드는 프로그래머가 본다. 나 이외의 다른 프로그래머가 코드를 봤을 때 accountList가 List라는 그릇된 정보를 제공할 수도 있다.

또한 흡사한 이름을 사용하지 않도록 주의하자.

변수명이 서로 흡사하거나, 대문자O처럼 숫자랑 헷갈리게 보이는 변수명도 홀로 사용하지 말자.

int aO = 1;
int l = 0;
aO = ol;
l = 01

WOW... 끔찍하다.


의미 있게 구분하라

이런 네이밍은 자제하자.

getActiveAccount();
getActiveAccounts();
getActiveAccountInfo();

진짜 아찔하다.

읽는 사람의 관점에서 다시 한번 생각해보고 확실하게 네이밍 별로 차이를 주자.


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

코드도 결국 커뮤니케이션이다.

회의할 때 어려운 발음은 괜히 분위기를 산만하게 만들기도 한다.


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

이름의 길이는 해당 변수가 사용되는 범위의 크기에 비례해야 한다.

많이 쓰일 수록 변수 이름을 길게 지어서 검색하기 쉽게 만들어야 한다.


인코딩을 피하라

인코딩 언어를 피하자. 가령 변수명에 타입을 표기한다던가 하는 행동을 말한다.


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

독자가 코드를 읽으면서 변수 이름을 자신이 아는 이름으로 변환해야 한다면 바람직하지 못한 변수명인 것이다.

게다가 나~중에 본인의 코드를 봤을 때.... 그 때는 본인이 독자의 입장으로 코드를 바라보게 될지 모른다.


클래스 이름

클래스 이름은 가능하면 명사로 짓도록 하자. Person처럼!


메서드 이름

메서드 이름은 동사 위주로 짓자. getName 이라던가 말이다.


후기

네이밍...중요하다.

사실 네이밍 자체는 짓기 쉽다고 생각한다.

문제는 비슷한 기능을 하는 변수가 여러개일 때다.

심지어 각각의 변수가 중요한 기능을 담당한다면, 더욱 네이밍을 짓기 힘들어진다.

물론 그럴수록 네이밍은 구분하기 힘들어질 수도 있다. 하지만 그러한 노력을 조금이라도 하면 미래의 내가 편해진다.

개발하면서 수없이 코드를 읽게 될텐데, 굳이 다른 사람을 위해서라기보다, 나에게 주는 선물이라 생각하고 짓자.

tags

#노마드클럽 #북클럽 #노개북

Last Updated: