클린코드 2장 의미있는 이름

Creating the dots·2022년 4월 8일
0

CleanCode

목록 보기
1/1

📚 클린코드 (로버트 C.마틴, 인사이트)을 읽고 일부 정리한 내용입니다

클린코드 2장은 의미있는 이름을 정하는 것의 중요성과 방법에 대해 설명한다. 여러가지 조건들이 있는데, 필요하고 중요하다는 것은 알지만 막상 코드를 작성하다보면 지키지 않게 되는 부분들이 있다. 그래서 앞으로는 적용하고자 기억하고 싶은 내용을 정리해보려고 한다.

  • 의도를 분명히 밝혀라
  • 그릇된 정보를 피하라
  • 의미있게 구분하라
  • 발음하기 쉬운 이름을 사용하라
  • 검색하기 쉬운 이름을 사용하라
  • 인코딩을 피하라
  • 자신의 기억력을 자랑하지 마라
  • 클래스 이름, 메서드 이름
  • 기발한 이름은 피하라
  • 말장난을 하지 마라
  • 해법 영역에서 가져온 이름을 사용하라
  • 문제 영역에서 가져온 이름을 사용하라

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

똑같은 메서드를 클래스마다 fetch, retrieve, get으로 제각각 부르면 혼란스럽다. 어느 클래스에서 어떤 이름으로 작성했는지 기억하기 어렵기 때문이다. 마찬가지로 controller, manager, driver를 섞어 쓰면 혼란스럽다. DeviceManager와 ProtocolController는 근본적으로 어떻게 다른가? 일관성있는 어휘는 코드를 사용할 프로그래머가 반갑게 여길 선물이다.

의미있는 맥락을 추가하라

firstName, lastName, street, state, houseNumber, city, zipcode라는 변수를 보면 주소라는 사실을 알아차린다. 하지만 어느 메서드가 state라는 변수 하나만 사용한다면? 변수 state가 주소 일부라는 사실을 금방 알아챌까?

이때 addr이라는 접두어를 추가하면 맥락이 좀 더 분명해진다. 변수가 좀 더 큰 구조에 속한다는 사실이 적어도 독자(프로그래머)에게는 분명해진다. 물론 Address라는 클래스를 생성하면 더 좋다. 그러면 변수가 좀 더 큰 개념에 속한다는 사실이 컴파일러에게도 분명해진다. 두 코드를 비교해보며 맥락을 분명하게 변수를 작성하는 것을 이해해보자.

아래의 코드는 맥락이 불분명한 변수로 작성된 코드이다. 처음 봤을때는 만약 나도 비슷한 코드를 작성해야한다면 이런식으로 작성하지 않을까 싶었다. 하지만 책에 따르면, 다음과 같은 개선점을 찾을 수 있다.

  • 함수 이름은 맥락의 일부만 제공하며 알고리즘이 나머지 맥락을 제공한다.
  • 함수를 끝까지 읽어보고 나서야 number, verb, pluralModifier라는 변수 세 개가 guess statistics 메시지에 사용된다는 사실이 드러난다.
  • 독자가 맥락을 유추해야만 하며 메서드를 훑어서는 세 변수의 의미가 불분명하다.
  • 불필요한 맥락을 없애라
//맥락이 불분명한 변수
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 %s %s%s", verb, number, candidate, pluralModifier);
  print(guessMessage);
}

다음과 같이 개선된 코드는 함수가 길지만 세 변수를 함수 전반에서 사용한다.

  • 함수를 작은 조각으로 쪼개고자 GuessStatisticsMessage라는 클래스를 만들고 세 변수를 클래스에 넣음으로서 세 변수의 맥락이 분명해진다.

개선된 코드는 읽으면서 오히려 코드 길이가 길어지고 변수명이 굉장히 길어져 어색하게 느껴졌다. 하지만 코드를 처음 본 사람에게는 이해하기 쉬운 코드라는 생각이 들었다.

//맥락이 분명한 변수
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 voide createPluralDependentMessageParts(int count) {
    if(count === 0) {
      thereAreNoLetters();
    } else if (count === 1) {
      thereIsOneLetter();
    } else {
      thereAreManyLetters(count)
    }
  }
  private voide 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";
  }
}
profile
어제보다 나은 오늘을 만드는 중

0개의 댓글