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

Devil😈·2024년 1월 27일
1

CleanCode

목록 보기
2/10
post-thumbnail
post-custom-banner

클린코드에 나오는 코드들을 Dart로 정리해보았다
좋은 이름을 지으려면 시간이 걸리지만 좋은 이름으로 절약하는 시간이 훨씬 더 많다

좋은 이름을 짓는 원칙


1. 그릇된 정보를 피하라

  • hp, aix, sco 등은 다른 의미를 가지므로 변수명으로 적당치 않다
  • List는 자료형의 종류이므로 List가 아닐 때 accountList 같은 이름을 사용하면 안된다
    (진짜 List일 때도 사용을 권하지 않는다)
  • 소문자 l, 대문자 O는 숫자 1, 0과 헷갈리므로 주의해야 한다


2. 의미 있게 구분하라

예를 들어 아래와 같은 코드는

void copyStrings(String a, StringBuffer b) {
  for (int i = 0; i < a.length; i++) {
    b.write(a[i]);
  }
}

이렇게 source, destination 으로 구분해주면 의미가 명확해진다.

void copyStrings(String source, StringBuffer destination) {
  for (int i = 0; i < source.length; i++) {
    destination.write(source[i]);
  }
}
  • 변수명에 중복 표현(불용어) 사용도 금물이다
    변수 이름에 Variable을 붙이거나, 표에 Table을 쓰는 것.
    위에서 나왔던 List에 List라는 이름을 피해야하는 이유도 동일하다


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

이 부분은 그냥 말이 되는 영어 단어를 쓰라는 뜻인 것 같다.
ex) genymdhms 보다는 generationTimestamp같은 명칭을 써라



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

  • e, 7 같은 알파벳, 숫자는 너무 많이 검색되기 때문에 변수명으로 좋지 않다
    WORK_DAYS_PER_WEEK같이 명확하고 검색이 바로 되는 이름을 써라



5. 인코딩을 피하라

변수 이름에 타입을 인코딩할 필요가 없다?
당연한 거 아닌가.. Java스러운건가? 여기는 잘 모르겠다

인터페이스 클래스 앞에 I를 붙이지 않는 것이 좋다고 하는데, 니꼬쌤은 TypeScript Interface 선언할 때 I를 붙이는 편이 낫다고 한 것같은데 좀 다르네



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


7. 클래스 이름

클래스 이름은 명사나 명사구가 적합하다

  • Customer, WikiPage, Account 등
  • Manager, Process, Data 등은 좋지 않다 (다른 명령어 등과 중복 가능)

8. 메서드 이름

메서드 이름은 동사나 동사구가 적합하다

  • postPayment, deletePage, save 등

9. 기발한 이름은 피하라


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

하는 역할이 같다면 controller, driver, manager 등 단어는 하나로 통일해라


11. 말장난을 하지 마라


12. 해법 영역(Solution Domain)에서 가져온 이름을 사용하라

코드를 읽을 사람도 프로그래머이니 전산 용어, 알고리즘 이름, 패턴 명, 수학 용어 등을 사용해도 된다


13. 문제 영역에서(Problem Domain)에서 가져온 이름을 사용하라

적절한 프로그래머 용어가 없다면 문제 영역에서 이름을 가져온다.


14. 의미 있는 맥락을 추가하라

  • firstName, lastName, street, state, zipcode 등의 변수가 뭉쳐있으면 주소를 뜻하는 것을 알 수 있다
    하지만 state라는 변수만 따로 떨어져있으면?
    -> addrFirstName, addrLastName, addrState 처럼 주소를 뜻하는 addr 접두어를 붙이면 좋다

  • 클래스, 함수, 이름 등을 추가해서 맥락을 부여하는 것이 좋지만 어려울 때는 마지막 수단으로 접두어를

void printGuessStatistics(String 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 = count.toString();
    verb = 'are';
    pluralModifier = 's';
  }
  String guessMessage = 'There $verb $number $candidate$pluralModifier';
  print(guessMessage);
}

위의 코드는 함수가 길고, 세 변수 number, verb, pluralModifier를 함수 전반에서 사용한다
함수를 작은 조각으로 쪼개기 위해 GuessStatisticsMessage라는 클래스를 만들고 세 변수를 클래스에 넣으면 맥락이 분명해진다

아래와 같이 수정해보았다


class GuessStatisticsMessage {
  late String number;
  late String verb;
  late String pluralModifier;

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

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

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

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

      String make(String candidate, int count) {
    createPluralDependentMessageParts(count);
    return 'There $verb $number $candidate$pluralModifier';
  }

}

15. 불필요한 맥락을 없애라

  • 일반적으로 짧은 이름이 긴 이름보다 좋다. 이름에 불필요한 맥락을 추가하지 않도록 주의한다
  • 고급 휘발유 충전소(Gas Station Deluxe)라는 애플리케이션을 만들 때 모든 클래스 이름을 GSD로 시작하는 것은 어리석다

* 마무리 : Nomad Coder 슬랙에 쓴 '이 책을 읽으려는 이유'

profile
얼굴셋 손여섯
post-custom-banner

0개의 댓글