주석의 필요성은 코드의 추상화 수준에 반비례합니다.
예를 들어, 어셈블리 언어는 가장 실용적인 목적으로 주석없이 이해할 수 없습니다. 다음 은 피보나치 시리즈의 항을 계산하고 인쇄하는 작은 프로그램 에서 발췌 한 것입니다 .
main:
; initializes the two numbers and the counter. Note that this assumes
; that the counter and num1 and num2 areas are contiguous!
;
mov ax,'00' ; initialize to all ASCII zeroes
mov di,counter ; including the counter
mov cx,digits+cntDigits/2 ; two bytes at a time
cld ; initialize from low to high memory
rep stosw ; write the data
inc ax ; make sure ASCII zero is in al
mov [num1 + digits - 1],al ; last digit is one
mov [num2 + digits - 1],al ;
mov [counter + cntDigits - 1],al
jmp .bottom ; done with initialization, so begin
.top
; add num1 to num2
mov di,num1+digits-1
mov si,num2+digits-1
mov cx,digits ;
call AddNumbers ; num2 += num1
mov bp,num2 ;
call PrintLine ;
dec dword [term] ; decrement loop counter
jz .done ;
; add num2 to num1
mov di,num2+digits-1
mov si,num1+digits-1
mov cx,digits ;
call AddNumbers ; num1 += num2
.bottom
mov bp,num1 ;
call PrintLine ;
dec dword [term] ; decrement loop counter
jnz .top ;
.done
call CRLF ; finish off with CRLF
mov ax,4c00h ; terminate
int 21h ;
주석이 있어도 이해하기가 매우 복잡 할 수 있습니다.
현대의 예 : 정규 표현식은 추상화 구조가 매우 낮은 경우가 많습니다 (소문자, 숫자 0, 1, 2, 줄 바꿈 등). 그들은 아마도 샘플 형식의 주석이 필요할 것입니다 (IIRC의 밥 마틴은 이것을 인정합니다). 다음은 HTTP (S) 및 FTP URL과 일치 해야하는 정규 표현식입니다.
^(((ht|f)tp(s?))\://)?(www.|[a-zA-Z].)[a-zA-Z0-9\-\.]+\.(com|edu|gov|m
+il|net|org|biz|info|name|museum|us|ca|uk)(\:[0-9]+)*(/($|[a-zA-Z0-9\.
+\,\;\?\'\\\+&%\$#\=~_\-]+))*$
언어가 추상화 계층을 진행함에 따라 프로그래머는 연상적인 추상화 (변수 이름, 함수 이름, 클래스 이름, 모듈 이름, 인터페이스, 콜백 등)를 사용하여 내장 문서를 제공 할 수 있습니다. 이것을 이용하지 않고 그것을 주석 처리하여 주석을 달아주는 것은 게으르고, 관리자에게 불쾌하고 무례합니다.
내가 생각하고 C에서 수치 조리법 을 대부분 그대로 번역 C ++에서 수치 조리법 으로 시작 내가 추론, 수치 조리법 모든 변수 (FORTAN에서) a
, aa
, b
, c
, cc
각 버전을 유지, 등. 알고리즘은 정확했지만 언어가 제공 한 추상화를 활용하지 않았습니다. 그리고 그들은 나를 떼어 놓았다. Dr. Dobbs 기사-Fast Fourier Transform의 샘플 :
void four1(double* data, unsigned long nn)
{
unsigned long n, mmax, m, j, istep, i;
double wtemp, wr, wpr, wpi, wi, theta;
double tempr, tempi;
// reverse-binary reindexing
n = nn<<1;
j=1;
for (i=1; i<n; i+=2) {
if (j>i) {
swap(data[j-1], data[i-1]);
swap(data[j], data[i]);
}
m = nn;
while (m>=2 && j>m) {
j -= m;
m >>= 1;
}
j += m;
};
// here begins the Danielson-Lanczos section
mmax=2;
while (n>mmax) {
istep = mmax<<1;
theta = -(2*M_PI/mmax);
wtemp = sin(0.5*theta);
wpr = -2.0*wtemp*wtemp;
wpi = sin(theta);
wr = 1.0;
wi = 0.0;
for (m=1; m < mmax; m += 2) {
for (i=m; i <= n; i += istep) {
j=i+mmax;
tempr = wr*data[j-1] - wi*data[j];
tempi = wr * data[j] + wi*data[j-1];
data[j-1] = data[i-1] - tempr;
data[j] = data[i] - tempi;
data[i-1] += tempr;
data[i] += tempi;
}
wtemp=wr;
wr += wr*wpr - wi*wpi;
wi += wi*wpr + wtemp*wpi;
}
mmax=istep;
}
}
추상화에 대한 특별한 경우로서, 모든 언어에는 특정 공통 작업 (C에서 동적 링크 목록 삭제)에 대한 관용어 / 표준 코드 스 니펫이 있으며, 모양에 관계없이 문서화해서는 안됩니다. 프로그래머는 비공식적으로 언어의 일부이므로이 관용구를 배워야합니다.
따라서 피할 수없는 낮은 수준의 빌딩 블록으로 작성된 비 아이디 오 매틱 코드는 주석이 필요합니다. 그리고 이것은 필요한 것보다 적은 WAAAAY가 필요합니다.