"의견은 코드 냄새입니다"[닫힘]


100

내 동료를 믿고 어떤 에서 코드 주석의 사용 (즉,하지의 javadoc 스타일의 메소드 나 클래스 코멘트)을 인 코드 냄새 . 어떻게 생각해?


44
"아니오"라고 답을 올리려고합니다.
니콜

2
@Renesis 그것은 신의 냄새입니다.
ixtmixilix

107
동료가 포괄적 인 일반화를 만들었으므로 자동으로 그가 틀렸다는 의미입니다. :)
Alex Feinman

5
@Mongus, 동의하지 않습니다. 귀하의 예제에서 주석은 주석이기 때문에 좋지 않지만 주석에 너무 가깝기 때문에 변경됩니다. 그들은 WHAT가 아니라 WHY 라고 말해야 합니다.

5
@Alex, 그것은 전체적인 일반화가 아니기 때문에 잘못된 것입니다 (어쨌든 그에게 잘못되지 않음)?

답변:


167

주석이 코드의 기능을 설명하는 경우에만 해당됩니다.

메소드 또는 블록에서 무슨 일이 일어나고 있는지 알고 싶다면 코드를 읽습니다. 어쨌든 주어진 프로젝트를 수행하는 모든 개발자가 개발 언어에 익숙해 져 작성된 내용을 읽고 이해하고 있기를 바랍니다.

극단적 인 최적화의 경우, 누군가 코드를 수행하기가 어려운 기술을 사용하고있을 수 있습니다. 이러한 경우 주석은 왜 그러한 최적화가 필요한지뿐만 아니라 코드가 수행하는 작업을 설명하는 데 사용될 수 있습니다. 경험 언어와 프로젝트에 익숙한 다른 사람 (또는 다른 여러 사람)이 코드를 살펴 보도록하는 것이 좋습니다. 이유와 방법을 모두 이해할 수없는 경우 이유와 방법을 모두 설명해야합니다. 방법.

그러나 코드에서 명확하지 않은 것은 무언가를 한 이유입니다. 다른 사람들에게 분명하지 않은 접근 방식을 취한다면, 왜 결정을 내 렸는지 설명하는 의견이 있어야합니다. 나는 사람들이 당신이 Y 대신 X를 왜했는지 알고 싶어하는 코드 검토와 같은 후에 주석이 필요하다는 것을 알지 못할 것이라고 생각할 것입니다. 앞으로.

그러나 가장 중요한 것은 코드를 변경할 때 주석을 변경하는 것입니다. 알고리즘을 변경하는 경우 알고리즘 X를 Y로했던 이유를 주석으로 업데이트하십시오. 오래된 주석은 코드 냄새가 훨씬 큽니다.


8
나는이 답변에 대한 의견에 동의하지만 문서의 부족에 대한 변명으로 잘못 인용 된 것을 보았습니다. 코드를 읽는 것은 때때로 엉덩이에 고통입니다. 당신은 안 가지고 하는 방법이 그 방법은 무엇 파악하기위한 코드를 볼 수 있습니다. 이름에서 알아낼 수 있고 문서에서 더 자세한 정보를 얻을 수 있어야합니다. 코드를 읽을 때 종종 클래스에서 클래스로, 파일에서 파일로 전환해야합니다. 특히 동적 언어에서는이 문제를 모두 처리 할 수있는 IDE를 작성하는 것이 쉽지 않은 문제입니다.
davidtbernal

1
어쨌든, 때로는 복잡한 경우 (특히 최적화되었거나 다른 종류의 사소한 작업이 아닌 경우) HOW에 대해 언급해야합니다. 내가하는 일을 이해하기 위해 한 블록의 코드를 읽는 데 5 분 이상을 소비해야한다면 상당히 실망 스러울 수 있습니다 ...
Khelben

3
"주석이 코드의 기능을 설명하는 경우에만" 또는 주석이 코드가 무엇을했는지 설명한다면; 코드는 변경되었지만 주석은 변경되지 않았습니다.
브루스 Alderman

1
귀하의 의견이 올바른지 어떻게 테스트합니까? 의견을 테스트로 작성해보십시오. 미래의 모든 관리자는 테스트를 코드의 검증 가능한 문서로 사용할 수 있습니다. 주석이 코드 실행과 관련이 있다면, 그 내용은 / 어서 트되어야한다. 주석이 코드의 실행과 아무 관련이 없다면, 프로그래머 만이 볼 수있는 코드에서 주석은 무엇입니까?
flamingpenguin

2
@ back2dos, 다른 사람들의 코드를 읽을 때 자주 구토를하면 사무실을 공유하지 않아서 기쁘다 ...

110

이것은 현재 듣고있는 것에 특히 자극적입니다. 저는 이번 주말에 연구 알고리즘 (실제로 출판되지 않은)을 구현하는 매우 유명하고 매우 깨끗하고 주석 처리되지 않은 코드를 살펴 보았습니다. 나는 그것에 익숙해 져 있고, 내 옆에 앉아있는 사람은 발명가 였고 코드는 몇 년 전에 다른 사람에 의해 작성되었습니다. 우리는 간신히 따를 수있었습니다 .

동료는 경험이 충분하지 않습니다.


16
나는 따르기 어려운 "잘 정돈 된, 매우 깨끗하고 주석 처리되지 않은 코드"에 대해 궁금하다. 내가 그렇게 분류 할 코드는 매우 쉽게 따라갈 수 있습니다. 나는 분명히 "당신의 동료가 충분히 경험이 충분하지 않다"는 것은 아닙니다.
Liggy

8
@Liggy : 그렇습니다. 업무용 응용 프로그램이 아니라 연구 알고리즘입니다.
Paul Nathan

9
한 번은 데이터베이스 열 개체 (타사)의 필드를 "잘못된"순서 (프로세스의 "논리적"및 코딩 표준에 의해 정의 됨)로 필드를 채워야하는 코드 조각이있었습니다. 순서대로 수행하십시오. 일반적으로 사용하면 충돌이 발생합니다. 코드를 읽는 양이 당신에게 이것을 말할 수 없었기 때문에 긍정적으로, 절대적으로 주석을 달아야했습니다. 최소한 우리가 통제 할 수있는 코드가 아닌 냄새가 아니 었습니다 (결론). 주석이 완전하고 완전하지 않으면 주석이 좋지 않은 것처럼 냄새가납니다.
Murph

29
수학, 수학, 수학. 모든 코드가 사소한 IoC 접착제와 '가격 * 수량'을 구현하는 것은 아닙니다. 복잡한 수학은 스스로 설명하기 위해 마술처럼 만들 수 없습니다.
bmargulies

4
@Liggy, 복잡한 데이터 구조를 구현하는 코드는 광범위한 문서화 없이는 완전히 이해할 수 없습니다.

75

의견은 방법이 아닌 이유를 설명해야합니다.

How타입 주석은 일반적으로 리팩토링을 사용하는 것이 좋습니다. 개인적으로, 나는 보통 리팩토링에 찬성하는 의견을 피합니다.

전에:

# convert to cents
a = x * 100

# avg cents per customer 
avg = a / n

# add to list
avgs < avg
t += 1

후:

total_cents = total * 100
average_per_customer = total_cents / customer_count

track_average(average_per_customer)

26
이 예제에서 왜 일부가 아닌지, 리팩토링이 작동하는 이유에 동의하지만 더 복잡한 코드를 사용하면 변수 / 함수 이름 바꾸기 / 리팩토링의 양이 완벽하게 이해되지 않으며 의견이 여전히 필요합니다.
GSto

3
좋은 예이지만 왜 시스템이 달러가 아닌 센트로 작동합니까? 이 질문은 분수 통화가 시작되는 금융 시스템과 관련이 있습니다.
rjzii

3
@Stuart 함수의 이름은 무엇을해야하는지 말해야합니다.
Alb

3
@GSto, 나는 더 이상 동의하지 않았다. 코드가 복잡한 경우 작업을 설명하는 적절한 이름을 가진 더 작은 메서드 / 함수로 분리해야합니다.
CaffGeek

1
코드베이스에 대한 완전한 제어 권한이 있다고 가정합니다.
LennyProgrammers

32

나는 당신의 동료를 이단자로 선언합니다! 내 이단자 부츠는 어디에 있습니까?

강박 관념은 나쁘고 유지 보수 두통이며, 주석은 잘 명명 된 방법, 클래스, 변수 등을 대체하지 않습니다. 그러나 때로는 무언가가 왜 그런 방식으로 코드를 유지해야하는 가난한 바보에게 큰 가치가있을 수 있습니까? 6 개월 동안, 특히 가난한 바보가 당신이되어 버렸을 때.

내가 작업중 인 코드의 실제 의견 :


    // If this happens, somebody's been screwing around with the database definitions and
    // has removed the restriction that a given alarm may have only one entry in the 
    // notifications table.  Bad maintenance programmer!  Bad!  No biscuit!



    // If an alert is active on our side but inactive on theirs, that might mean
    // they closed the alert.  (Or that we just haven't told them about it yet.)  The
    // logic comes later; for now, we'll just compile it in a list.



    // If we know for a fact that an alarm isn't getting through, we're going to whine pretty
    // aggressively about it until it gets fixed.


7
좋은 댓글 +1 "이런 일이 발생하면 누군가 데이터베이스 정의를 망쳐 놓고 있었다"고 말할 수있는 코드는 없습니다.
DistantEcho

9
@Niphra, 글쎄, 우리 던질 수 있었다SomebodyScrewedAroundWithDatabaseException ...

@ Thorbjørn +1, 만약 코드가 틀렸다는 것을 알고 있다면 그것을보고하십시오. 고객은 기술 지원 담당자가 DB를 다시로드 할 수 있으며 서비스 요청을 피할 수 있습니다.
Tim Williscroft

@Tim, 고객이 이것을 볼 수 있듯이 더 중립적 인 이름 지정이 적절할 수 있습니다.

3
물론, 어리석은 이름은 사용하지 마십시오. 고객은 항상 볼 수 있습니다.
Tim Williscroft

29

이상적으로 코드는 코드가 잘 작성되어 자동 설명이되어야합니다. 현실에서 우리는 또한 매우 높은 품질의 코드도 때때로 주석을 달아야한다는 것을 알고 있습니다.

반드시 피해야 할 것은 "코멘트 코드 리던던시"(코딩에 아무것도 추가하지 않은 코멘트)입니다.

i++; // Increment i by 1

그런 다음, 좋은 (및 유지 / 정렬 된) 코드 디자인과 문서가 있다면 주석 달기가 훨씬 유용하지 않습니다.

그러나 어떤 상황에서는 주석이 코드 가독성에 도움이 될 수 있습니다.

while( foo )
{
     if( dummy )
     {
     }
     else // !dummy
     {
     }
} // end while( foo )

코멘트를 유지하고 동기화해야한다는 것을 잊지 마십시오. 오래되거나 잘못 된 코멘트는 끔찍한 고통이 될 수 있습니다! 그리고 일반적으로 댓글을 너무 많이 넣으면 프로그래밍이 잘못 될 수 있습니다.


2
좋은 명명 규칙과 체계적인 코드는 주석의 필요성을 줄이는 데 도움이됩니다. 추가 한 각 주석 줄은 유지해야 할 새로운 줄이라는 것을 잊지 마십시오!
Gabriel Mongeon

81
사람들이 귀하의 질문에 두 번째 예를 사용하는 것을 싫어합니다. } //end whilewhile 루프의 시작이 너무 멀어서 그것을 볼 수도 없으며,보고있는 코드가 루프에 있다는 힌트는 없습니다. 코드가 어떻게 구성되어 있는지에 대한 의견보다 무거운 리팩토링이 선호됩니다.
카슨 마이어스

4
@Carson : 블록을 짧게 유지하는 것이 잘 알려진 규칙이지만 항상 적용 할 수있는 것은 아닙니다.
Wizard79

4
@Carson : 내가 작업하는 프로젝트 중 하나가 코드 검토가 충분하지 않아 "OMFG JUST KILL YOURSELF"의 순환 복잡성을 갖는 JSP 콜렉션으로 이어집니다. 피의 물건을 리팩토링하는 것은 다른 곳에서 보내야하는 일의 일을 나타냅니다. 이러한 } // end while의견은 생명의 은인이 될 수 있습니다.
BlairHippo

11
@BlairHippo : "[A] 코드 냄새는 더 깊은 문제를 나타내는 프로그램의 소스 코드에서 발생하는 증상입니다." 물론 의견은 생명의 은인입니다,하지만 OMGWTF 루프는 명확한 지표 상기 "더 깊은 문제"와 생명의 은인의 필요성입니다)
back2dos

26

방법이나 프로세스를 "코드 냄새"로 분류하는 것은 "열심 한 냄새"입니다. 이 용어는 새로운 "유해한 것으로 간주"되고 있습니다.

이 모든 것들이 지침이되어야한다는 것을 기억하십시오.

다른 답변들 중 다수는 의견이 언제 보장되는지에 관해 좋은 조언을합니다.

개인적으로 나는 의견을 거의 사용하지 않습니다. 불명확 한 프로세스의 목적을 설명하고 수 주간의 조정이 필요한 자체적 인 변경을 고려하고있는 사람에게 간혹 사망에이를 수 있습니다.

유치원생이 시간을 효율적으로 사용하지 못할 수도 있고 더 간결한 버전을 수행하지 못할 수도 있음을 이해할 때까지 모든 것을 리팩터링하십시오.

주석은 런타임에 영향을 미치지 않으므로 고려해야 할 유일한 부정적인 문제는 유지 관리입니다.


8
나는 "반 패턴"이 새로운 "유해한 것으로 간주된다"고 생각했다. 코드 냄새는 가능한 정리를 위해 면밀한 검토가 필요한 것입니다.
Jeffrey Hantin

1
반 패턴도 자격이 있다는 데 동의하지 않습니다. 디자인이 복잡하여 의도적으로 선택하는 경우 냄새 대신 안티 패턴을 사용하여 이러한 방식으로 사용됩니다. 어쨌든 나는 이것들에 대한 올바른 근원이 있다는 개념에 동의하지 않습니다.
Bill

4
"유치원이 이해할 수있을 때까지 모든 것을 리팩토링하면 시간을 효율적으로 사용하지 못할 가능성이 높으며 더 간결한 버전뿐만 아니라 성능도 떨어질 수 있습니다."
Earlz

23

어떤 경우에는 주석, 리팩토링 등으로 인해 주석을 대체 할 수 없습니다. 이 실제 예를 살펴보십시오 (언어는 Groovy입니다).

  response.contentType="text/html"
  render '{"success":true}'

이상하게 보입니까? 아마도 복사 붙여 넣기 오류입니까? 버그 수정에 대한 외침?

이제 주석과 동일합니다.

  // DO NOT TOUCH THE FOLLOWING TWO LINES; the ExtJS UploadForm requires it exactly like that!!!
  response.contentType="text/html"  // must be text/html so the browser renders the response within the invisible iframe, where ExtJS can access it
  render '{"success":true}'         // ExtJS expects that, otherwise it will call the failure handler instead of the succss handler

function prime_extjs_uploadform () {response.contentType = 'text / html'; 렌더 '{ "성공": true}'; } prime_extjs_uploadform ();
DrPizza

23

여기서 가장 중요한 문제는 "코드 냄새"라는 용어의 의미입니다.

많은 사람들 (당신을 포함하여 생각합니다)은 코드 냄새가 오류에 가깝거나 적어도 수정 해야하는 것으로 이해합니다. 아마도 당신은 이것을 "반 패턴"과 동의어로 생각할 것입니다.

이것은 용어의 의미가 아닙니다!

코드 냄새 은유는 Wards Wiki 에서 비롯된 것으로 다음 과 같이 강조합니다.

CodeSmell은 확실하지 않은 문제 일 수 있음을 암시합니다. 완벽하게 좋은 관용구는 종종 잘못 사용되거나 대부분의 경우 작동하는 더 간단한 대안이 있기 때문에 CodeSmell으로 간주 될 수 있습니다. CodeSmell을 호출하는 것은 공격이 아닙니다. 그것은 더 자세히 살펴볼 필요가 있다는 표시 일뿐입니다.

따라서 주석이 코드 냄새라는 것은 무슨 의미입니까? 즉, 주석을 볼 때 잠시 멈추고 다음과 같이 생각해야합니다. "음, 뭔가 개선 될 수 있다는 힌트를 느낍니다." 아마도 변수의 이름을 바꾸거나 "추출 방법"-리팩토링을 수행하거나 주석이 실제로 최상의 솔루션 일 수 있습니다.

이것이 주석이 코드 냄새라는 의미입니다.

편집 : 나는이 두 기사를 숙달했다.


2
이 답변이 나오기까지 2 개월이 걸렸다는 놀랐습니다. 용어의 오해가 얼마나 널리 퍼져 있는지 보여줍니다.
Paul Butcher

일반적인 사례 주장은 여전히 ​​잘못되었습니다. "댓글이 표시된 코드가 표시됩니다. 나쁜 징조입니다."
스튜어트 P. 벤틀리

1
@ 스튜어트 : 당신은 적절한 수준의 주석이있는 두 개의 코드 덩어리를보고 있습니다. (이 문제는 적절한 주석 수에 관한 것이 아니라 주석 수에 따라 코드를 판단하는 방법에 관한 것입니다.) 하나는 주석이없고 다른 하나는 톤이 있습니다. 어느 쪽을 더 자세히 보십니까? -주석은 코드가 복잡하고 미묘하여 문제가있을 가능성이 높다는 신호입니다.
David Schwartz

이것이 정답입니다.
vidstige

21

규칙은 매우 간단하다고 생각합니다. 코드를보고있는 낯선 사람을 상상해보십시오. 아마도 5 년 안에 자신의 코드에 익숙하지 않을 것입니다. 이 낯선 사람의 코드를 이해하려는 정신적 인 노력을 최소화하십시오.


8
이 경험 오랫동안 하나의 프로젝트에 참여하지 않은 어떤 디바이스로 하나는,이 날 믿어 것이다 일어난다. 나는 이것을 열심히 배우고 자신의 코드를 다시 배워야 할 때마다, 나는 다른 것으로 넘어 가기 전에 같은 실수를 두 번하고 주석을 달지 못하게합니다.
니콜

아니요, 거주 지역을 아는 정신병자를 상상해야합니다. 코드를 유지하는 것이 행복할까요?
Richard

4
읽을 수없는 코드를 볼 때 정기적으로 사이코 패스가됩니다.
LennyProgrammers

3
5 년? 5 분 정도 더요 ;)
Alex Feinman

11

올바른 의견을 갖는 것은 의견을 쓰는 것으로 시작하는 것이 좋습니다.

// This function will do something with the parameters, 
// the parameters should be good according to some rules.
myFunction(parameters)
{
    // It will do some things to get started.

    // It will do more with the stuff.

    // It will end doing things with the stuff.
}

이렇게하면 주석을 제거하기 위해 메소드를 쉽게 추출 할 수 있습니다
. 코드에서 이러한 내용을 알려주십시오 ! 이 방법이 아주 좋은 방법으로 다시 쓰여지는 방법을 확인하십시오

// This function will do something with the parameters, 
// the parameters should be good according to some rules.
myfunction(parameters)
{
  var someThing = initializedWithSomething;

  doSomethingWith(someThing);

  doMoreWith(someThing);

  endDoingThingsWith(someThing);

  return someThing;
}

// This function will do some things to get started,
// the parameters should be good according to some rules.
doSomethingWith(parameters)
{
  parameters.manipulateInSomeWay();
  ... etc ...
}

... etc ...

분리 할 수없는 것들에 대해서는 메소드를 추출하지 말고 주석 아래에 코드를 입력하십시오.

이것이 내가 주석을 최소로 유지하는 데 유용한 방법으로 보는 것입니다. 각 행에 주석을다는 것은 실제로 쓸모가 없습니다 ... 마법의 값 초기화에 관한 것 또는 그것이 의미가있는 곳이라면 한 줄만 문서화하십시오.

매개 변수를 너무 많이 사용하면 클래스의 개인 구성원이어야합니다.


1
이것이 제가하는 것입니다. 의견이 필요하다고 생각되면이를 대체로 사용해 보는 것이 좋습니다.
bzlm

10

나는 대답이 일반적인 "그것은 달려있다"고 생각합니다. 코드를 주석 처리하는 코드 주석은 냄새입니다. 엄청나게 빠른 모호한 알고리즘을 사용하기 때문에 코드 주석 처리를하면 유지 보수 프로그래머 (일반적으로 작성 후 6 개월 후)가 코드를 훑어 보는 일의 절반을 절약하여 코드의 내용을 파악할 수 있습니다.


10
// Dear me in the future. Please, resolve this problem.

또는

// You think this code was written by somebody else. 
// No, it wasn't. You ([some name]) did it.

아, 진심으로 미래의 자아를 간청합니다.
Anthony Pegram

8

코드 주석은 "코드 냄새"가 아닙니다. 이 신념은 일반적으로 주석이 오래되어 (유효하지 않음) 유지하기 어려울 수 있다는 사실에서 비롯됩니다. 그러나 코드가 특정 방식으로 수행되는 이유를 설명하는 좋은 설명이 있으면 유지 관리에 중요 할 수 있습니다.

주석을 잘 작성하면 코드가 수행하는 작업을 이해하기 쉽고 특정 방식으로 수행하는 이유를 더 중요하게 이해할 수 있습니다. 주석은 프로그래머가 읽어야하며 명확하고 정확해야합니다. 이해하기 어렵거나 잘못된 의견은 전혀 의견이없는 것보다 낫지 않습니다.

코드에 명확하고 정확한 주석을 추가하면 코드 섹션의 "무엇"과 "왜"를 이해하기 위해 메모리에 의존 할 필요가 없습니다. 이것은 나중에 해당 코드를 보거나 다른 사람이 코드를보아야 할 때 가장 중요합니다. 주석은 코드의 텍스트 내용의 일부가되므로 명확하게 작성하는 것 외에도 훌륭한 작성 원칙을 따라야합니다.

좋은 의견을 쓰려면 코드의 목적 (이유가 아닌)을 문서화하고 코드의 원인과 논리를 최대한 명확하게 표시하도록 최선을 다해야합니다. 코드 작성과 동시에 주석을 작성하는 것이 이상적입니다. 기다리면 다시 돌아가서 추가하지 않을 것입니다.

스는 24 시간 동안 Visual C # 2010을 가르친다 , pp 348-349.


1
주석은 오래 될 수 있지만 클래스, 함수 및 변수 이름의 의미와 같이 컴파일러 또는 단위 테스트로 확인되지 않은 모든 항목에 적용됩니다.
LennyProgrammers

@ Lenny222 : 그렇습니다. 주석은 부실해질 수 있습니다. 일반적으로 게으른 프로그래머를 나타냅니다. 의견이 결정이 내려진 이유, 코드가 계산을 위해 특정 알고리즘을 사용하는 이유 또는 코드의 기능을 설명하는 이유를 설명하는 경우 구현을 변경하고 그에 따라 주석을 업데이트하지 않는 것 외에는 주석이 부실한 이유가 없습니다. -게으른 것과 같습니다.
Scott Dorman

2
동의한다. 내 요점은 그것이 오래되지 않을 위험이 있다는 것입니다. 그러나 doBar () 함수가 있고 3 년 후에는 "막대"를 수행하지 않지만 "수요일을 제외하고 막대와 foo를 수행"하면 함수의 의미도 오래 쓸 수 있습니다. 그리고 변수 이름. 그러나 아무도 함수와 변수에 의미있는 이름을주지 않기 위해 이것을 취하지 않기를 바랍니다.
LennyProgrammers

6

라이브러리 (타사 라이브러리 또는 컴파일러와 함께 제공되는 라이브러리)에 존재하는 문제를 피하기 위해 코드가 특정 방식으로 작성된 경우 코드를 주석 처리하는 것이 좋습니다.
예를 들어, 이후 버전에서, 또는 새로운 버전의 라이브러리를 사용하거나, PHP4에서 PHP5로 전달할 때 변경해야하는 코드에 주석을 추가하는 것이 좋습니다.


6

가장 잘 쓰여진 책조차도 여전히 소개와 장 제목을 가지고있을 것입니다. 잘 문서화 된 코드의 주석은 여전히 ​​고급 개념을 설명하고 코드 구성 방법을 설명하는 데 유용합니다.


이런 종류의 주석은 멋진 시각적 신호를 제공하므로 찾고있는 섹션의 시작 부분을 찾기 위해 모든 줄을 읽을 필요는 없습니다. 할아버지가 말했듯이 "모든 것이 적당합니다."
Blrfl

4

반 패턴은 다음과 같습니다.

필자는 때때로 FLOSS 라이센스 프리 앰프가 파일 문서 대신 자주 사용된다는 인상을 받았습니다 . GPL / BSDL은 훌륭한 필러 텍스트를 만들고, 그 후에는 다른 주석 블록을 거의 볼 수 없습니다.


4

코드를 설명하기 위해 주석을 작성하는 것이 좋지 않다는 생각에 동의하지 않습니다. 이것은 코드에 버그가 있다는 사실을 완전히 무시합니다. 주석없이 코드 하는 일이 분명 할 수 있습니다 . 그것은 코드가 무엇 분명히 덜 가능성이 높습니다 가정 할 수 있습니다. 의견이 없으면 결과가 잘못되었거나 잘못 사용되고 있는지 어떻게 알 수 있습니까?

주석은 코드 의 의도 를 설명해야 하므로 실수가있을 경우 주석 + 코드를 읽는 사람이 코드를 찾을 수 있습니다.

코드를 작성 하기 전에 인라인 주석을 작성하는 것이 일반적 입니다. 이렇게하면 내가 할 코드를 작성하려고하는 것이 명확하고 수행하려는 작업을 실제로 알지 않고도 알고리즘에서 손실되는 것을 줄일 수 있습니다.


1
단위 테스트는 결과가 잘못된 지 판단하는 데 도움이됩니다. 일부 코드를 읽고 실제로 Y를 할 때 X를 수행한다고 생각하면 코드가 읽을 수있는 방식으로 작성되지 않았을 수 있습니다. 결과가 잘못 사용되었다는 것이 어떤 의미인지 잘 모르겠습니다. 주석은 이상한 방식으로 코드를 소비하는 사람으로부터 보호되지 않습니다.
Adam Lear

"일부 코드를 읽고 실제로 X 일 때 X를 수행한다고 생각하면 Y를 수행합니다." 나는 코드가 무엇인지 이해에 대해서 이야기하고 수행 할 수 있지만 것없는 것을 가정 할 수 있습니다. 한 번에 하나씩 오류가 의심된다고 가정 해 봅시다. 한 번에 하나씩 오류가 소비 코드 또는이 코드에 없다는 것을 어떻게 알 수 있습니까? 주석은 코드 의 의도 를 설명하여 버그를 추적하는 데 큰 도움이됩니다.
Danny Tuppeny

반면에 주석은 주석이 작성된 시점에서 코드가 수행 한 작업 만 알려줍니다 . 코드 자체가 지금 해야 할 일을 알려줄 수 있습니다 . 주석이 컴파일되지 않습니다. 댓글을 테스트 할 수 없습니다. 정확하거나 정확하지 않을 수 있습니다.
Anthony Pegram

3

누군가가 한 가지 방법으로 700 줄을 갖는 것이 좋다고 생각하기 때문에 넣는 의견은 냄새입니다.

당신이 코멘트를하지 않으면 알고 있기 때문에 거기에있는 코멘트, 누군가가 다시 같은 실수를 할 것입니다 다시 냄새입니다.

일부 코드 분석 도구는 냄새도 요구하기 때문에 주석이 달렸습니다.

하지 않습니다 사람들 이제까지 코멘트에 넣어, 또는 다른 개발자들에게 조금이라도 도움을 쓰기도 냄새입니다. 나는 많은 사람들이 물건을 쓰지 않을 것에 놀랐지 만, 3 개월 전에 그들이 한 일을 기억하지 못한다고 인정할 것입니다. 나는 문서를 쓰는 것을 좋아하지 않지만 사람들에게 똑같은 것을 계속해서 더 적게 말하고 싶습니다.


3

나는 내 자신의 질문에 대답 할 것이다. 주석 처리되지 않은 코드에서 버그를 찾을 수 있습니까?

tl; dr : 코드를 관리 할 다음 사람은 당신처럼 신이 아닐 수도 있습니다.

 [org 0x7c00]

 main:
  mov ah, 0x0e
  mov bx, string
  call strreverse
  call print

 stop:
  jmp $

 strreverse:
  pusha
  mov dx, bx
  mov cx, 0

 strreverse_push:
  mov al, [bx]
  cmp al, 0
  je strreverse_pop
  push ax
  add bx, 1
  add cx, 1
  jmp strreverse_push

 strreverse_pop:
  mov bx, dx

 strreverse_pop_loop:
  cmp cx, 0
  je strreverse_end
  pop ax
  mov [bx], al
  sub cx, 1
  add bx, 1
  jmp strreverse_pop_loop

 strreverse_end:
  popa
  ret

 print:
  pusha

 print_loop:
  mov al, [bx]
  cmp al, 1
  je print_end
  int 0x10
  add bx, 1
  jmp print_loop

 print_end:
  popa
  ret
 string:
  db 'Boot up', 0

 times 510 -( $ - $$ ) db 0
 dw 0xaa55

그러나이 시대에 당신은 높은 수준의 언어를 사용하지 않습니까?
Ian

2
@Ian : 프로그램은 IBM-PC 부트 로더입니다. 당신은 할 수없는 이 프로그램이 마지막 단락이 나타납니다 RAM에 있으며 정확한 위치의 전체 제어를 필요로하기 때문에, 조립 이외의 그것을 쓰고, 하드웨어 인터럽트의 일부. 진심으로, NASM 사본을 얻으십시오. 플로피 또는 USB 스틱의 부팅 섹터에 기록한 후 부팅하십시오. 아마도 버그 때문에 예상대로 작동하지 않을 것입니다. 이제 버그를 찾으십시오 ... 어쨌든, 20 년 후에 사람들은 주석 처리되지 않은 Java와 같은 것을 요청할 것입니다.
앤트

분명히 코드는 C 또는 C ++로 작성 될 수 있고 바이너리는 C 객체 코드 및 일부 외부 도구로 어셈블 될 수 있습니다.
케빈 클라인

불행히도. CodeProject에서이 페이지를 살펴보십시오. codeproject.com/KB/tips/boot-loader.aspx- "고급 언어에는 필요한 지침이 없습니다." 뿐만 아니라 부트 로더에서 512 바이트 만 사용할 수 있습니다. 때로는 하드웨어로 직접 가야합니다.
Ant

1
어셈블리를 코딩 할 때 다른 모든 사람들이하는 일을 할 것입니다-모든 작업에 대해 한 줄씩 주석하십시오. 코드에서 C 스타일의 0으로 끝나는 문자열을 사용하므로 문제의 줄에 "문자가 0인지 확인"이라는 주석이 표시됩니다. 이 주석이 있으면 코드가 1로 cmp를 수행하고 있음을 쉽게 알 수 있습니다. 즉, 무한 루프에 갇히거나 RAM에서 임의 1에 도달 할 때까지 쓰레기를 인쇄합니다. 또한 문자열이 0으로 종료되었다는 사실에 대한 의견을 추가했을 수도 있습니다. 이는 코드에서 분명하지 않습니다. 어셈블리 코딩을위한 자동화 된 단위 테스트와 같은 것이 있습니까?
개미

2

코드와 주석 사이의 균형을 유지해야합니다 ... 일반적으로 코드 블록을 재개하는 주석을 추가하려고합니다. 코드를 이해할 수 없기 때문이 아니라 (자신의 코드도 더 빨리 읽을 수 있기 때문에) 내 코드를 더 빨리 읽고 중요한 부분이있는 특정 섹션을 찾을 수 있기 때문입니다.

어쨌든 내 자신의 개인적 기준은 "의심 할 때, 논평"이다. 나는 이해할 수없는 완전히 암호 줄보다 중복 줄을 선호합니다. 잠시 후 코드 검토에 대한 주석을 항상 삭제할 수 있습니다 (그리고 나는 보통)

또한 주석은 "주의! 입력의 형식이 ASCII가 아닌 경우이 코드를 변경해야합니다."와 같은 "캐비티"를 추가하는 데 도움이됩니다.


"코드 블록을 재개하는 주석"이 의미하는 바를 설명해 주시겠습니까?
Mark C

2

이것을 읽으면서 나는 수십 년 전에 처음 읽은 것 (더 긴 목록에서 사본을 가져와 보존 됨)을 생각 나게합니다.

실제 프로그래머는 주석을 쓰지 않습니다. 쓰기가 어려운 경우 읽기가 어렵습니다.

다소 오래된 냄새가납니다.


2

코드 주석 처리는 매우 열악한 시작이라고 생각합니다. 요즘은 모르겠지만 학교에서 프로그래밍을 처음 배웠을 때 "1 ~ 10의 숫자를 별도의 줄에 인쇄하는 프로그램을 작성하십시오. 코드에 주석을 달아야합니다."라는 특성이 할당되었습니다. 코드를 주석 처리하는 것이 좋기 때문에 주석을 추가하지 않으면 마크 업됩니다.

그러나 그런 사소한 과정에 대해 무엇을 말할 수 있습니까? 그래서 당신은 고전을 작성 결국

i++; // add one to the "i" counter.

괜찮은 등급을 받기 위해, 그리고 만약 당신이 전혀 코가 없다면, 즉시 코드 주석에 대한 매우 낮은 의견을 형성하십시오.

코드 주석은 좋은 것이 아닙니다. 그것은 때때로 필요한 일이며, 최상위 답변의 Thomas Owens는 필요한 상황에 대한 훌륭한 설명을 제공합니다. 그러나 이러한 상황은 숙제 형태의 과제에서 거의 발생하지 않습니다.

여러 가지면에서, 코멘트를 추가하는 것은 프로그래밍 언어의 활성 부분에서 명확하게 말할 수없는 경우 최후의 수단 선택으로 간주되어야합니다. 개체 이름이 오래 될 수는 있지만 다양한 사람 및 컴퓨터 피드백 부족 메커니즘을 통해 주석을 유지하는 것을 쉽게 잊어 버리고 결과적으로 주석이 활성 코드보다 훨씬 빨리 오래됩니다. 따라서 선택이 가능한 경우 코드를 명확하게하기 위해 코드를 변경하는 것이 주석으로 명확하지 않은 코드에 주석을 달는 것보다 항상 선호되어야합니다.


나쁜 댓글 습관은 초기 프로그래밍 클래스에서 시작한다는 것을 지적한 +1입니다. 주석은 최후의 선택 일 뿐이라는 결론을 내립니다.
AShelly

1

물론 주석은 코드 냄새입니다 ...

모든 프로그래머는 우리 가 일의 양, 디버깅 또는 우리가 겪는 평범한 광기로 인해 결국 미치게 된다는 것을 알고 있습니다.

"이 작업을 수행!" 프로젝트 관리자가 말합니다.

"할 수 없습니다."라고 응답합니다.

그들은 "그런 다음에 다른 사람을 찾을 것"이라고 말합니다.

"좋아요, 아마도 가능할 것입니다."

그리고 다음 X 일 동안 몇 주, 몇 달 동안 그것을 알아 내려고 노력하십시오. 프로세스 전체에서 시도와 실패를 시도하고 실패합니다. 우리 모두이 일을합니다. 진정한 대답은 두 가지 유형의 프로그래머가 있다는 것입니다.

1) 나중에 참조 할 수 있도록 문서화하거나 작동하지 않는 실패한 루틴에 주석을 달거나 (작동하는 것을 찾은 후 냄새가 삭제되지 않습니다.) 주석이있는 코드를 깨 뜨리면 자신의 작업을보다 쉽게 ​​수행 할 수 있습니다. 서식하는 희망 이 좀 더 쉽게 읽고 이해할 수 있도록. 진심으로, 나는 그들을 비난 할 수 없습니다. 그러나 결국, 그들은 스냅하고 당신은 이것을 가지고 있습니다 : // dammit this code sucks! swear! curse! i hate it! i am going to write something here to vent my anger!!!!

2) 슈퍼 히어로 인 척하지 않거나 동굴에 사는 사람들 . 그들은 단순히 다른 사람, 자신을 무모하게 무시하고 코드에 대해 덜 신경 쓰거나 나중에 어떤 의미를 가질 수 있는지에 대해 신경 쓸 수 없습니다.

이제 나에게 잘못하지 마라. 자기 문서화 변수와 함수는 이것을 완전히 피할 수있다. 그리고 당신은 결코 충분히 코드 정리를 할 수 없다고 믿는다 . 그러나 간단한 사실은 백업을 유지하는 한 항상 주석을 삭제할 수 있다는 것 입니다.


1
1에 대한 응답으로, 주석 처리 된 루틴의 실제 냄새는 막 다른지 여부를 결정하고 다른 것을 시도하려고 할 때 즉시 삭제하지 않습니다. 다시 방문하기로 결정하면 버전 제어에서 사용할 수 있어야하기 때문입니다. .
Sharpie

1

내가 사용하지 않는 것이라고 주장 것 몇 가지 코드에 코멘트를하는 것은 코드 냄새입니다. 코드는 가능한 한 자기 문서화되어야한다는 데 동의하지만, 코드가 얼마나 잘 작성되었는지에 관계없이 의미가없는 코드를 볼 수있는 특정 시점에 도달했습니다. 비즈니스 애플리케이션에서 다음과 같은 이유로 주석이 거의 필수 인 일부 코드를 보았습니다.

  1. 사례별로 무언가를 수행해야하며 이에 대한 좋은 논리가 없습니다.
  2. 법률이 변경되어 코드를 빨리 찾으려면 1 ~ 2 년 후에 코드가 변경 될 수 있습니다.
  3. 코드의 기능을 이해하지 못하여 과거에 누군가 코드를 편집했습니다.

또한 회사 스타일 가이드는 특정 방법을 수행하도록 지시 할 수 있습니다. 함수에서 어떤 코드 블록을 설명하는 주석이 있어야한다고 말하면 주석을 포함하십시오.


1

주석과 코드는 근본적으로 큰 차이가 있습니다. 주석은 사람들이 다른 사람과 아이디어를 전달하는 방법이며 코드는 주로 컴퓨터를위한 것입니다. "코드"에는 이름 지정 및 들여 쓰기와 같은 사람에게만 해당되는 여러 측면이 있습니다. 그러나 주석은 인간에 의해 엄격하게 작성되었습니다.

따라서 의견을 작성하는 것은 사람이 쓴 의사 소통만큼 어렵습니다! 작가는 청중이 누구인지, 그리고 어떤 종류의 텍스트가 필요한지에 대한 명확한 개념을 가져야합니다. 10 년, 20 년 안에 누가 당신의 의견을 읽을 것인지 어떻게 알 수 있습니까? 사람이 완전히 다른 문화 출신이라면 어떻게 되나요? 등등 나는 모두가 이것을 이해하기를 바랍니다.

내가 살고있는 작은 동종 문화 속에서도 다른 사람들과 아이디어를 전달하는 것은 매우 어렵습니다. 우연한 경우를 제외하고 일반적으로 인간의 의사 소통은 실패합니다.


0

나는 당신의 동료와 동의해야합니다. 난 항상 내 코드에 주석을 경우, 그것이 내가 걱정 해요 있음을 의미라고 나는 알아낼 수 없습니다 내 자신의 코드를 미래에. 이것은 나쁜 징조입니다.

코드에 주석을 뿌린 유일한 이유는 이해가되지 않는 것을 불러내는 것입니다.

이러한 의견은 대개 다음과 같은 형태를 취합니다.

//xxx what the heck is this doing??

또는

// removed in version 2.0, but back for 2.1, now I'm taking out again

1
또는 대안 적으로 주석은 코드가 코드가 본질적으로 명확하지 않은 복잡한 알고리즘을 처리하고 있거나 제어 할 수없는 요인 (예 : 외부 서비스와의 상호 작용)으로 인해 코드에서 이상한 작업을 수행하고 있다는 사실을 반영 할 수 있습니다.
Murph

매우 사실입니다. 좋은 코드가 분명하지 않은 이유가 있습니다. 당황한 코드이지만 난독 화 된 방식으로 작성 되었기 때문에 대부분의 경우 당황한 코드입니다.
Ken

32k 만 재생할 수있는 임베디드 프로세서 용 코드를 작성하지 않았고 입찰이 모호한 것처럼 보입니다. 의견은 생명의 은인입니다.
quick_now

0

적용 가능한 경우 함수 인수 및 반환의 단위, 구조 필드 및 로컬 변수까지 제공하는 코드 주석은 매우 유용 할 수 있습니다. 화성 궤도를 기억하십시오!


단위를 변수 이름으로 작성하는 것이 훨씬 낫기 때문에 가난한 프로그래머는 기억할 필요가 없습니다. 'double length // in meter'대신 'double length_m'이라고 말합니다. 무엇보다도 더 강력한 언어를 사용하는 것이 가장 간단합니다. 간단히 Length l이라고 말할 수 있습니다. 힘 f; 토크 t = l * f; print (t.in (Torque.newtonMeter));
kevin cline

0

여기 내 엄지 손가락 규칙이 있습니다.

  • 코드를 작성하고 코드 요약을 별도의 문서에 저장하십시오.
  • 다른 일을하려면 코드를 며칠 동안 그대로 두십시오.
  • 코드로 돌아갑니다. 해야 할 일을 즉시 이해할 수 없으면 소스 파일에 요약을 추가하십시오.


0

아니요, 의견은 코드 냄새가 아니며 악용 될 수있는 도구 일뿐입니다.

좋은 의견의 예 :

// 나는 이것이 cm로 생각합니다. 추가 조사가 필요했습니다!

// X를하는 영리한 방법입니다

//이 목록은 비어 있지 않습니다.


세 번째는 나쁜 의견 IMO입니다. 왜 안돼 Assert(list.IsEmpty)?
코드 InChaos

@CodeInChaos IMO Assert(!list.isEmpty())는 세 번째 주석과 같은 계약이 아니라 단순히 다른 프로그램 논리와 같이 단위 테스트를 거쳐야하는 동작 (예 : "인수가 비어있는 경우 IllegalArgumentException 발생")입니다. 메소드를 사용할 수있는 시기 를 나타내는 주석과의 미묘한 차이점에 유의하십시오 . 그러나 전제 조건이 충족되지 않으면 동작이 지정되지 않습니다. 의견보다 더 나은 것은 컴파일 타임 계약을 시행하는 것입니다. 그러나 이것은 내 대답의 범위를 초과합니다.)
Andres F.

Assert공개 API가 유효하지 않은 인수를 수신하더라도 발생하지 않아야하는 사항을 설명하므로 s 를 사용할 수 없습니다.
코드 InChaos

@CodeInChaos 나는 나의 의견을 철회한다. Sunacle이 어설 션에 대해 말한 내용은 다음과 같습니다 . 당신이 옳은 것 같습니다. 글쎄, 당신은 매일 무언가를 배웁니다!
Andres F.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.