클린코드 4장 주석

 잘 달린 주석은 유용하다

하지만 경솔하고 근거 없는 주석은 코드를 이해하기 어렵게 만든다.

오래되고 조잡한 주석은 거짓과 잘못된 정보를 퍼뜨려 해악을 미친다.

우리에게 프로그래밍 언어를 치밀하게 사용해 의도를 표현할 능력이 있다면 주석은 거의 필요하지 않다.

→ 코드로 의도를 표현하지 못해, 실패를 만회하기 위해 주석을 사용한다.

코드는 변화하고 진화한다. 불행하게도 주석은 언제나 코드를 따라가지 않는다.

부정확한 주석은 아예 없는 주석보다 훨씬 더 나쁘다.

주석은 나쁜 코드를 보완하지 못한다.

코드에 주석을 추가하는 일반적인 이유는 코드 품질이 나쁘기 떄문이다.

코드로 의도를 표현하라

// 직원에게 복지 혜택을 받을 자격이 있는지 검사한다.
if (employee.flags & HOURLY_FLAG) && (employee.agr > 65))

위 코드 보다 아래 코드가 보기가 쉽다.

if (employee.isEligibleForFullBenfits())

좋은 주석

정말 좋은 주석은, 주석을 달지 않을 방법을 찾아낸 주석이다.

법적인 주석

때로는 회사가 정리합 구현 표준에 맞춰 법적인 이유로 특정 주석을 넣으라고 명시한다. (예를 들어 소스 코드 상단에 저작권 정보와 소유권 정보는 필요하고 타당하다)

정보를 제공하는 주석

아래와 같이 정규 표현식이 시각ㄱ과 날짜를 뜻한다고 설명한다. → 하지만 시각과 날짜를 변환하는 클래스를 만들어 코드를 옮겨주면 더 좋고 더 깔끔해지고 주석도 없어질 수 있다.

// kk:mm:ss EEE, MMM dd, yyyy 형식이다.
Pattern timeMatcher = Pattern.compile("\\\\d*:\\\\d*:\\\\d* \\\\w*, \\\\w* \\\\d*, \\\\d");

의도를 설명하는 주석

구현을 이해하게 도와주는 선을 넘어 결정에 깔린 의도까지 설명해주는 주석.

예를 들면 특정 정책에 의해서 결정된 의도인 경우 설명을 하면 좋다.

의미를 명료하게 밝히는 주석

때땔 모호한 인수나 반환값은 그 의미를 읽기 좋게 표현하면 이해하기 쉬워진다. 하지만 변경하지 못하는 코드에 속한다면 의미를 명료하게 밝히는 주석이 유용하다. → 하지만 잘못된 주석을 달아놓을 위험성이 놓다.

결과를 경고하는 주석

때로는 다른 프로그래머에게 결과를 경고할 목적으로 주석을 사용한다.

// 시간이 오래 걸리니.. 시간이 충분하지 않으면 실행하지 마세요.
public void veryLongTimeExecuteTest() {

TODO 주석

앞으로 할 일을 TODO 주석으로 남겨두면 편하다

void makeVersion() {
	// TODO: 현재 필요하지 않지만 추후 필요할 수 있다.
}

중요성을 강조하는 주석

중요하지 않은 무엇인가를 강조하기 위해서 주석을 사용한다.

String listItemContent = match.group(3).trim();
// 여기에서 문자열에 시작 공백이 있으면 다른 문자열료 인식되기 떄문에.. trim 은 정말 중요하다. 
new ListItemWidget(this, listItemContent, this.level + 1);

공개 API 에서 Javadocs

설명이 잘 된 공개 API 는 참으로 유용하고 만족스럽다. 표준 라이브러리에서 사용한 Javadocs 가 좋은 예다.

하지만 어느 주석과 마찬가지로 독자를 오도하거나, 잘못 위치하거나, 그릇된 정보를 전다할 가능성이 있다.

나쁜 주석

대다수의 주석이 이 범주에 속한다.

대다수 주석은 허술한 코드를 지탱하거나, 엉성한 코드를 변명하거나, 미숙한 결정을 합리화하는 등 프로그래머가 주절거리는 독백에서 크게 벗어나지 못한다.

주절 거리는 주석

특별한 이유 없이 의무감으로 혹은 프로세스에서 하라고 하니까 마지 못해 주석을 단다면 전적으로 시간 낭비다.

같은 이야기를 반복하는 주석

코드 내용을 그대로 중복한 주석

오해할 여지가 있는 주석

때로는 의도는 좋았으나 프로그래머가 딱 맞을 정도로 엄밀하게 주석을 달지 못하기도 한다.

의무적으로 다는 주석

모든 함수에 Javadocs 를 달거나 모든 변수에 주석을 달아야 한다는 규칙은 어리석기 그지 없다.

이런 주석은 코드를 복잡하게 만들며, 거짓말을 퍼뜨리고, 혼동과 무질서를 초래한다.

이력을 기록하는 주석

때때로 사람들은 모듈을 편집할 때 모듈 첫머리에 주석을 추가한다.

예전에는 모듈 첫머리에 변경 이력을 기록하고 관리하는 관례가 바람직 했지만 당시에는 소스 코드 관리시스템이 없었기 때문이다. 이제는 혼란만 가중할 뿐이다. 완전히 제거하는 것이 좋다.

있으나 마나 한 주석

지나친 참견을하는 주석은 개발자가 주석을 무시하는 습관에 빠지게 한다.

무서운 잡음

때로는 Javadocs 도 잡음이다.

함수나 변수로 표현할 수 있다면 주석을 달지 마라

위치를 표시한 주석

소스 파일에서 특정 위치를 표시하려고 주석을 사용한다.

닫는 괄호에 다는 주석

try {
	while (...) {
		...
	} // while
} // try 
catch (Exception e) {
	...
} // catch

공로를 돌리거나 저자를 표시하는 주석

소스 관리 시스템이 귀신 기억해준다..

// 릭이 추가 함.
public void execute() {
	...
}

주석으로 처리한 코드

주석으로 처리된 코드는 다른 사람들이 지우기를 주저한다.

이유가 있어 남겨 뒀을꺼라고 생각히 때문에…

어차피 소스 관리 시스템이 이력은 잘 관리하고 있다.

HTML 주석

소스 코드에서 html 주석은 혐오 그 자체이다.

/**
 * 적합성 테스트
 * <pre>
 * &lt;taskdef name=&quot;execute-fitnesse-test*quot;
 * </pre>
**/

전역 정보

주석을 달아야 한다면 근처에 있는 코드만 기술하라.

너무 많은 정보

주석에다 흥미로운 역사나 관련 없는 정보를 장황하게 늘어놓지 마라.

모호한 관계

주석과 주석이 설명하는 코드는 둘 사이 관계가 명백해야 한다.

함수 헤더

짧은 함수는 긴 설명이 필요 없다. 짧고 한가지만 수행하며 이름을 잘 붙인 함수가 주석으로 헤더를 추가한 함수보다 좋다.

비공개 코드에서 Javadocs

공개하지 않을 코드에는 의미가 없다.

댓글 없음:

댓글 쓰기

도서 내용 정리 - 스태프 엔지니어

개요 네이버 도서 정보:  https://bit.ly/3JzLvQr 개발자는 관리자로만 커리어를 쌓아야 하는가? 관리자가 아닌 기술 리더로 성장하는 길은 없을까? IT 업계가 계속 성장하면서 전에 없던 팀과 조직의 경계를 넘어서는 큰 문제를 다루게 되...