본문 바로가기
CS/클린코드

[클린코드] chapter-2 의미있는 이름

by yhsim98 2022. 8. 19.

의미를 분명히 밝혀라

  • 변수의 존재 이유, 수행 기능, 사용법 등이 변수/함수/클래스명에 드러나야 한다. 따로 주석이 필요하지 않을 정도로
  • 의미를 함축하거나 독자(코드를 읽는 사람)이 사전지식을 가지고 있다고 가정하지 말자
// bad
int d; // elapsed time in days

// good
int elapsedTimeInDays;
int daysSinceCreation;
int daysSinceModification;
....
  • 아래의 코드는 독자가 다음과 같은 정보를 안다고 가정한다
    • TheList에 무엇이 들었는가
    • theList에서 해당 값이 어떤 의미를 가지는가?
    • 함수가 반환하는 list1은 어떻게 사용하는가?
  • 이름만 잘 붙여도 훨씬 명확해진다
//bad
public List<int[]> getThem(){
    List<int[]> list1 = new ArrayList<int[]>();
      if(list1[0][0] == 4)
           list1.add(x);
      return list1;
}

//good  
public List getFlaggedCells(){  
    List flaggedCells = new ArrayList<>();  
    for(Cell cell : gameBoard)  
        if(cell.isFlagged())  
            flaggedCells.add(cell);  
    return flaggedCells;  
}
// bad  
public getUserInfo(Long id); // 회원가입했고 인증이 완료된 유저 정보 조회  
public List<> getThem();

//good  
public getAuthedUserInfoById(Long id)  
public List<> getFlaggedCells();

그릇된 정보를 피해라

  • 중의적으로 해석될 수 있는 이름 지양하기
  • 개발자에게는 특수한 의미를 가지는 단어(List 등등)는 실제 컨테이너가 List가 아닌 이상, accountList와 같이 변수명에 붙이지 말자. 차라리 accountGroup, accounts 등으로 명명하자
  • 비슷해 보이는 명명에 주의하자

의미 있게 구분하라(불용어를 쓰지 말자)

  • 말이 안되는 단어(a1, a2, ..)과 같이 숫자로 구분하는 경우 주의
  • 클래스 이름에 Info, Data 같은 불용어를 붙이지 말자. 정확한 개념 구분이 되지 않음
  • getActiveAccount(), getActiveAccounts(), getActiveAccountInfo()
  • 이렇게 혼재할 경우 서로의 역할을 정확히 구분하기 어렵다
  • money vs moneyAmount

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

말그대로

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

  • 상수는 static final 과 같이 정의해 쓰자
  • 변수 이름의 길이는 변수의 범위에 비례해서 길어진다

인코딩을 피하라(변수에 부가 정보를 덧붙여 표기하는 것을 뜻함)

  • 헝가리안 표기법
    • 변수명에 해당 변수의 타입(String, Int 등)을 적지 말자
    • 자바의 경우는 타입이 강제된다, 그래서 필요없다
    • 타입이 바껴도 변수명은 변하지 않는다
  • 멤버 변수 접두어
    • 멤버 변수에 접두어를 붙이지 말자
  • 인터페이스와 구현
    • 인터페이스 클래스와 구현 클래스를 나눠야 한다면 구현 클래스의 이름에 정보를 인코딩하자

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

  • 독자가 머리속으로 한번 더 생각해 변환해야 할만한 병수명을 쓰지 말라.(URL에서 호스트와 프로토콜을 제외한 소문자 주소를 r이라는 변수로 명명하는 일 등)
  • 똑똑한 프로그래머와 전문가 프로그래머를 나누는 기준 한가지는 "Clarity(명료함)"이다.

클래스 이름

  • 클래스 이름과 객체 이름은 명사 혹은 명사구를 사용하라
  • Manager, Processor, Data, Info와 같은 단어는 피하자
  • 동사는 사용하지 않는다

메서드 이름

  • 동사 혹은 동사구를 사용하라(postPayment, deletePayment, deletePage, save 등)
  • 접근자, 변경자, 조건자는 get, set, is로 시작하자.
  • 생성자를 오버로드할 경우 정적 팩토리 메서드를 사용하고 해당 생성자를 private으로 선언한다

기발한 이름은 피하라

  • 특정 문화에서만 사용되는 재미있는 이름보다 의도를 분명히 표현하는 이름을 사용하라
  • HolyHandGrenade?? -> DeleteItems
  • whack()?? -> kill()

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

  • 추상적인 개념 하나에 단어 하나를 사용하자
    • fetch, retrieve, get
    • controller, manager, driver

말장난을 하지 말라

  • 한 단어를 두 가지 목록으로 사용하지 말자. 아래와 같은 경우에는 두 번째 메서드를 append 혹은 insert 로 바꿔라
public static String add(String message, String messageToAppend)  
public List add(Element element)

해법 영역(Solution Domain) 용어를 사용하자

  • 개발자라면 당연히 알고 있을 JobQueue, AccountVisitor등을 사용하지 않을 이유가 없다. 전산용어, 알고리즘, 패턴 이름, 수학 용어 등은 사용하자.

문제영역 용어를 사용하자

  • 적절한 프로그래밍 용어가 없거나 문제영역과 관련이 깊은 용어의 경우 문제 영역 용어를 사용하자

의미 있는 맥락을 추가하라

  • 클래스, 함수, namespace 등으로 감싸서 맥락을 표현하라
int street, state, city, zipcode;  
// 주소인 것을 바로 알 수 있다

int state;  
//단독으로 있으면 어떤 뜻인지 알기 어렵다

int addrState;  
// 이럴 때 접두어를 붙이자
  • 그래도 불문명하다면 접두어를 사용하자
// bad  
private void printGuessStatistics(char candidate, int count){  
    String number;  
    String verb;  
    String pluralModifier;  
    if (count == 0){  
        number = "no";  
        verb = "are";  
        pluralModifier = "s";  
    } else if(count == 1){  
        number = "1";  
        verb = "is";  
        pluralModifier = "";  
    } else {  
        number = Integer.toString(count);  
        verb = "are";  
        pluralModifier = "s";  
    }  
    String guessMessage = String.format("There %s ....", verb, number);  
}

// Good  
public class GuessStatisticsMessage {  
private String number;  
private String verb;  
private String pluralModifier;

public String make(char candidate, int count) {
    createPluralDependentMessageParts(count);
    return String.format("There %s %s %s%s", verb, number, candidate, pluralModifier );
}

private void createPluralDependentMessageParts(int count) {
    if (count == 0) {
        thereAreNoLetters();
    } else if (count == 1) {
        thereIsOneLetter();
    } else {
        thereAreManyLetters(count);
    }
}

private void thereAreManyLetters(int count) {
    number = Integer.toString(count);
    verb = "are";
    pluralModifier = "s";
}

private void thereIsOneLetter() {
    number = "1";
    verb = "is";
    pluralModifier = "";
}

private void thereAreNoLetters() {
    number = "no";
    verb = "are";
    pluralModifier = "s";
}

불필용한 맥락을 없애라

  • 주유소라는(Gas station Deluxe) 애플리케이션에서 모든 클래스 이름을 GSD로 시작하는 것은 바람직하지 않다
  • 의미가 분명한 경우에는 이름이 긴 경우가 좋지만, 불필요한 맥락을 추가하지 않도록 주의하자
    • accountAddress, customerAddress는 인스턴스로는 좋은 이름이지만, 클래스 이름으로는 적절하지 못하다

'CS > 클린코드' 카테고리의 다른 글

[클린코드] chapter-6 객체와 자료구조  (0) 2022.08.28
[클린코드] chapter-5 형식 맞추기  (0) 2022.08.25
[클린코드] chapter-4 주석  (0) 2022.08.23
[클린코드] chapter-3 함수  (0) 2022.08.21
[클린코드] Chapter-1  (0) 2022.08.17