본문 바로가기
ETC/개발 지식

[CleanCode] 2장 의미있는 이름

by heekng 2022. 6. 25.
반응형

의미있는 이름

의도를 분명히 밝혀라

// 좋지 않은 예
int d;
// 좋은 예
int daysSinceCreation;
  • 변수나 함수 그리고 클래스 이름은 해당 변수와 클래스의 존재 이유, 수행 기능, 사용 방법에 대한 질문에 모두 답하여야 한다.
// 좋지 않은 예
public List<int[]> getThem() {
    List<int[]> list1 = new ArrayList<int[]>();
    for (int[] x : theList) 
        if(x[] == 4)
            list1.add(x)
    return list1;
}
// 좋은 예
public List<Cell> getFlaggedCells() {
    List<Cell> flaggedCells = new ArrayList<Cell>();
    for (Cell cell : gameBoard) 
        if(cell.isFlagged())
            flaggedCells.add(cell)
    return flaggedCells;
}
  • 코드의 함축성
  • 코드의 맥락이 코드 자체에 명시적으로 드러나야 한다.

그릇된 정보를 피하라

  • 그릇된 단서는 코드의 의미를 해치기 때문에 코드에 그릇된 단서를 남겨서는 안된다.
  • 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용해서는 안된다.
    • ex) hp, aix, sco

의미있게 구분하라

  • 컴파일러를 통과할지라도 연속된 숫자를 덧붙이거나 불용어를 추가하는 방식은 적절하지 못한다.
  • 이름이 달라야 한다면 의미도 달라져야 한다.
  • Info, Data, a, an, the와 같은 단어들은 의미가 불분명한 불용어이다.

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

// 좋지 않은 예
class DtaRcrd102 {
    private Date genymdhms;
    private Date modymdhms;
    private final String pszqint = "102";
}
// 좋은 예
class Customer {
    private Date generationTimestamp;
    private Date modificationTimestamp;
    private final String recordId = "102";
}

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

// 좋지 않은 예
for (int j=0; j<34; j++) {
    s += (t[j]*4)/5;
}
// 좋은 예
int realDaysPerIdealDay = 4;
const int WORK_DAYS_PER_WEEK = 5;
int sum = 0;
for (int j=0; j<NUMBER_OF_TASKS; j++) {
    int realTaskDays = taskEstimate[j] * realDaysPerIdealDay;
    int realTaskWeeks = (realTaskDays / WORK_DAYS_PER_WEEK);
    sum += realTaskWeeks;
}
  • 숫자: 숫자가 들어간다면 검색시 해당 숫자가 들어간 모든 파일 이름이나 수식이 검색된다. 따라서 숫자를 바로 사용하기보다는 변수를 이용하자.
  • e: e는 영어에서 가장 많이 쓰이는 문자다.
  • 긴 이름이 짧은 이름보다 좋다.
  • 검색하기 쉬운 이름이 상수보다 좋다.
  • 이름 길이는 범위 크기에 비례해야 한다.
    • 변수나 상수를 코드 여러 곳에서 사용한다면 검색하기 쉬운 이름이 바람직하다.

인코딩을 피하라

  • 유형이나 범위정보까지 인코딩에 넣으면 그만큼 이름을 해독하기 어려워진다.
  • 인코딩한 이름은 거의 발음하기 어려우며 오타가 생기기도 쉽다.

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

  • 독자가 코드를 읽으면서 변수 이름을 자신이 아는 이름으로 변환해야 한다면 그 변수 이름은 바람직하지 못하다.
    • 이는 일반적으로 문제 영역이나 해법 영역에서 사용하지 않는 이름을 선택했기 때문에 생기는 문제다.

클래스 이름

  • 클래스 이름과 객체 이름은 명사명사구가 적합하다.
  • 동사는 사용하지 않는다.
  • 좋은 예: Customer, WikiPage, Account, AddressParser
  • 나쁜 예: Manager, Processor, Data, Info

메서드 이름

  • 메서드 이름은 동사나 동사구가 적합하다.
  • 좋은 예: postPayment, deletePage, save
  • 접근자, 변경자, 조건자는 javabean 표준에 따라 get, set, is를 붙인다.

기발한 이름은 피해라

  • 이름이 너무 기발하면 저자와 유머 감각이 비슷한 사람만, 그리고 농담을 기억하는 동안만 이름을 기억한다.
  • 재미난 이름보다 명료한 이름을 선택하라.

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

  • 추상적인 개념 하나에 단어 하나를 선택해 이를 고수한다.
  • 일관성 있는 어휘는 코드를 사용할 프로그래머가 반갑게 여길 선물이다.

말장난을 하지 마라

  • 한 단어를 두 가지 목적으로 사용하지 마라.
  • add라는 메서드가 기존값 두 개를 더하거나 이어서 새로운 값을 만든다고 한다면, 새로 집합에 값 하나를 추가하는 메서드는 insert 또는 append라는 이름으로 작성하자.

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

  • 코드를 읽을 사람 또한 프로그래머이기 때문에 전산 용어, 알고리즘 이름, 패턴 이름, 수학 용어 등을 사용해도 괜찮다.
  • 모든 이름을 문제 영역에서 가져오는 정책은 현명하지 못하다.
  • 기술 개념에는 기술 이름이 가장 적합한 선택이다.

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

  • 적절할 프로그래머 용어가 없다면 문제 영역에서 이름을 가져온다.
    • 분야 전문가에게 의미를 물어 파악할 수 있기에
  • 해법 영역과 문제 영역을 구분할 주 ㄹ알아야 한다.
  • 문제 영역 개념과 관련이 깊은 코드라면 문제 영역에서 이름을 가져와야 한다.

의미있는 맥락을 추가하라

  • 클래스, 함수, 이름 공간에 넣어 맥락을 부여한다.
    • 그럼에도 실패한다면 마지막 수단으로 접두어를 붙인다.

불필요한 맥락을 없애라

  • 일반적으로는 짧은 이름이 긴 이름보다 좋다. 단, 의미가 분명한 경우에 한해서다.
  • 이름에 불필요한 맥락을 추가하지 않도록 주의한다.
  • ex) accountAddress, customerAddress vs Address
반응형

'ETC > 개발 지식' 카테고리의 다른 글

[CleanCode] 4장 주석  (0) 2022.06.28
[CleanCode] 3장 함수 - 2  (0) 2022.06.26
[CleanCode] 3장 함수 - 1  (0) 2022.06.26
Cron 표현식  (0) 2022.06.24
[Object] 객체지향 프로그래밍 2  (0) 2022.05.16
[Object] 객체지향 프로그래밍 1  (0) 2022.05.16