“Yorumlar bir kod kokusu” [kapalı]


100

Bir iş arkadaşım kod içi yorumların herhangi bir kullanımının (yani, javadoc tarzı yöntem veya sınıf yorumları değil) kod kokusu olduğuna inanıyor . Ne düşünüyorsun?


44
"Hayır" diyen herhangi bir cevabı kaldıracağım.
Nicole

2
@Renesis Bu ilahiyat kokusu.
ixtmixilix

107
İş arkadaşınız kapsamlı bir genelleme yaptı; bu otomatik olarak hatalı olduğu anlamına geliyor. :)
Alex Feinman

5
@Mongus, katılmıyorum. Örneğinizdeki yorumlar, yorum oldukları için değil, aynı zamanda TOO'un değişen kodlara yakın oldukları için kötüdür. NEDEN değil, NEDİR demeliler .

5
@Alex, bu nedenle yanlış olan kapsamlı bir genelleme değil mi (yine de yanlış olmamasıyla sonuçlandı)?

Yanıtlar:


167

Yalnızca yorum kodun ne yaptığını açıklarsa.

Bir yöntemde veya blokta neler olduğunu bilmek istesem kodu okurdum. Neyse, yine de, belirli bir proje üzerinde çalışan geliştiricilerin, en azından ne yazıldığını okumak ve ne yaptığını anlamak için geliştirme dili ile aşina olduklarını umardım.

Bazı aşırı optimizasyon durumlarında, birinin kodunuzun ne yaptığını izlemesini zorlaştıran teknikler kullanıyor olabilirsiniz. Bu durumlarda, yorumlar yalnızca neden bu tür optimizasyonlara sahip olduğunuzu değil aynı zamanda kodun ne yaptığını açıklamak için de kullanılabilir ve kullanılmalıdır. İyi bir kural, uygulama diline ve projeye aşina bir başkasının (veya diğer birçok kişinin) kodunuza bakmasını sağlamaktır - eğer hem nedenini hem de nasıl olduğunu anlayamıyorlarsa, hem nedenini hem de nedenini yorumlamalısınız. nasıl.

Ancak, kodda açık olmayan şey, neden bir şey yaptığınızdır. Başkaları için açık olmayan bir yaklaşım izlerseniz, verdiğiniz kararları neden verdiğinizi açıklayan bir yorumunuz olmalıdır. İnsanların Y yerine neden X yaptığını bilmek isteyen bir kod incelemesinden sonraya kadar bir yoruma ihtiyaç duyulduğunu bile bilmiyor olabilirsiniz; cevabınızı koddaki herkes için kodda bulabilirsiniz. gelecekte.

En önemlisi, kodunuzu değiştirdiğinizde yorumlarınızı değiştirmektir. Bir algoritmayı değiştirirseniz, Y'yi neden X algoritmasıyla kullandığınızla ilgili yorumları güncellediğinizden emin olun. Eski yorumlar daha da büyük bir kod kokusudur.


8
Yorumlara rağmen bu cevaba katılıyorum, ancak belgelerin eksikliğinden dolayı mazeret olarak gösterildiğini de gördüm. Kod okumak bazen eşek için bir acıdır. Sen olmamalıdır sahip bir yöntem bu yöntem ne anlamaya yönelik kodlarına bakmak. İsmi çözebilmeli ve dokümanlardan daha fazla ayrıntı öğrenebilmelisin. Kod okurken, genellikle sınıftan sınıfa, dosyadan dosyaya geçmeniz gerekir. Bu, özellikle tüm bunları halledebilecek IDE yazmanın önemsiz olmadığı dinamik dillerde bir sorun.
davidtbernal

1
Her neyse, bazen karmaşıksa HOW'u da yorumlamanız gerekir (özellikle optimize edilmişse veya önemsiz olmayan herhangi bir işlem sırasında). Ne yaptığını anlamak için bir kod bloğunu okumak için 5 dakikadan daha fazla zaman harcamak zorunda
kalırsam

3
"Sadece yorum kodun ne yaptığını açıklarsa." Veya yorum, kodun ne yaptığını açıklarsa; kod değişti, ancak yorum değişmedi.
Bruce Alderman

1
Yorumunuzun doğru olduğunu nasıl test edersiniz? Neden yorumunuzu bir test olarak yazmıyorsunuz? Gelecekteki herhangi bir koruyucu, testi kodun doğrulanabilir belgeleri olarak kullanabilir. Yorumun kodun yürütülmesiyle bir ilgisi varsa, o zaman / olması gereken / kabul edilebilir bir şey olmalıdır. Yorumun kodun yürütülmesiyle hiçbir ilgisi yoksa, yalnızca programcıların bakacağı kodda ne yapıyor?
flamingpenguin,

2
@ back2dos, diğer insanların kodlarını okurken sık sık

110

Bu şu anda duymak için özellikle rahatsız edici, bu hafta sonu biraz zaman harcadım, bir araştırma algoritması (aslında yayınlanmayan bir tane) uygulayan çok iyi adlandırılmış, açık kodlu kodlara bakarak geçirdim. Ben çok tanıdık biriyim, yanımda oturan adam muciddi ve kod birkaç yıl önce başkaları tarafından yazılmıştı. Bunu zorlukla takip edebiliriz .

İş arkadaşınız yeterince açık değil.


16
Takip etmesi zor olan "iyi adlandırılmış, çok temiz, açık kodlara" bakmayı merak ediyorum. Bu şekilde sınıflandırdığım herhangi bir kodu takip etmek çok kolaydı. "İş arkadaşınız yeterince açık ve yeterince tecrübeli değil" kadar kesinlikle gitmem.
Liggy

8
@Liggy: Yaparım. Bu bir araştırma algoritması, iş kolu uygulaması değil.
Paul Nathan

9
Bir zamanlar bir veri tabanı sütun nesnesindeki alanları (3. taraf) "yanlış" sırayla (işlemin "mantığı" ve kodlama standartlarımızla tanımlanmış olan) doldurmanız gereken bir kod parçasına sahiptim - normalde kullanırdım ve çökecek. Kodu okumanın hiçbir miktarı size bunu söyleyemedi, bu yüzden olumlu, kesinlikle, bir yorum yapmak zorunda kaldı - ve bir koku değildi, en azından üzerinde kontrol sahibi olduğumuz kodda değildi (alt satırda). Eksiksiz ve kesin bir yorum eksikliği, zayıf yorumlar kadar kokuyor.
Murph

29
Matematik, matematik, matematik. Tüm kodlar önemsiz IoC yapıştırıcısı ve 'fiyat * miktarı' uygulamaz. Karmaşık matematik kendini açıklamak için sihirli bir şekilde yapılamaz.
bmargulies

4
@Liggy, karmaşık veri yapılarını uygulayan kod kapsamlı belgeler olmadan tamamen anlaşılmaz olabilir.

75

Yorumlar nedenini değil nedenini açıklamalıdır.

Howtür yorumları genellikle yeniden yönlendirme kullanarak daha iyi anlaşılır. Şahsen ben genellikle yeniden yapılanma lehine yorumlar yapmaktan kaçınırım.

Önce:

# convert to cents
a = x * 100

# avg cents per customer 
avg = a / n

# add to list
avgs < avg
t += 1

sonra:

total_cents = total * 100
average_per_customer = total_cents / customer_count

track_average(average_per_customer)

26
Bu örnekte parçanın nasıl kullanılmayacağının ve yeniden düzenlemenin neden bu işe yaramayacağını kabul ediyorum, ancak daha karmaşık kodlarla, değişken / işlev yeniden adlandırma / yeniden düzenleme işlemlerinin hiçbiri mükemmel anlam ifade etmeyecek ve yorumlara hala ihtiyaç duyulacak.
GS

3
İyi bir örnek, ancak sistem neden dolar yerine sentlerle çalışıyor? Bu soru, kesirli para biriminin devreye girdiğini görebileceğiniz finansal sistemlerde önem kazanmaktadır.
rjzii

3
@Stuart işlevin adını ne yaptığını söylemelidir.
Alb

3
@GSto, daha fazla katılamazdım. Kod karmaşıksa, işlemi tanımlayan uygun adlara sahip daha küçük yöntemlere / işlevlere bölünmelidir.
CaffGeek

1
Kod tabanı üzerinde tam kontrol sahibi olduğunuzu varsayıyorsunuz.
LennyProgrammers

32

İş arkadaşını sapık ilan ediyorum! Heretik yakıcı botlarım nerede?

Obsesif yorumlama kötüdür ve bakım başağrısıdır ve yorumlar, iyi adlandırılmış yöntemlerin, sınıfların, değişkenlerin vs. yerine geçmez. Ancak bazen, bir şeyi neden olduğu şekilde koymak , kodu korumak zorunda olan zavallı salak için son derece değerli olabilir. altı ay içinde - özellikle de bu zavallı aptal sen olduğun için çok rüzgârlı.

Üzerinde çalıştığım koddan bazı gerçek yorumlar:


    // 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
Güzel yorumlarınız için +1. Hiçbir kod, "Eğer bu olursa, birisi veritabanı tanımlamaları ile uğraşıyor" diyemez.
DistantEcho,

9
@Niphra, şey, olabilir bir atmak SomebodyScrewedAroundWithDatabaseException...

@ Thorbjørn +1, Eğer kod neyin yanlış olduğunu biliyorsa, bildir. Müşteriler teknik destek teknisyeni muhtemelen DB'lerini yeniden yükleyebilir ve servis çağrısından kaçınırlar.
Tim Williscroft

@ Zaman, müşteriler bunu görebildiğinden, daha nötr bir isim uygun olabilir.

3
Elbette, unutma: asla saçma isimleri kullanmayın. Müşteri her zaman onları görecektir.
Tim Williscroft

29

İdeal olarak, kod o kadar iyi kodlanmalı ki otomatik açıklayıcı olmalıdır. Gerçek dünyada, çok yüksek kalitede kodun bazen yorum gerektirdiğini biliyoruz.

Kesinlikle kaçınmanız gereken "yorum kodu artıklığı" (koda hiçbir şey eklemeyen yorumlar):

i++; // Increment i by 1

Sonra, iyi (ve korunmuş / hizalı) bir kod tasarımı ve dokümantasyonu varsa, yorum yapmak daha da faydalı olacaktır.

Ancak bazı durumlarda yorumlar kod okunabilirliğinde iyi bir yardımcı olabilir:

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

Unutmayın, senkronize etmek ve yorumlarda da devam etmek zorundasınız. Ayrıca eski ya da yanlış yorumlar korkunç bir acı olabilir! Genel bir kural olarak, çok fazla yorum yapmak kötü programlamanın bir belirtisi olabilir.


2
İyi adlandırma kuralları ve iyi yapılandırılmış kod, yorum gereksinimini azaltmanıza yardımcı olacaktır. Unutmayın her eklediğiniz yorum satırları korumak için yeni bir satır !!
Gabriel Mongeon

81
Sorunuzda insanların bu ikinci örneği kullanmasından nefret ediyorum. } //end whilesadece while süresinin başlangıcı çok uzakta olduğu anlamına gelir, onu göremezsiniz ve bakmakta olduğunuz kodun bir döngü içinde olduğuna dair hiçbir ipucu yoktur. Kodun nasıl yapılandırıldığına ilişkin yorumlar için ağır yeniden düzenleme, ciddi şekilde tercih edilmelidir.
Carson Myers

4
@Carson: blokları kısa tutarken bilinen bir kuraldır, her zaman uygulayabileceğimiz anlamına gelmez.
Wizard79

4
@Carson: Üzerinde çalıştığım projelerden birinde kod incelemesi yetersiz, bu da "OMFG SADECE KILL KEND KENDİNİZİ ÖTESİN." Kanlı şeyleri yeniden düzenlemek, başka bir yerde geçirilmesi gereken iş günlerini temsil eder. Bu } // end whileyorumlar bir cankurtaran olabilir.
BlairHippo

11
@BlairHippo: "[A] kod kokusu, bir programın kaynak kodunda muhtemelen daha derin bir sorun olduğunu gösteren herhangi bir belirtidir". Elbette bu yorum bir hayat kurtarıcıdır, ancak OMGWTF-döngüsü yukarıda bahsedilen “daha ​​derin bir sorundur” ve hayat kurtarıcısının gerekliliği açık bir göstergedir;)
back2dos

26

Bir yöntemi veya işlemi "kod kokusu" olarak tanımlamak, "zealotry kokusu" dur. Terim yeni "zararlı olarak kabul edilir" hale geliyor.

Lütfen, bu tür şeylerin kurallar olması gerektiğini unutmayın.

Diğer cevapların çoğu, yorum yapılmasının ne zaman gerektiği konusunda iyi tavsiyeler verir.

Şahsen çok az yorum kullanıyorum. Belirsiz işlemlerin amacını açıklayın ve zaman zaman ölüm tehdidini, haftalar sürmesi gereken işleri kendi başlarına değiştirmeyi düşünen herkese bırakın.

Bir anaokulu öğrenene kadar her şeyi yeniden düzenlemek muhtemelen zamanınızın verimli bir şekilde kullanılmaması ve muhtemelen daha kısa ve öz bir versiyonun yerine geçmeyecektir.

Yorumlar çalışma süresini etkilemez, bu nedenle dikkate alınması gereken tek olumsuz konu bakımdır.


8
"Anti-patern" in yeni "zararlı" olduğunu düşündüm. Kod kokusu, olası temizleme için daha yakından gözden geçirilmesi gereken bir şeydir.
Jeffrey Hantin

1
Anti-paternin de nitelendirdiği konusunda hemfikir değilim. Her ikisi de, tasarım açıkça kasıtlı bir seçim olacak kadar karmaşık olduğunda koku yerine kullanılan anti-patern ile bu şekilde kullanılır. Her iki durumda da, bu konularda mutlak bir doğru kaynak olduğu fikrine katılmıyorum.
Bill

4
+1 "Anaokulu öğrencisinin anlayabilmesi için her şeyin yeniden yapılandırılması muhtemelen zamanınızın verimli bir şekilde kullanılmadığını ve muhtemelen daha kısa ve öz bir versiyonun performansını göstermeyecektir."
Earlz

23

Bazı durumlarda, hiçbir iyi adlandırma, yeniden düzenleme vb. Hiçbir yorum yapamaz. Sadece bu gerçek dünya örneğine bakın (dil Groovy'dir):

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

Garip görünüyor, değil mi? Muhtemelen bir kopyala-yapıştır hatası? Bir hata düzeltme için ağlıyor?

Şimdi yorumlarla aynı:

  // 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

fonksiyon prime_extjs_uploadform () {response.contentType = 'text / html'; render '{"success": true}'; } prime_extjs_uploadform ();
DrPizza

23

Buradaki ana sorun "kod kokusu" teriminin anlamıdır.

Pek çok insan (siz dahil, sanırım) bir hataya yakın bir şey veya en azından düzeltilmesi gereken bir şey olarak bir kod kokusunu anlıyor. Belki de bunu "anti-patern" ile eşanlamlı olarak düşünürsünüz.

Bu terimin anlamı değil!

Kod kokusu metaforu Wards Wiki'den geliyor ve şu vurguyu yapıyorlar:

Bir CodeSmell'in bir şeylerin kesin olamayacağının yanlış olabileceğine dair bir ipucu olduğunu unutmayın. Mükemmel bir deyim CodeSmell olarak düşünülebilir, çünkü çoğu zaman yanlış kullanılır veya çoğu durumda işe yarayan daha basit bir alternatif vardır. Bir şeye CodeSmell demek bir saldırı değildir; bu sadece daha yakından bakmak garanti edildiğinin bir işareti.

Öyleyse, yorumların kod kokusu olduğu ne anlama geliyor: bir yorum gördüğünüzde duraklatmanız ve düşünmeniz gerektiği anlamına gelir: "Hmm, bir şeyin iyileştirilebileceğine dair bir ipucu hissediyorum". Belki bir değişkeni yeniden adlandırabilir, "özütleme yöntemi" -refactoring gerçekleştirebilirsiniz - veya belki de yorum aslında en iyi çözümdür.

Yorumların kod kokusu almasının anlamı budur.

EDIT: Ben sadece benden daha iyi açıklayan bu iki makaleye rastladım:


2
Bu cevabın gelmesi 2 ay sürdü şaşırdım. Terimin yanlış anlaşılmasının ne kadar yaygın olduğunu göstermektedir.
Paul Butcher

Genel dava iddiası hala yanlış. "Yorumlanmış kod görüyorum. Kötü bir işaret." Demiyorsunuz.
Stuart P. Bentley

1
@Stuart: Her ikisi de uygun yorum düzeyine sahip iki kod parçası bakıyorsunuz. (Bu sayı uygun yorum sayısıyla ilgili değil, yorum sayısına dayalı olarak kodu nasıl değerlendirdiğinizle ilgilidir.) Birinin yorumu yok, diğerinin tonları var. Hangisine daha yakından bakıyorsunuz? - Yorumlar, kodun karmaşık ve zekice olduğu ve dolayısıyla sorun yaşama ihtimalinin daha yüksek olduğunun bir işaretidir.
David Schwartz

Bu doğru cevap.
vidstige

21

Kuralın oldukça basit olduğunu düşünüyorum: kodunuzu gören tamamen yabancı bir insan hayal edin. Muhtemelen 5 yıl içinde kendi koduna yabancı olacaksın. Bu yabancı için kodunuzu anlamak için zihinsel çabayı en aza indirmeye çalışın.


8
+1 Bunu deneyimleyecek kadar uzun bir süre boyunca tek bir proje üzerinde çalışmayan herhangi bir kişi için, bunun olacağına inanın . Bunu ne zaman zor yoldan öğrensem ve kendi kodumu tekrar öğrenmem gerektiğinde, aynı hatayı iki kez yapıp başka bir şeye devam etmeden önce yorum yapmamı istemiyorum.
Nicole

Hayır, nerede yaşadığını bilen bir psikopat hayal etmelisin: kodunu korumaktan mutlu olurlar mı?
Richard,

4
Okunamayan bir kod gördüğümde düzenli olarak psikopat olurum.
LennyProgrammers

3
5 yıl? Daha çok 5 dakika gibi. ;)
Alex Feinman

11

Doğru yorumlara sahip olmak iyi bir fikir yorum yazmaya başlamaktır.

// 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.
}

Bu, yorumlardan bile kolayca kurtulabileceğiniz yöntemleri ayıklamanıza olanak tanır,
sadece kodun bunları söylemesine izin verin ! Bunun nasıl yazıldığını (kes / yapıştır) çok güzel bir şekilde görün:

// 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 ...

Ayrılamayacak şeyler için sadece metotları çıkarmayın ve yorumları yorumların altına yazın.

Bu, yorumu en aza indirmenin yararlı bir yolu olarak görüyorum, her bir çizgiyi yorumlamaya gitmek gerçekten işe yaramaz ... Sadece bir sihirli değer başlatmasıyla ilgili veya mantıklı olduğu durumlarda tek bir satırı belgeleyin.

Parametreler çok fazla kullanılıyorsa, sınıfınızdaki özel üyeler olmalıdır.


1
Bu benim işim. Yorumlara ihtiyacınız olduğunu düşünüyorsanız, bunun yerine yenilerini denemenizi tavsiye ederim.
bzlm

10

Bence cevap her zamanki "Bağımlı" dır. Yorum kodu sadece yorum kodu için bir koku. Kodun yorumlanması, çünkü bir büyüklük sırası daha hızlı bir şekilde belirsiz bir algoritma kullanıyorsanız, bakım programlayıcısından (genellikle yazdıktan 6 ay sonra) ne yaptığını belirlemek için kod aracılığıyla uğraşmaktan yarım gün sonra tasarruf sağlar.


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

veya

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

Ah, yürekten gelecek kendine zevk.
Anthony Pegram

8

Kod yorumları kesinlikle bir "kod kokusu" değildir. Bu inanç tipik olarak, yorumların eski (eski) olabileceği ve sürdürülmesi zor olabileceği gerçeğinden gelir. Ancak, kodun neden belirli bir şekilde bir şey yaptığını açıklayan iyi yorumlara sahip olmak bakım için önemli olabilir (ve genellikle önemlidir).

İyi yorumlar, kodun ne yaptığını anlamayı kolaylaştırır ve daha da önemlisi neden belirli bir şekilde yaptığını belirler. Yorumlar programcılar tarafından okunmalı ve açık ve net olmalıdır. Anlaşılması zor veya yanlış olan bir yorum, hiç yorum yapmamaktan daha iyi değildir.

Kodunuza net ve kesin yorumlar eklemek, bir kod bölümünün "neyi" ve "nedenini" anlamak için belleğe güvenmeniz gerekmediği anlamına gelir. Bu, daha sonra bu koda baktığınızda veya başkasının kodunuza bakması gerektiğinde önemlidir. Yorumlar, kodunuzun metin içeriğinin bir parçası haline geldiğinden, açıkça yazılmasının yanı sıra iyi yazma ilkelerini izlemelidir.

İyi bir yorum yazmak için, kodun amacını (neden, nasıl değil) belgelemek ve kodun arkasındaki mantık ve mantığı olabildiğince açık bir şekilde belirtmek için elinizden geleni yapmalısınız. İdeal olarak, yorumlar kodu yazdığınız sırada yazılmalıdır. Beklerseniz, muhtemelen geri dönüp ekleyemezsiniz.

Sams 24 Saat İçinde Kendine Görsel C # 2010'u Öğretti, s. 348-349.


1
Yorumlar bayatlanabilir, ancak sınıf, işlev ve değişken adlarının anlamı gibi bir derleyici veya birim sınaması tarafından doğrulanmayan her şey için geçerlidir.
LennyProgramcılar

@ Lenny222: Evet, yorumlar bayatlanabilir ... bu genellikle tembel programcıların göstergesidir. Yorum neden bir karar vermenin yapıldığını, kodun neden hesaplama için belirli bir algoritma kullandığını veya kodun nasıl çalıştığını açıklarsa, yorumun uygulamayı değiştiren ve yorumu uygun şekilde güncellemeyen bir kişi dışında eski olması için hiçbir neden yoktur. - Tembel olmaya eşdeğerdir.
Scott Dorman,

2
Katılıyorum. Demek istediğim, bayatlama riski var, evet. Ancak doBar () işlevine sahip olduğumda ve 3 yıl sonra “bar” yapmıyor, ancak “çarşamba günleri hariç bar ve foo” yapıyor, o zaman işlevlerin anlamı da bayatlayabiliyor. Ve değişken isimler. Fakat umarım hiç kimse bunu, fonksiyonlara ve değişkenlere anlamlı isimler vermemek için bir sebepten alır.
LennyProgrammers 10:10

6

Kod, bir kütüphanede (problemi üçüncü taraf bir kütüphanede veya derleyici ile birlikte gelen bir kütüphanede) mevcut bir problemden kaçınmak için belirli bir şekilde yazılmışsa, yorum yapmak mantıklı olacaktır.
Ayrıca gelecekteki sürümlerde veya bir kitaplığın yeni bir sürümünü kullanırken veya örneğin PHP4'ten PHP5'e geçerken değiştirilmesi gereken kodu yorumlamakta fayda vardır.


6

En iyi yazılmış kitabın bile, muhtemelen bir giriş ve bölüm başlıkları vardır. İyi belgelenmiş koddaki yorumlar, üst düzey kavramları tanımlamak ve kodun nasıl düzenlendiğini açıklamak için yine de kullanışlıdır.


Bu tür yorumlar güzel görsel ipuçları verir, böylece aradığınız bölümün başlangıcını bulmak için her satırı okumak zorunda kalmazsınız. Büyükbabamın dediği gibi, "ölçülü her şey".
Blrfl

4

Onurlu söz, anti-kalıptır:

Bazen FLOSS lisans vaizlerinin dosya dokümantasyonu yerine sıklıkla kullanıldığı izlenimini edindim . GPL / BSDL hoş bir metin dolduruyor ve bundan sonra başka bir yorum bloğunu nadiren görüyorsunuz.


4

Kodu açıklamak için yorum yazmanın kötü olduğu fikrine katılmıyorum. Bu tamamen kodun hataları olduğunu görmezden gelir. Kod açık ne olabilir yapar yorumsuz. Bu kod ne açık olması olasılığı düşüktür sözde yapmak. Yorumlar olmadan sonuçların yanlış olduğunu veya yanlış kullanıldığını nasıl bildiniz?

Yorumlar , kodun amacını açıklamalıdır , böylece bir hata olursa, yorumları + kodu okuyan biri onu bulma şansına sahip olur.

Kodları yazmadan önce genellikle kendimi satır içi yorumlar yazarken buluyorum . Bu yolla, ne yapmaya çalıştığımı netleştiriyorum ve ne yapmaya çalıştığınızı gerçekten bilmeden bir algoritmada kaybolmayı azaltır.


1
Birim testleri, sonuçların yanlış olup olmadığını belirlemek için çok yardımcı olur. Bazı kodları okuyup, gerçekte Y yaptığında X'in yaptığını düşünüyorsanız, kodun yeterince okunaklı bir şekilde yazılmaması mümkündür. Yanlış kullanılan sonuçlar hakkında ne demek istediğinizi anlamadım. Bir yorum sizi kodunuzu garip yollarla tüketen bir kişiye karşı korumaz.
Adam Lear

“Eğer bazı kodları okuyup, gerçekte Y olduğunda X'in yaptığını sanıyorsanız” Dediğim gibi değil. Ben kodu ne anlama bahsediyorum yapar , ama onda da değil neyi gerekiyordu yapmak. Tek tek bir hatadan şüphelendiğinizi varsayalım. Bire bir hatanın alıcı kodunda değil de bu kodda olmadığını nasıl biliyorsunuz? Yorumlar , kodun amacını açıklar ve bu da hataların izlenmesinde çok yardımcı olur.
Danny Tuppeny,

Öte yandan, yorumlar size yalnızca yorumların yazıldığı tarih itibariyle kodun ne yapması gerektiğini söyler . Kodun kendisi şimdi ne yapması gerektiğini söylüyor olabilir . Yorumlar derleme değil. Yorumları test edemezsiniz. Doğru olabilirler veya olmayabilirler.
Anthony Pegram

3

Birisi, bir yöntemde 700 satır olmasının bir koku olduğunu düşünmesinin doğru olduğunu söyleyen yorumlar.

Yorumlarda bulunmazsanız, birileri aynı hatayı yapacaktır, çünkü yine de bir kokuyorsun.

Bazı kod analiz araçlarının talep ettiği için ayrıca yorumlar da kokuyor.

Olmaz İnsanlar hiç bir açıklama koymak veya diğer geliştiriciler için bile küçük bir yardım yazma da bir koku vardır. Kaç kişinin bir şeyler yazmadığına şaşırdım, ama sonra geri dönecek ve 3 ay önce ne yaptıklarını hatırlayamadıklarını kabul edecekler. Doküman yazmaktan hoşlanmıyorum, fakat insanlara aynı şeyleri tekrar tekrar söylemek zorunda kalmak istiyorum.


3

Kendime ait bir soru ile cevaplayacağım. Hatayı aşağıdaki kodsuz kodda bulabilir misin?

tl; dr: Kodunuzu koruyacak bir sonraki kişi sizin kadar tanrı gibi olmayabilir.

 [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

Ama bu gün ve yaştaki gibi yüksek düzeyde bir kordon kullanmıyor musunuz?
Ian,

2
@Ian: Program bir IBM PC önyükleyicidir. Sen olamaz program son kısa görünen RAM yer almaktadır tam olarak nerede kontrolü tamamen gerektiğinden, montaj dışında başka bir şey yazmak ve donanım kesme bazıları. Cidden, kendine NASM'in bir kopyasını al. Bir araya getirin, bir disket veya USB belleğin önyükleme sektörüne yazın ve önyükleyin. Her ne kadar muhtemelen bulursanız hata nedeniyle beklendiği gibi çalışmaz. Şimdi hatayı bulun ... Ne olursa olsun, bundan 20 yıl sonra, insanların uncommented Java'ya aynı şeyi soracağından eminim.
Karınca

Elbette kod C veya C ++ dilinde yazılabilir ve ikili C nesne kodundan ve bazı harici araçlardan toplanır.
kevin cline

Ne yazık ki değil. CodeProject'de bu sayfaya bir göz atın: codeproject.com/KB/tips/boot-loader.aspx - "yüksek seviye dillerde gerekli talimatlar yok". Sadece bu değil, aynı zamanda bir bootloader'da oynayabileceğiniz sadece 512 bayt var. Bazen doğrudan donanıma ulaşmak zorundasın.
Ant

1
Meclisi kodlarken, herkesin yaptığını yapardım - yaptıkları her satırda yorum yapın. Söz konusu satır, kod C-tarzı 0-sonlandırılmış dizgileri kullandığından, "harf 0 ise kontrol et" yorumuna sahipti. Bu yorum yapıldıktan sonra, kodun 1 ile cmp yaptığını görmek kolaydır; bu, ya sonsuz bir döngüde sıkışıp kaldığı ya da RAM'de rastgele bir 1'e çarpıncaya kadar çöp basması anlamına gelir. Ayrıca, dizelerin 0 sonlandırılmış olduğu ve kodda açıkça görülmediği hakkında bir yorum da ekleyebilirdim. Montaj kodlaması için otomatik birim testi diye bir şey var mı?
Karınca

2

Kod ve yorumlar arasında bir denge sağlamalısınız ... Genellikle bir kod bloğuna devam eden bazı yorumlar eklemeye çalışırım. Çünkü kodu anlayamayacağım (aynı zamanda), ama kendi kodumu daha hızlı okuyabildiğim ve önemli olayların gerçekleştiği belirli bölümleri bulabildiğim için değil.

Her neyse, kendi kişisel kriterlerim "şüphede olduğunda yorum" dur. Anlayamayacağım, tamamen şifreli bir çizgiden çok fazladan bir çizgiye sahip olmayı tercih ederim. Bir süre sonra kod incelemesindeki yorumları her zaman kaldırabilirim (ve genellikle yaparım)

Ayrıca, yorumlar "Dikkatli olun! Girişin formatı ASCII değilse, bu kodun değişmesi gerekecek!"


Ne demek istediğinizi "bir kod bloğuna devam eden yorumlar" ile açıklayabilir misiniz?
Mark C

2

Bunu okuduğumda, ilk kez okuduğum bir şey hatırladım (uzun bir listeden, fotokopiler alarak korunmuş)

Gerçek programcılar yorum yazmaz - eğer yazmak zorsa okumak zor olmalı

Oldukça eski bir koku düşüyor.


2

Kod yorumlamanın hayata çok zayıf bir başladığını düşünüyorum. Bugünlerde bilmiyorum ama ilk önce okulda programlama öğretilirken, "Sayıları 1-10'u ayrı satırlara yazdıran bir program yaz. Kodunuzu yorumladığınızdan emin olun." Yorum eklemediyseniz işaretlenirsiniz, çünkü kodunuzu yorumlamak iyi bir şeydir.

Ama böyle önemsiz bir süreç hakkında söylenecek ne var? Yani sen klasik bir yazı yazıyorsun.

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

sadece iyi bir not almak için ve eğer bir aklınız varsa, anında kod yorumlarının çok düşük bir görüşünü oluşturur.

Kod yorumlama İYİ BİR ŞEY değildir. Bu, bazı şeyler için gerekli olan bir şey ve en üstteki cevabında Thomas Owens, gerekli olduğu durumlarla ilgili mükemmel bir açıklama sunuyor. Ancak, bu durumlar nadiren ev ödevi tipi görevlerde ortaya çıkar.

Birçok yönden, bir yorum eklemek son çare olarak düşünülmelidir, söylenmesi gerekenler programlama dilinin aktif kısımlarında açıkça söylenemediğinde. Her ne kadar nesne isimlendirme bayatlayabilse de, çeşitli insan ve bilgisayar geri bildirim eksikliği mekanizmaları yorumların korunmasını unutmayı kolaylaştırır ve sonuç olarak yorumlar aktif koddan çok daha hızlı bayatır. Bu nedenle, bir seçimin mümkün olduğu durumlarda, kodu daha açık hale getirmek için kodun değiştirilmesi, belirsiz kodların yorumlarda açıklanmasında her zaman tercih edilmelidir.


Kötü yorumlama alışkanlıklarının erken programlama sınıflarıyla başladığına işaret eden +1. -1, yorumların yalnızca son çare tercihi olduğuna karar vermek için.
AShelly

1

Tabii ki yorumlar bir kod kokusudur ...

Her programcı, hepimizin sonunda işlediğimiz , hata ayıkladığımız veya karşılaştığımız sade delilik nedeniyle çıldırdığını biliyor .

"Bunu yap!" proje yöneticiniz diyor.

"Bu yapılamaz" cevabını veriyorsun.

"O zaman yapacak başka birini bulacağız" diyorlar.

"Tamam, belki de yapılabilir" diyorsunuz.

Ve sonraki X günlerini, haftaları ... ayları… anlamaya çalışarak geçir. Süreç boyunca, denemeyi başaramazsınız, dener ve başarısız olursunuz. Bunu hepimiz yapıyoruz. Asıl cevap, iki tür programcı var, yorum yapanlar ve olmayanlar.

1) Gelecekte başvurmak üzere belgelemek, işe yaramayan başarısız rutinleri yorumlamak (işe yarayanı bulduktan sonra onları silmek değildir.) Ya da kodu yorumlarla bölmekle yapanlar ya kendi işlerini kolaylaştırıyorlar. biçimlendirme umarım biraz okumayı veya anlamayı kolaylaştırır. Cidden, onları suçlayamam. Ama sonunda, onlar kopar ve sonra bu var: // dammit this code sucks! swear! curse! i hate it! i am going to write something here to vent my anger!!!!

2) Süper kahraman gibi davranmayan ya da bir mağarada yaşayanlar . Onlar sadece başkaları ve kendileri için umursamaz bir şekilde umursamazlar ve kod ile daha az ilgilenebilirlerdi ya da daha sonra ne anlama gelebileceği konusunda.

Şimdi beni yanlış anlamayın .. Kendini belgeleyen değişkenler ve fonksiyonlar bunu tamamen önleyebilir .. ve güven bana asla yeterince kod temizleme yapamazsınız. Ancak basit gerçek şu ki, yedek tutmaya devam ettiğiniz sürece, HER ZAMAN yorumları silebilirsiniz.


1
1'e yanıt olarak Yorumlanan rutinlerdeki gerçek koku, çıkmaz olabileceğine karar verdiğinizde ve farklı bir şey denemek istediğinizde onları hemen silmiyordur - bunun nedeni, onları tekrar incelemeye karar verirseniz sürüm kontrolünde kullanılabilir olmalarıdır. .
Sharpie

1

Kodunuzda bazı yorumları kullanmamanın bir kod kokusu olduğunu iddia ediyorum . Kodun mümkün olduğu kadar kendiliğinden belgelenmesi gerektiği konusunda hemfikir olmama rağmen, kodun ne kadar iyi yazıldığına bakılmaksızın hiçbir anlam ifade etmeyen kodu göreceğiniz belirli bir noktaya çarpıyorsunuz. Yorumların hemen hemen zorunlu olduğu iş uygulamalarında bazı kodlar gördüm, çünkü:

  1. Durum bazında bir şey yapmalısınız ve bunun için iyi bir mantık yok.
  2. Yasalar değiştiğinde kodun bir veya iki yılda değişmesi ve onu hızlı bir şekilde tekrar bulmak istediğinizde.
  3. Biri geçmişte kodu düzenledi çünkü kodun ne yaptığını anlamadı.

Ayrıca, şirket tarzı kılavuzları size belirli bir şeyi yapmanıza yardımcı olabilir - bir işlevde hangi kod bloklarının yapıldığını belirten yorumlarınızın olması gerektiğini söylerlerse, yorumları da ekleyin.


1

Yorumlar ve kod arasında büyük bir temel fark vardır: yorumlar, insanların fikirlerini başkalarına iletebilmelerinin bir yoludur, oysa kod öncelikle bilgisayar içindir. “Kod” da sadece isimler ve girintiler gibi insanlar için de birçok husus var. Ancak yorumlar kesinlikle insanlar için, insanlar tarafından yazılmıştır.

Bu nedenle, yorum yazmak her yazılı insan iletişiminde olduğu kadar zordur! Yazar, izleyicinin kim olduğu ve ne tür bir metne ihtiyaç duyacağı konusunda net bir anlayışa sahip olmalıdır. Yorumlarınızı on, yirmi yılda kimin okuyacağını nasıl bilebilirsin? Ya kişi tamamen farklı bir kültürden ise? Vb umarım herkes bunu anlar.

İçinde yaşadığım küçük homojen kültürün içinde bile fikirleri başkalarına iletmek çok zor. İnsan iletişimi genellikle kaza haricinde başarısız olur.


0

İş arkadaşınla aynı fikirdeyim. Hep kodumu yorum yaparsanız ben endişeliyim anlamına geldiğini söylemek ı anlamaya mümkün olmayacaktır kendi kodunu gelecekte. Bu kötü bir işaret.

Yorumların kodun içine dağılmasının tek nedeni, mantıklı görünmeyen bir şey söylemek.

Bu yorumlar genellikle şöyle bir şey şeklinde olur:

//xxx what the heck is this doing??

veya

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

1
Veya, alternatif olarak, yorum, kodun, kodun kendiliğinden açıkça belirgin olmadığı karmaşık bir algoritmaya yönelik olduğu veya kodun sizin kontrolünüz dışındaki faktörler nedeniyle (örneğin harici bir servisle etkileşime girme) garip bir şey yaptığı gerçeğini yansıtıyor olabilir.
Murph

Çok doğru. İyi kodun açık olmamasının nedenleri olabilir. Şaşırtıcı kod olsa da çoğu zaman şaşırtıcıdır, çünkü karışık bir şekilde yazılmıştır.
Ken,

Sadece oynayacağınız 32k oyunun olduğu gömülü işlemciler için kod yazmamış gibi görünüyorsunuz ve bir şey belirsizleşiyor mu? Yorumlar hayat kurtarıcıdır.
Çabuk_ancak

0

Varsa, fonksiyon argümanları ve geri dönüş birimleri, yapı alanları, hatta yerel değişkenler veren kod yorumları çok kullanışlı olabilir. Mars Orbiterini hatırla!


Birimleri değişken isimlerine yerleştirmek için çok daha iyi, bu nedenle zayıf programcının onları hatırlaması gerekmiyor. 'Çifte uzunluk // metre cinsinden' yerine 'çifte uzunluk_m' deyin. Hepsinden iyisi, daha güçlü bir dil kullanmaktır; Kuvvet f; Tork t = l * f; baskı (t.in (Torque.newtonMeter));
kevin cline

0

İşte benim kurallarım:

  • Kodu yazın ve kodun kısa bir özetini ayrı bir belgede saklayın.
  • Başka bir şey üzerinde çalışmak için kodu birkaç gün yalnız bırakın.
  • Koda dön. Ne yapması gerektiğini hemen anlayamıyorsanız, özeti kaynak dosyaya ekleyin.


0

Hayır, yorumlar bir kod kokusu değil, sadece kötüye kullanılabilecek bir araçtır.

İyi yorum örnekleri :

// Bunun cm cinsinden olduğunu düşünüyorum. Daha fazla araştırma gerekli!

// X yapmanın akıllıca bir yolu

// Listenin burada boş olmadığı garanti edildi


Üçüncüsü IMO'nun kötü bir yorumudur. Neden olmasın Assert(list.IsEmpty)?
CodesInChaos

@CodeInChaos IMO Assert(!list.isEmpty())tam olarak üçüncü yorumdaki gibi bir sözleşme değil, sadece herhangi bir program mantığı gibi ünite testine tabi tutulması gereken davranış (yani, eğer argüman boşsa "IllegalArgumentException atın"). Devletler açıklama ile ince farka dikkat zaman yöntem kullanılabilir, ancak ön koşul yerine getirilmediği takdirde hiçbir davranışını belirler. Yorumdan daha da iyisi, derleme zamanı sözleşmelerini uygulamak olacaktır. Ancak bu benim cevabımın kapsamını aşıyor;)
Andres F.

AssertGenel API geçersiz argümanlar alsa bile, hiç olmaması gereken şeyleri açıkladıkları için egzersiz yapmamalısınız.
CodesInChaos

@CodeInChaos Ben fikrimi geri çekiyorum. İşte budur Sunacle iddiaların hakkında söyledikleridir . Görünüşe göre haklıydın. Her gün bir şeyler öğreniyorsun!
Andres F.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.