박수완
1. 📌 핵심 개념 정리
✅ 요약하기
-
주석은 나쁜 코드를 보완하지 못한다
코드에 주석을 추가하는 일반적인 이유는 코드 품질이 나쁘기 때문이다.
-
코드로 의도를 표현하라
확실히 코드만으로 의도를 설명하기 어려운 경우가 존재한다. 불행히도 많은 개발자가 이름 코드는 휼륭한 수단이 아니라는 의미로 해석한다. 분명히 잘못된 생각이다.
- 개선 전
if ((employee.flags & HOURLY_FLAG)) && (employee.age > 65)
- 개선 후
if ((employee.isEligibleForFullBenefits())
몇 초번 도 샹걱허묜 코드로 대다수 의도를 표현할 수 있다. 많은 경우 주석으로 달리는 설명을 함수로 만들어 표현해도 충분하다.
-
좋은 주석
-
법적인 주석
각 소스 첫 머리에 주석으로 들어가는 저작권 정보와 소유권 정보는 필여하고도 타당하다.
// Copyright (C) 2003, 2004, 2005 by Object Montor, Inc. All right reserved. // GNU General Public License
-
정보를 제공하는 주석
때로는 기본적인 정보를 주석으로 제공하면 편리하다.
// 테스트 중인 Responder 인스턴스를 반환 protected abstract Responder responderInstance();
-
의도를 설명하는 주석
때로는 주석은 구현을 이해하게 도와주는 선을 넘어 결정에 깔린 의도까지 설명한다.
// 스레드를 대량 생성하는 방법으로 어떻게든 경쟁 조건을 만들려 시도한다. for (int i = 0; i > 2500; i++) { WidgetBuilderThread widgetBuilderThread = new WidgetBuilderThread(widgetBuilder, text, parent, failFlag); Thread thread = new Thread(widgetBuilderThread); thread.start(); }
-
의미를 명료하게 밝히는 주석
일반적으로 인수나 반환값 자체를 명확하게 만들면 더 좋겠지만, 인수나 반환값이 표준 라이브러리나 변경하지 못하는 코드에 속한다면 의미를 명료하게 밝히는 주석이 유용하다.
-
결과를 경고하는 주석
때로 다른 프로그래머에게 결과를 경고할 목적으로 주석을 사용한다.
public static SimpleDateFormat makeStandarHttpDateFormat() { //simpleDateForma은 스레드에 안전하지 못하다. //따라서 각 인스턴스를 독립적으로 생성해야 한다. SimpleDateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z"); df.setTimeZone.getTimeZone("GMT"); return df; }
-
TODO 주석
'앞으로 할 일'을. //TODO 주석으로 남겨두면 편하다. 다음은 함수를 구현하지 않은 이유와 미래 모습을 //TODO 주석으로 설명한 예제다.
// TODO-MdM 현재 필요하지 않다. // 체크아웃 모델을 도입하면 함수가 필요 없다. protected VersionInfo makeVersion() throws Exception { return null; }
-
중요성을 강조하는 주석
자칫 대수롭지 않다고 여겨질 뭔가의 중요성을 강조하기 위해서도 주석을 사용한다.
String listItemContent = match.group(3).trim(); // 여기서 trim은 정말 중요하다. trim 함수는 문자열에서 시작 공백을 제거한다. // 문자열에 시작 공백이 있으면 다른 문자열로 인식되기 때문이다. new ListItemWidget(this, listItemContent, this.level + 1); return buildList(text.substring(match.end()));
-
-
나쁜 주석
-
주절거리는 주석
특별한 이유 없이 의무감으로 혹은 프로세스에서 하라고 하니까 마지못해 주석을 단다면 전적으로 시간낭비다. 주석을 달기로 결정했다면 충분한 시간을 들여 최고의 주석을 달도록 노력한다.
-
같은 이야기를 중복하는 주석
주석이 코드보다 더 많은 정보를 제공하지 못한다. 코드를 정당화하는 주석도 아니고, 의도나 근거를 설명하는 주석도 아니다.
-
오해할 여지가 있는 주석
때때로 의도는 좋았으나 프로그래머가 딱 맞을 정도로 엄밀하게는 주석을 달지 못하기도 한다. 주석에 담긴 '살짝 잘못된 정보'로 인해 시간을 낭비할 수 있다.
-
의무적으로 다는 주석
모든 함수에 Javadocs를 달거나 모든 변수에 주석을 달아야 한다는 규칙은 어리석기 그지 없다. 이런 주석은 코드를 복잡하게 만들며 거짓말을 퍼뜨리고 혼동과 무질서를 초래한다.
-
이력을 기록하는 주석
예전에는 모둔 모듈 첫 머리에 변경 이력을 기록하고 관리하는 관례가 바람직했다. 당시에는 소스 코드 관리 시스템이 없었으니까. 하지만 이제는 혼란만 가중한다.
-
무서운 잡음
함수나 변수로 표현할 수 있다면 주석을 달지 마라
개선 전
// 전역 목록 <smodule>에 속하는 모듈이 우리가 속한 하위 시스템에 의존하는가? if (module.getDependSubsystems().contains(subSysMod.getSubSystem()))
개선 후
ArrayList moduleDependees = smodule.getDependSubsystems(); String ourSubSystem = subSysMod.getSubSystem(); if (moduleDependees.contains(ourSubSystem))
주석이 필요하지 않도록 코드를 개선하는 편이 더 좋았다.
-
-
위치를 표시하는 주석
때때로 프로그래머는 소스 파일에서 특정 위치를 표시하려 주석을 사용한다. 예를 들어, 최근에 살펴보던 프로그램에서 다음 행을 발견했다.
// Actions /////////////////////////////////////////////
이런 주석은 가독성만 낮추므로 제거해야 마땅하다. 특히 뒷부분에 슬래시로 이어지는 잡음은 제거하는 편이 좋다. 너무 자주 사용하지 않을때만 배너는 눈에 띄며 주위를 환기한다. 그러므로 반드시 필요할 때 아주 드몰게 사용하는 편이 좋다.
-
닫는 괄호에 다는 주석
중첩이 심하고 장황한 함수라면 의미가 있을지도 모르지만 작고 캡슐화된 함수에는 잡음일 뿐이다. 그러므로 닫는 괄호에 주석을 달아야겠다는 생각이 든다면 대신에 함수를 줄이려 시도하자.
-
공로를 돌리거나 저자를 표시하는 주석
/* 릭이 추가함 */
소스 코드 관리 시스템은 누가 언제 무엇을 추가했는지 귀신처럼 기억하기 때문에 저자 이름으로 코드를 오염시킬 필요가 없음.
-
주석으로 처리한 코드
this.bytePos = writeBytes(pngIdBytes, 0); //hdrPos = bytePos; writeHeader(); writeResolution(); //dataPos = bytePos; if (writeImageData()) { wirteEnd(); this.pngBytes = resizeByteArray(this.pngBytes, this.maxPos); } else { this.pngBytes = null; } return this.pngBytes;
1960년대 즈음에는 주석으로 처리한 코드가 유용했었지만 우리는 우수한 소스 코드 관리 시스템을 사용하기 때문에 우리를 대신에 코드를 기억해준다. 그냥 삭제하라. 잃어버릴 염려는 없다.
-
HTML 주석
소스코드에서 HTML 주석은 혐오 그 자체다.
-
전역 정보
주석을 달아야 한다면 근처에 있는 코드만 기술하라. 시스템의 전반적인 정보를 기술하지 마라. 해당 시스템의 코드가 변해도 아래 주석이 변하리라는 보장은 전혀 없다. 그리고 심하게 중복된 주석도 확인하자.
/** * 적합성 테스트가 동작하는 포트: 기본값은 <b>8082</b>. * * @param fitnessePort */ public void setFitnessePort(int fitnessePort) { this.fitnewssePort = fitnessePort; }
2. 🤔 이해가 어려운 부분
🔍 질문하기
책을 읽으며 이해하기 어려웠던 개념이나 명확하지 않았던 내용을 정리합니다.
-
개념"코드로또의도를 표현하라"라는 원칙의이름한계- 어려웠던 부분
해당 개념이 헷갈리거나 명확하지 않았던 점을 구체적으로 설명합니다. 궁금한 점해당 개념이 어떤 원리로 동작하는지, 실무에서 어떻게 활용되는지 등을 질문 형태로 정리합니다.
- 어려웠던 부분
코드로
의도를
- 표현할
개념수또는있다고 하지만, 복잡한 비즈니스 로직이나 도메인 지식이 필요한 경우에도 이 원칙의이이름적용될- 수
어려웠던있는지부분.- 궁금
한 점
개념 또는 원칙의 이름어려웠던 부분.궁금한 점.
3. 📚 참고 사항
📢 논의하기
관련된 자료가 있다면 공유하고, 더 깊이 논의하고 싶은 아이디어나 의견을 정리합니다.
관련자료 공유추가 자료관련 블로그 글이나 공식 문서 링크를 제공합니다.
논의하고 싶은 주제
- 주제
논의코드만으로 표현하고기싶은어려운내용경우, 주석을간략적절히정리합니다.활용하는 방법은? - 설명
논의하고복잡싶로직은 이유를에작성합니대한 지식이 부족한 경우 이해하기 힘들다.그렇다면 어느 부분까지가 주석을 달앗을 시 적절할까?
- 주제