[완료] 적당한 주석에 대한 여러 의견을 듣고 싶습니다.

gyutae1990의 이미지

[추가글]
어떻게 주석을 달아야 할 지 오랜 고뇌 끝에
Doxygen 방식을 주석 가이드라인으로 삼게 되었습니다.

질문 코드 case 중 case 1만 Doxygen 방식으로 올려둡니다.

case1(Doxygen 방식)
/**
@return bool : 정상 작동시 true, 아닌 경우 false

@param src_num : 2진 바이너리로 출력 할 값

@brief 10진수 값을 2진수 비트 단위로 출력한다.

@todo 예외 처리 미완
*/
bool DisplayNumToBit(unsigned int src_num) {

//해당 자료형의 비트 갯수 구하기
unsigned int cnt_bit = sizeof(src_num) * 8;

//비트 MSB오프셋 설정
unsigned int bit_offset = 1 << (cnt_bit-1);

//모든 비트 마스크 비트 갯수
unsigned int total_cnt_bit = cnt_bit;

//MSB 부터 최하위까지 반복
for (int i = 1 ; i <= total_cnt_bit ; i++) {

//비트 마스크 연산
if (src_num & bit_offset) {

putchar('1');
}
else {

putchar('0');
}

//8비트 단위로 공백 간격 출력!
if (0 == (i % 8)) {

putchar(' ');
}

bit_offset = bit_offset >> 1;
}

putchar('\n');

return true;
}

=========================================
=========================================
[질문]
주석에 대해 여러 견해가 있더군요.
어떤 의견은 '네이밍을 잘하면 주석은 최소한으로 해도 된다'란 주장과
'아니다 무조건 해야된다' 두가지가 있군요.
코드는 다른 사람이 봤을 때 이해가 잘되게 가독성 있게 짜는게 중요하지 않습니까?

회사에 따라 존재하는 코딩 컨벤션을 참고해도 주석에 대해서는 자세한 가이드가 없고
오픈소스 몇개 봤는데 다 가지각색이군요.

그래서 주석을 달면서 계속 의문이 들어서 제 코드를 올려봅니다.
다른 사람이 보기 편한 코딩을 하라고 하는데 제 코드가 보기 편한지 또한 궁금합니다.

3가지 케이스에 대해 고칠 점 말해주시면 감사하겠습니다.

=========================================
=========================================
case 1:

함수명에 대한 자세한 설명을 함수 위에 해준다.
(과한 걸까요? 아니면 더 나은 함수 설명 주석 방법이 있을까요?)

//------------------------------------------------------------------------
//
// 10진수 값을 2진수 비트 단위로 출력 함수
//
// 첫 번째 인자는 10진수 값
// 두 번째 인자는 진수 변환 및 출력 할 2진수 비트의 단위
// TODO 예외 처리 미완
//------------------------------------------------------------------------------
bool DisplayNumToBit(unsigned int src_num) {

//해당 자료형의 비트 갯수 구하기
unsigned int cnt_bit = sizeof(src_num) * 8;

//비트 오프셋 설정
cnt_bit--;
unsigned int bit_offset = 1 << (cnt_bit);

//최상위 비트 부터 비트단위 출력
//8비트 단위로 출력 간격 둠
unsigned int total_bit = cnt_bit + 2;
for (int i = 1 ; i < total_bit ; i++) {

if (src_num & bit_offset) {

putchar('1');
}
else {

putchar('0');
}

if (0 == (i % 8)) {

putchar(' ');
}

bit_offset = bit_offset >> 1;
}

putchar('\n');

return true;
}

=========================================
=========================================
case2:

모든 로직에 대해 주석은 최대한 보이게 큼지막하게 써준다.
(주석이 코드 로직보다 더 많은 내용을 차지하는데 이게 옳은 걸까요??,
오히려 코드 가독성을 해쳐서 버그가 더 생기지 않을까요??)

while (1) {

//------------------------------------------------------------------------------
// 키보드 값 입력
//
// 사용자가 음수를 입력 할 경우가 존재가능
// 입력값은 long타입으로 받자
// 만일 unsigned int형으로 -1입력 받으면 0xffffffff가 되버리는 참사가 일어난다
//------------------------------------------------------------------------------
long tmp = 0;
puts("비트로 표현 할 값 입력(unsigned int형 범위 내) : ");
scanf_s("%u", &tmp);

//------------------------------------------------------------------------------
// 예외 처리 : 입력 값 유효성 체크
//------------------------------------------------------------------------------
if (tmp < 0 || tmp > UINT_MAX) {

puts("잘못된 유효숫자 입력, 다시 입력하세요\n");
continue;
}
//정상적인 유효숫자 입력한 경우
else {

//unsigned int형으로 타입 캐스팅!
src_num = (unsigned int)tmp;
}

//------------------------------------------------------------------------------
// 10진수 값을 2진수 비트 단위로 출력
//------------------------------------------------------------------------------
if (DisplayNumToBit(src_num)) {

puts("성공!\n");
}
else {

puts("실패!\n");
}
}
}

=========================================
=========================================
case 3

모든 클래스 내부 멤버에 대한 지나치게 자세한 설명 주석

class CTextParser : StringManager
{
private:

//------------------------------------------------------------------------------
// 버퍼 사이즈 설정
//
// :파서 대상 텍스트 최대 읽기 가능 사이즈
//------------------------------------------------------------------------------
typedef enum BUF_SET{
BUF_SIZE = 1000
}BUF_SET;

//------------------------------------------------------------------------------
// 파서 대상 텍스트 경로
//------------------------------------------------------------------------------
char _textPath[100];

//------------------------------------------------------------------------------
// 현재 프로바이더 셋 여부
//
// :현재 검색 가능 프로바이더 범위가 설정된 경우 true
//------------------------------------------------------------------------------
bool _bProvider;

//------------------------------------------------------------------------------
// 시작 프로바이더 공간 포인터
//
// :텍스트 파서 대상에서 읽어온 버퍼 내 해당 프로바이더 내부 공간 시작 주소
// :프로바이더 내부 기호'{' 이후의 버퍼 주소
//------------------------------------------------------------------------------
char *_ptr_provider;

//------------------------------------------------------------------------------
// 현재 프로바이더 명
//------------------------------------------------------------------------------
char _provider_name[100];

//------------------------------------------------------------------------------
// 버퍼 선언
// 입력받은 텍스트 길이 선언
//------------------------------------------------------------------------------
char _text_buf[BUF_SET::BUF_SIZE];
int _cnt_char;// 텍스트 길이

=========================================
=========================================
읽어주셔서 감사합니다.

a익명의 이미지

코드를 보면 그 코드가 뭐하는 코드인지 아는 경우 주석이 필요없어요.

예를 들어,
1부터 100까지 더하는 방법은
for 문으로 루프 돌리는 방법이 있는데
이런 경우 주석이 필요없고

100 * (100 + 1) / 2
n * (n + 1) / 2

이런 공식으로 한방에 구하는 코드는 어떤 사람은 모를 거에요
이런 경우는 1부터 n까지 더하는 코드라고 주석을 붙여주면 다른 사람이 이해하기 좋죠.

그리고 순차적, 절차적으로 진행되는 코드가 대부분일텐데

main

initialize

do_something1

do_something2

finalize

이런 식으로 함수로 만들어주면 주석이 필요 없습니다
그럼에도 불구하고 이해하기 어렵다면 주석을 붙여야겠죠.
사실 코드 자체가 주석이나 마찬가지에요.
주석문 없이 코드를 이해하기 어렵다면, 코드에 문제가 있거나 코드를 보는 사람이 실력이 없거나 둘 중 하나라고 생각합니다.

그리고 예를 들어 텍스트 길이 변수 이름을 text_len 이렇데 하면 텍스트 길이라는 주석을 붙일 필요가 없죠

gyutae1990의 이미지

자세한 것은 한국어를 통해 구글 검색 하시면 잘 나옵니다.

주석 가이드라인이 되어주고 코드에 미학을 살려주어 코드 가독성도 좋아집니다.
(물론 주석 다는 일이 조금 번거로울 수 있습니다.)

Doxygen 최고 장점은 코드를 문서화 해줍니다.
추천드립니다.

아래 첨부파일은 Doxygen을 통한 자동문서화 캡쳐입니다.
댓글 달아주신 익명분 감사합니다.

댓글 첨부 파일: 
첨부파일 크기
Image icon Doxygen!.PNG49.77 KB

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.