클린코드 스터디 - 004
4장 함수
나쁜 코드에 주석을 달지 마라. 새로 짜라. - 브라이언 W. 커니핸, P.J 플라우거
주석의 3가지 얼굴
- 잘 달린 주석은 그 어떤 정보보다 유용하다.
- 경솔하고 근거 없는 주석은 코드를 이해하기 어렵게 만든다.
- 오래되고 조잡한 주석은 거짓과 잘못된 정보를 퍼뜨려 해악을 미친다.
우리가 주석을 쓰는 이유?
코드로 의도를 표현하지 못해, 그러니까 ‘실패’ 를 만회하기 위해 주석을 사용한다. 따라서 주석을 달 때마다 자신에게 표현력이 없다는 사실을 푸념해야 마땅하다.
주석을 무시하는 이유 → 거짓말을 하니까!
항상도 고의도 아니지만 너무 자주 거짓말을 하니까, 코드가 오래 될 수록 주석은 멀어진다.
코드는 변화하고 진화한다. 일부가 여기 저기 옮겨지고 나뉘고 갈라지고 합쳐진다.
불행하게도 주석이 코드를 따라갈 수 없다.
주석은 나쁜 코드를 보완하지 못한다
모듈을 짜고보니 짜임새가 엉망이고 알아먹기 어렵다
-> 지저분한 모듈이라는 것을 자각한다
-> 주석을 단다 (X)
-> 주석을 달지 말고 코드를 정리하자!
코드로 의도를 표현하라
주석으로 의도를 담은 경우
// 직원에게 복지 혜택을 받을 자격이 있는지 검사한다.
if((employee.flags & HOURLY_FLAG) && (employee.age > 65)) ...
코드로 의도를 표현한 경우
if(employee.isEligibleForFullBenefits()) ...
좋은 주석
법적인 주석
저작권 정보와 소유권 정보는 필요하고도 타당하다
ex) // Copyright (C) …
정보를 제공하는 주석
때로는 기본적인 정보를 주석으로 제공하면 편리하다.
ex) // 테스트 중인 Responder 인스턴스를 반환한다.
-> 때때로 위와 같은 주석이 유용하다 할지라고 가능하다면 함수 이름에 정보를 담는 편이 좋다
(ex. responderBeingTested)
의도를 설명하는 주석
때대로 주석은 구현을 이해하게 도와주는 선을 넘어 결정에 깔린 의도까지 설명한다.
의미를 명료하게 밝히는 주석
모호한 인수나 반환 값은 그 의미를 읽기 좋게 표현하면 이해하기 쉬워진다.
주석이 올바른지 검증하기 쉽지 않다. 이것이 의미를 명료히 밝히는 주석이 필요한 이유인 동시에 주석이 위험한 이유이기도 하다.
결과를 경고하는 주석
@Ignore 속성을 이용해 테스트 케이스를 꺼버린다.
ex. @Ignore(“실행이 너무 오래 걸린다.”)
TODO 주석
TODO 주석으로 할일을 주석으로 남겨두면 편하다.
//TODO-MdM 현재 필요하지 않다
// 체크아웃 모델을 도입하면 함수가 필요 없다.
protected VersionInfo makeVersion() throws Exception{
return null;
}
그래도 TODO 로 떡칠한 코드는 바람직 하지 않으므로 주기적으로 주석 점검 후 관리
중요성을 강조하는 주석
String listItemContent = match.group(3).trim();
// 여기서 trim은 정말 중요하다. trim 함수는 문자열에서 시작 공백을 제거한다.
// 문자열에 시작 공백이 있으면 다른 문자열로 인식되기 때문이다.
공개 API 에서 Javadocs
나쁜 주석
대다수 주석이 이 범주에 속한다.
허술한 코드를 지탱하거나, 엉성한 코드를 변명하거나, 미숙한 결정을 합리화 하는 등 프로그래머가 주절거리는 독백
주절거리는 주석
특별한 이유 없이 의무감 혹은 하라고해서 마지못해 다는 주석은 바이트만 낭비할 뿐 시간 낭비다.
같은 이야기를 중복 하는 주석
코드보다 읽기 어려운 주석이라면 더 최악! 엔진 후드 열어볼 필요가 없다며 고객에게 아양 떠는 중고차 딜러랑 비슷!
오해할 여지가 있는 주석
의무적으로 다는 주석
아무 의미 없는 내용이 주석으로 담긴다.
이력을 기록하는 주석
형상관리가 있는데 궂이 왜?
있으나 마나 한 주석
전형적인 중복의 내용
너무나 당연한 사실을 언급하여 새로운 정보를 제공하지 못하는 주석
무서운 잡음
함수나 변수로 표현할 수 있다면 주석을 달지 마라
위치를 표시하는 주석
배너는 너무 자주 사용하지 않는다며 눈에 띄며 주의를 환기한다. 그러므로 반드시 필요할 때만, 아주 드물게 사용하는 편이 좋다.
배너를 남용하면 독자가 흔한 잡음으로 여겨 무시 한다.
닫는 괄호에 다는 주석
중첩이 심하고 장황한 함수라면 의미가 있을 지도 모르지만 작고 캡슐화 된 함수에서는 잡음
공로를 돌리거나 저자를 표시하는 주석
형상 관리 시스템에 저장하자
주석으로 처리한 코드
형상 관리 시스템에 저장하다
HTML 주석
최악! html 주석은 IDE 에서 조차 읽기 어렵다.
전역 정보
- 주석을 달아야 한다면 근처에 있는 코드만 기술 할 것
- 시스템의 전반적인 정보를 기술하지 마라.
- 포트 기본 값을 설정하는 코드가 변해도 아래 주석이 변하리라는 보장은 전혀 없다.
모호한 관계
/*
* 모든 필셀을 담을 만큼 충분한 배열로 시작한다 (여기에 필터 바이트를 더한다).
* 그리고 헤더 정보를 위해 200바이트를 더한다.
*/
this.pngBytes = new byte[((this.width + 1) * this.height * 3) + 200];
위의 주석과 아래 코드를 어떻게 매핑해서 이해해야할까?
함수 헤더
짧은 함수는 긴 설명이 필요 없다. 짧고 한 가지만 수행하며 이름을 잘 붙인 함수가 주석으로 헤더를 추가한 함수보다 훨씬 좋다
비공개 코드에서 Javadocs
- 공개 API는 Javadocs가 유용하지만 공개하지 않을 코드라면 Javadocs 는 쓸모가 없다.
- 시스템 내부에 속한 클래스와 함수에 Javadocs를 생성할 필요는 없다.
에라토스테네스의 체
에라토스테네스의 체 - 위키백과, 우리 모두의 백과사전