Yorumlara duyulan ihtiyaç, kodun soyutlama seviyesiyle ters orantılıdır.
Örneğin, Assembly Dili, en pratik amaçlarla, yorum yapılmadan anlaşılmazdır. İşte Fibonacci serisinin terimlerini hesaplayan ve basan küçük bir programdan bir alıntı :
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 ;
Yorumlar olsa bile, grok için oldukça karmaşık olabilir.
Modern Örnek: Regex'ler genellikle çok düşük soyutlama yapılarıdır (küçük harfler, sayı 0, 1, 2, yeni satırlar, vb.). Muhtemelen örnekler şeklinde yorumlara ihtiyaçları vardır (Bob Martin, IIRC, bunu kabul eder). İşte (bence) HTTP (S) ve FTP URL'leri ile eşleşmesi gereken bir regex:
^(((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\.
+\,\;\?\'\\\+&%\$#\=~_\-]+))*$
Diller soyutlama hiyerarşisini geliştirdikçe, programcı yerleşik belgeler sağlamak için uyarıcı soyutlamalar (değişken adı, işlev adları, sınıf adları, modül adları, arayüzler, geri aramalar vb.) Kullanabilir. Bundan faydalanmayı ihmal etmek ve kağıt üzerindeki yorumları kullanmak tembeldir, bakıcıya saygısızlık ve saygısızlıktır.
Ben düşünüyorum C Sayısal Tarifler çoğunlukla aynen tercüme C ++ Sayısal Tarifler olarak başladı ben anlaması, Sayısal Tarifler tüm değişkenler, (fortan cinsinden) a
, aa
, b
, c
, cc
her sürümü ile bakımı vb. Algoritmalar doğru olabilir, ancak verilen dillerin soyutlamalarından faydalanmadılar. Ve beni sinirlendiriyorlar. Dobbs makalesinden bir örnek - Hızlı Fourier Dönüşümü :
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;
}
}
Soyutlama ile ilgili özel bir durum olarak, her dilin belirli ortak görevler için (C'deki dinamik bir bağlantılı listeyi silme) deyimleri / kanonik kod parçacıkları vardır ve nasıl göründüklerinden bağımsız olarak belgelendirilmemelidir. Programcılar bu deyimleri öğrenmeli, çünkü gayri resmi dilin bir parçası.
Öyleyse, alıp götürmek: Kaçınılması mümkün olmayan düşük seviyeli yapı taşlarından inşa edilen salak olmayan kodların yorumlanması gerekiyor. Ve bu WAAAAY'ın olduğundan daha az gerekli.