2장. 의미 있는 이름

고기호·2024년 8월 20일
1

클린 코드

목록 보기
2/3
post-thumbnail

의미 있는 이름


의도를 분명히 밝혀라

  • 변수, 함수, 클래스 등의 이름은 ‘존재 이유는?’, ‘수행 기능은?’, ‘사용 방법은?’이라는 질문에 모두 대답할 수 있어야 한다.
  • 코드가 단순하다고 해서 좋은 것이 아니다. 단순하지만 함축된 경우, 코드의 맥락이 코드 자체에 명시적으로 드러나지 않으면 오히려 해석하기 어려워질 수 있다.

예시:

  • const d처럼 모호한 이름 대신, const elapsedDays처럼 명확한 이름을 사용해야 한다.

그릇된 정보를 피해라

  • 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용하면 안 된다.
    • 예를 들어, 빗변을 hypotenuse가 아닌 약어인 hp로 표기하면 혼란을 줄 수 있다.
  • 실제 리스트가 아니라면 이름에 List를 포함시키지 말아야 한다.
    • 예를 들어, 여러 계정을 그룹으로 묶는 경우, accountList가 아닌 accountGroup으로 명명하는 것이 더 적절하다.
  • 흡사한 이름을 사용하면 안 된다.
    • 자동 완성을 사용할 때 실수할 가능성이 커진다.
  • 소문자 l과 대문자 O는 각각 10처럼 보일 수 있어 혼동을 일으킬 수 있다.

의미 있게 구분해라

  • 동일한 범위 안에서 서로 다른 개념에 동일한 이름을 붙이면 안 된다.
    • 연속된 숫자나 불용어를 추가하는 방식은 적절하지 않다.
      • 예시: name1name2 또는 accountDataaccount처럼 명명하면 차이를 명확히 알기 어렵다.
    • 불용어는 중복된 표현일 뿐이다.
      • 예시: NameNameString은 의미가 중복된다.
    • 이름을 지을 때, 읽는 사람이 차이를 명확히 알 수 있도록 해야 한다.

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

typescript코드 복사
class DtaRcrd102 {
    private genymdhms: Date;
    private modymdhms: Date;
    private pszqint = "102";
}

class Customer {
    private generationTimestamp: Date;
    private modificationTimestamp: Date;
    private recordId = "102";
}
  • 두 번째 코드는 지적인 대화가 가능하다.

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

  • 이름의 길이는 그 범위의 크기에 비례해야 한다.
    • 간단한 메서드에서 사용하는 로컬 변수라면 한 문자로 사용해도 된다.
      • 예시: 루프문의 반복 횟수에 사용되는 i, j 등.

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

  • 변수 이름을 한 문자로 하지 마라. 한 문자 변수는 기억하기 어렵고, 코드 이해를 방해할 수 있다.

클래스와 객체 이름

  • 클래스와 객체 이름은 명사나 명사구가 적합하다.
    • 예시: Customer, Account처럼 명명한다.
  • Manager, Processor, Data, Info 등과 같은 모호한 단어는 피한다.
  • 동사는 사용하지 않는다.

메서드 이름

  • 메서드 이름은 동사나 동사구가 적합하다.
    • 예시: postPayment, deletePage, save 등.
  • 접근자, 변경자, 조건자에는 get, set, is를 붙인다.
typescript코드 복사
name = employee.getName();
customer.setName('John Doe');
if (paycheck.isPosted()) {
    ...
}

기발한 이름은 피해라

  • 특정 문화에서만 이해할 수 있는 농담이나 은어는 피하는 편이 좋다.

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

  • 동일한 개념을 표현할 때는 일관되게 하나의 단어만 사용하라.
    • 예시: fetch, retrieve, get을 혼용하지 말고, 하나로 통일하라.

말장난을 하지 마라

  • 같은 단어를 두 가지 목적으로 사용하지 말고, 다른 개념에 동일한 단어를 사용하지 마라.
    • 예시: 기존 add 메서드는 값을 더하거나 이어서 새로운 값을 만드는 경우에만 사용해야 한다. 리스트에 값을 추가할 때는 insertappend라는 이름을 사용해야 혼란이 없다.

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

  • 모든 이름을 문제 영역(도메인)에서 가져오는 것이 아니라, 프로그래머에게 익숙한 기술적 개념에서 가져와라.
    • 예시: AccountVisitor, JobQueue 등.

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

  • 적절한 프로그래머 용어가 없다면, 문제 영역에서 이름을 가져와라.
    • 이렇게 하면, 코드를 유지보수하는 프로그래머가 분야 전문가에게 의미를 물어 파악할 수 있다.

의미 있는 맥락을 추가하라

  • houseNumber, city, state, zipcode라는 변수가 있으면 주소와 관련된 정보임을 쉽게 알 수 있다. 하지만 state만 있다면, 주소의 일부라는 것을 쉽게 알 수 없다.
    • 이런 경우 클래스, 함수, 네임스페이스에 넣어 맥락을 부여한다.
      • 예시: 리액트에서 ConfirmButton 컴포넌트를 분리할 때, 컴포넌트 이름을 ConfirmButton으로 하고, 내부의 스타일드 컴포넌트는 Wrapper, Name 등으로 간단히 명명한다.
      • 모든 방법이 실패한다면 접두어를 붙인다.
        • 예시: ConfirmButtonName, ConfirmButtonWrapper 등.

불필요한 맥락을 없애라

  • accountAddresscustomerAddressAddress 클래스의 인스턴스 이름으로는 적합하지만, 클래스 이름으로는 부적합하다. 클래스 이름은 단순하고 명확하게 Address로만 명명하는 것이 좋다.

reference

클린 코드 ( 로버트 C. 마틴 )

profile
웹 개발자 고기호입니다.

0개의 댓글