글 작성자: 망고좋아
반응형

📖 Clean Code - 의미 있는 이름

  • 의미 있는 이름

 

📝 기억하고 싶은 내용

  • 의미 있게 구분하라 (p. 25)
  • 발음하기 쉬운 이름을 사용하라 (p. 27)
  • 검색하기 쉬운 이름을 사용하라 (p. 28)
  • 인코딩을 피하라 (p. 29)
  • 클래스 이름과 객체 이름은 명사나 명사구가 적합하다.
    • Customer, WikiPage, Account, AddressParser 등이 좋은 예다.
    • Manager, Processor, Data, Info 등과 같은 단어는 피하고, 동사는 사용하지 않는다. (p. 32)
  • 메서드 이름은 동사나 동사구가 적합하다.
    • postPayment, deletePage, save 등이 좋은 예다.
    • 접근자 Accessor, 변경자 Mutator, 조건자 Predicate는 javabean 표준 4에 따라 값 앞에 get, set, is를 붙인다. (p. 32)
  • 기발한 이름은 피하라 (p. 32)
  • 한 개념에 한 단어를 사용하라
    • 추상적인 개념 하나에 단어 하나를 선택해 이를 고수한다. 예를 들어, 똑같은 메서드를 클래스마다 fetch, retrieve, get으로 제각각 부르면 혼란스럽다.
    • 일관성 있는 어휘는 코드를 사용할 프로그래머가 반갑게 여길 선물이다. (p. 33)
  • 의미 있는 맥락을 추가하라
    • addr라는 접두어를 추가해 addrFirstName, addrLastName, addrState라 쓰면
      맥락이 좀 더 분명해진다. (p. 35)

 

💡 오늘 깨달은 것

  • 개발자에게 변수 이름 짓기란 간단하면서도 점심 메뉴를 고르는 것과 같이 최대 고민 중 하나 일 것이다.
  • 최근 입사 과제를 진행하면서 모호한 네이밍이 있어 아쉬웠습니다.라는 피드백을 받았다. 이러한 부분을 어떻게 개선할 수 있을까 고민하면서 책, 구글링 등을 하였다. 그리고 과거의 작성한 변수, 함수명을 보았는데 위와 같은 피드백을 왜 받았는지 알겠으며 반성하게 되었다.
  • 나만의 규칙을 가지고 변수/함수 이름 짓기를 했는데 프로젝트 때마다 일관성이 부족했던 점을 발견하였다.
  • 이번 기회에 노션에 나만의 네이밍 규칙을 문서화하고 이 규칙에 따라 변수/함수명을 지어보자!

 

🏷 요약

📕 의미 있는 변수 이름 사용

// Bad
function between<T>(a1: T, a2: T, a3: T): boolean {
  return a2 <= a1 && a1 <= a3;
}

// Good
function between<T>(value: T, left: T, right: T): boolean {
  return left <= value && value <= right;
}

📕 발음할 수 있는 변수 이름을 사용

// Bad
type DtaRcrd102 = {
  genymdhms: Date;
  modymdhms: Date;
  pszqint: number;
}

// Good
type Customer = {
  generationTimestamp: Date;
  modificationTimestamp: Date;
  recordId: number;
}

📕 동일한 유형의 변수는 동일한 단어 사용

// Bad
function getUserInfo(): User;
function getUserDetails(): User;
function getUserData(): User;

// Good
function getUser(): User;

📕 검색할 수 있는 이름을 사용

// /Bad, 86400000이 도대체 뭐지?
setTimeout(restart, 86400000);

// Good, 대문자로 이루어진 상수로 선언하세요.
const MILLISECONDS_IN_A_DAY = 24 * 60 * 60 * 1000;

setTimeout(restart, MILLISECONDS_IN_A_DAY);

📕 의도를 나타내는 변수를 사용

// /Bad
declare const users: Map<string, User>;

for (const keyValue of users) {
  // users 맵을 순회
}


// Good
declare const users: Map<string, User>;

for (const [id, user] of users) {
  // users 맵을 순회
}

📕 불필요한 문맥은 추가하지 마세요

  • 클래스/타입/객체의 이름에 의미가 담겨있다면, 변수 이름에서 반복하지 마세요.
// /Bad
type Car = {
  carMake: string;
  carModel: string;
  carColor: string;
}

function print(car: Car): void {
  console.log(`${car.carMake} ${car.carModel} (${car.carColor})`);
}


// Good
type Car = {
  make: string;
  model: string;
  color: string;
}

function print(car: Car): void {
  console.log(`${car.make} ${car.model} (${car.color})`);
}

📕 short circuiting이나 조건문 대신 기본 매개변수를 사용

  • 기본 매개변수는 short circuiting보다 보통 명료하다.
// /Bad
function loadPages(count?: number) {
  const loadCount = count !== undefined ? count : 10;
  // ...
}

// Good
function loadPages(count: number = 10) {
  // ...
}

📕 의도를 알려주기 위해 enum을 사용하세요

// /Bad
const GENRE = {
  ROMANTIC: 'romantic',
  DRAMA: 'drama',
  COMEDY: 'comedy',
  DOCUMENTARY: 'documentary',
}

projector.configureFilm(GENRE.COMEDY);

class Projector {
  // Projector의 선언
  configureFilm(genre) {
    switch (genre) {
      case GENRE.ROMANTIC:
        // 실행되어야 하는 로직
    }
  }
}

// Good
enum GENRE {
  ROMANTIC,
  DRAMA,
  COMEDY,
  DOCUMENTARY,
}

projector.configureFilm(GENRE.COMEDY);

class Projector {
  // Projector의 선언
  configureFilm(genre) {
    switch (genre) {
      case GENRE.ROMANTIC:
        // 실행되어야 하는 로직
    }
  }
}

 

📌 참고

 

GitHub - 738/clean-code-typescript: 🚿 타입스크립트를 위한 클린코드 - 한글 번역판 🇰🇷

🚿 타입스크립트를 위한 클린코드 - 한글 번역판 🇰🇷. Contribute to 738/clean-code-typescript development by creating an account on GitHub.

github.com

 

반응형

'프로그래밍 > Clean Code' 카테고리의 다른 글

[Clean Code] 함수  (0) 2022.05.01
[Clean Code] 깨끗한 코드  (0) 2022.04.23
[Clean Code] 클린 코드 시작  (0) 2022.04.22