오늘은 객체지향적인 코드를 위해, 주석 사용을 하지 말아야하는 이유에 대해 말해보자
불분명한 주석, 오래된 주석, 불필요한 정보를 전달하는 주석은
코드 해석을 헷갈리게 만들 수 있다.
"나쁜 코드에 주석을 달지 마라. 새로 짜라."
Brian Wilson Kernighan, Phillip James Plauger
주석 사용을 지양하라고 말하는 가장 큰 이유는
모든 주석을 계속 관리할 수 없기 때문
처음에 주석을 왜 사용하면 안되는지, 사수에게 물어봤을 때, 들은 답변이다.
지속적으로 관리되는 착한 주석은, 얼마든지 사용해도 좋다, 다만, 그건 너무 많은 불필요한 시관과 에너지 비용을 가져가는 일이다.
-> 또한, 내가 보는게 아닌 타인이 볼 때 잘못된 해석을 야기시킬수 있다.
그렇다면, 어떻게 코드에 대한 설명을 기록할 수 있을까..??
코드로 의도를 표현해라
> 주석으로 의도를 표현
// 직원에게 복지 혜택을 받을 자격기 있는지 검사
if ((employee.flags & HOURLY_FLAG) && (Employee.age > 65))
> 코드로 의도를 표현
if (employee.isEligibleForFullBenefits())
출처: https://data-make.tistory.com/634 [Data Makes Our Future:티스토리]
➡️ 주석대신, 코드로 설명하자!
좋은 주석
주석이 꼭 나쁜다는게 아니다.
관리할 수 없는, 명확하지 않은 주석을 사용하지 말자는거지
1. 법적인 주석
- 저작권 정보와 소유권 정보를 담은 주석
2, 정보를 제공하는 주석
// kk:mm:ss EEE, MMM dd, yyyy
Pattern timeMatcher = Patter.compile( "\\d*:\\d*:\\d* \\w*, \\w*, \\w*, \\d*");
// 테스트 중인 Responder 인스턴스를 반환한다.
protected abstract Responder responderInstance();
3. 의도를 설명하는 주석
- 이게 조금 애매한것 같은데, 이 코드가 어떻게 돌아간다~~ 보다 / 이런 목적을 가졌다. 로 이해하면 좋을것 같다.
// 스레드를 대량 생성하는 방법으로 어떻게든 경쟁 조건을 만들려 시도한다.
for (int i = 0; i < 25000; i++) {
WidgetBuilderThread widgetBuilderThread =
new WidgetBuilderThread(widgetBuilder, text, parent, failFlag);
Thread thread = new Thread(widgetBuilderThread);
thread.start();
}
4. 의미를 명확하게 밝히는 주석
- 인수나 반환값이 표준 라이브러리나 변경하지 못하는 코드에 속할 경우
assertTrue(a.compareTo(a) == 0); // a == a
assertTrue(a.compareTo(b) != 0); // a != b
5. 경고하기 위한 주석
- 코드를 보는 다른 개발자에게 경고하기 위한 주석
- 하지만, 아래와 같은 경우는 @Ignore 어노테이션을 이용해서 메세지를 남기는 추세라고 한다.
- @Ignore("실행이 너무 오래 걸린다.")
// 여유 시간이 충분하지 않다면 실행하지 마십시오.
public void _testWithReallyBigFile()
{
writeLinesToFile(10000000);
…
}
6. TODO
- 앞으로 할일
// TODO-MdM 현재 필요하지 않다.
// 체크아웃 모델을 도입하면 함수가 필요 없다.
protected VersionInfo makeVersion() throws Exception
{
return null;
}
TODO 주석은 프로그래머가 필요하다 여기지만 당장 구현하기 어려운 업무를 기술한다.
- 더 이상 필요 없는 기능을 삭제하라는 알림
- 누군가에게 문제를 봐달라는 요청
- 더 좋은 이름을 떠올려달라는 부탁
- 앞으로 발생할 이벤트에 맞춰 코드를 고치라는 주의
7. 중요성을 강조하는 주석
- 대수롭지 않다고 여겨질 뭔가의 중요성을 강조하기 위해 주석을 사용
String listItemContent = match.group(3).trim();
// 여기서 trim은 정말 중요하다. trim 함수는 문자열에서 시작 공백을 제거한다.
// 문자열에 시작 공백이 있으면 다른 문자열로 인식되기 때문이다.
new ListItemwidget(this, listItemContent, this.level + 1);
return buildList(text.substring(math.end()));
8. 공개 API
- 만약 공개 API를 만든다면, 자세하고 친절한 주석이 많은 이들에게 큰 도움이 될거라 생각한다.
- 하지만 이때도, 주석은 정말 신중하게 필요한 정보만 담겨야한다고 생각한다.
요약하자면, 주석은 꼭 필요할때에만 사용해야한다.
즉, 개발자가 주석을 무시하지 못하는 상황을 만들어야한다고 생각한다.
🚀 주석은 그정도로 중요한 부분에만 작성하도록 연습하자!!!
*참고
'Java > 클린 코딩 (with OOP)' 카테고리의 다른 글
5. JAVA 기본 타입 vs 참조 타입 (with 래퍼클래스를 사용해야할 때) ➡️ Integer(Wrapper Class) 보다 int(기본 타입) (0) | 2022.06.14 |
---|---|
4. 정규표현식이란, java 정규식 구성 및 가이드 + [JAVA에서 성능 높이기] (0) | 2022.06.11 |
1. 자바 네이밍 규칙 (java 네이밍 컨벤션) (5) | 2022.06.02 |
0. Google style convention 적용하기 (0) | 2022.06.01 |
[JAVA] 자바 클린 코딩 하기 - 객체지향이기위해 지켜야하는 것들 (0) | 2022.06.01 |