Post

[독서] Clean Code - Ch.2

공부라고 생각하니 왜 이리도 읽기가 싫은지..
일단 조금이라도 좋으니 읽으면서 게시물을 업데이트 하도록 하겠다.

Ch.2 의미 있는 이름

이 장에서는 이름 짓는 몇가지 규칙을 소개한다.

의도를 분명히 밝혀라

  • 변수, 함수, 클래스 이름은 따로 주석 없이도 다음을 설명할 수 있어야 한다.
    • 존재 이유
    • 수행 기능
    • 사용 방법
1
int d; // 경과 시간(: 날짜)

위 변수명은 좋지 못한 이름이다. 측정하려는 값과 단위를 표현하는 이름이 필요하다.

1
2
3
4
int elapsedTimeInDays;
int daysSinceCreation;
int daySinceModification;
int fileAgeInDays;

코드 자체에 코드의 맥락을 명시적으로 드러내야 한다. 코드의 함축성이 중요하다.
배열의 0인덱스의 값은 칸 상태를 뜻하고, 값이 4이면 깃발이 꽂힌 상태라고 했을 때 0과 4라는 개념에 이름을 붙여 맥락을 나타낸다.
또한 배열의 값을 직접 비교하는 대신 isFlagged()라는 함수를 사용해 FLAGGED라는 상수를 감출 수 있다.

1
2
3
4
5
6
7
8
// dirty code
if (x[0]==4)

// clean code
if (cell[STATUS_VALUE] == FLAGGED)

// 함수 사용
if (cell.isFlagged())

코드의 단순성이 변하지 않아도 훨씬 명확한 코드를 작성할 수 있다.

그릇된 정보를 피하라

  • 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용해서는 안된다. ex. hp, aix, sco는 유닉스 변종을 가리키는 이름으로, 다른 의미의 변수에 사용하면 잘못된 정보를 제공하게 될 수 있다.
    ex2. 실제로 List가 아닌 컨테이너에는 accountList 대신 accountGroup등으로 명명한다.(실제 컨테이너가 List여도 컨테이너 유형을 이름에 넣는 것은 지양한다.)
  • 서로 흡사한 이름을 사용하지 않도록 주의한다. 유사한 개념은 유사한 표기법을 사용한다는 것은 정보다. 일관성이 떨어지는 표기법은 그릇된 정보이다. 특히 l1, O0은 유사하므로 이름을 깔끔하게 지어 혼란을 방지해야 한다.

의미 있게 구분하라

단순히 컴파일을 통과하는 코드를 짜려고 철자를 살짝 바꾼 코드를 짠다면, 다른 프로그래머가 철자를 올바로 수정했을 때 컴파일이 불가능해진다.
ex. class라는 변수명을 사용할 수 없으니 klass라는 변수를 사용한다던지.
또 단순히 컴파일을 통과하게 하기 위해 연속된 숫자나 불용어(의미가 불분명한 단어, Info, Data, a, an, the 등)를 덧붙여 변수를 추가하는 것 또한 좋은 코드가 아니다.
이름이 달라야 한다면 의미도 달라져야 한다.
변수 명에 variable을 붙인다거나, 표 이름에 table을 붙이는 등의 중복되는 이름은 금물이다.
Name이라는 변수명에서 우리는 이미 이 변수가 String이라는 것을 알 수 있다.
코드를 처음 본 사람은 moneyAmount와 money의 차이를, accounData와 account의 차이를 알 수 없다.
읽는 이가 차이를 알 수 있도록 이름을 지어야 한다.

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

약어를 사용해 변수명을 제대로 발음할 수 없다면 기억하기도 어렵고 소통하기도 어렵다.
genymdhms보다는 generationTimestamp가 발음하기 쉽고 기억에 남는다.

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

한문자로 된 이름은 검색하기가 굉장히 어렵기 때문에, 간단한 메서드 안의 로컬변수에만 사용하도록 한다.
이름이 길면 검색하는 것은 더 쉬워진다.
이름 길이는 범위 크기에 비례해야 한다. 여러 곳에서 사용하는 이름일수록 긴 이름을 붙여 검색하기 쉽도록 한다.

인코딩을 피하라

유형, 범위정보 등 필요 이상의 정보를 인코딩해 이름에 넣으면 정보가 너무 많아지고 발음하기도 어려우며 오타가 발생하기도 쉽다.
다음은 인코딩이 필요하지 않은 예시다.

헝가리식 표기법
최근은 컴파일러가 타입을 기억하고 강제해 프로그래머가 타입을 기억할 필요가 사라졌다.
클래스와 함수는 점점 작아져 변수를 선언한 위치에서 사용하는 위치가 멀지 않다.

멤버 변수 접두어
클래스와 함수는 멤버 변수 접두어가 필요 없을 만큼 작아야 한다.
또 멤버변수를 눈에 띄게 표시해주는 IDE를 사용하자.

인코딩이 필요한 경우도 있다.

인터페이스 클래스와 구현 클래스

글쓴이는 개인적으로 인터페이스 클래스와 구현 클래스 중 구현 클래스의 이름을 인코딩한다.
인터페이스 클래스라는 정보는 클래스 사용자가 알 필요 없는 정보기 때문이다.

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

독자가 변수 명을 자신이 아는 이름으로 변환할 필요가 없어야 한다.
예를 들어, URL변수명을 r로 저장했다면 읽는 사람은 그 변수가 어떤 의미인지 기억하고 있어야 한다. 이는 명료한 코드가 아니다.

클래스 이름

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.