Netlik için kodlama standardı: Her kod satırına yorum yapın.


142

Hayata kritik bir yazılım üreten dükkanlarda çalıştım ve kodu okunaklı ve potansiyel olarak hayat kurtarmayı amaçlayan yorum kuralları ile uğraştım. Tecrübelerime göre, gereksinim bir kontrol listesinden atılmak için bir beyin ölümü angaryası haline geliyor ve anlaşılabilir kod yazmaya odaklanmama yardımcı olmuyor. Ayrıca, hakem değerlendirmecilerimin kodun anlaşılmasını nasıl kolaylaştıracağı konusunda benimle daha anlamlı bir konuşma yapmasını engelliyor.

Ayrıca yorum yapmayan öğrenci kodunu derecelendirdim ve neden onları ihmal etmek için işaretlenmeleri gerektiğini gördüm.

İyi isimler kullanmanın, yapıları basit tutmanın, işlevlerin kısa ve modüllerin odaklanmasının, kodların yorumların minimuma indirilebileceği kadar anlaşılır olmasını sağlayacağını biliyorum.

Ayrıca, yorumların kodun neden yaptığını değil neden yaptığını açıklaması gerektiğini de anlıyorum.

Tüm bunlar göz önüne alındığında, bu fikri yakalayan iyi kodlama standartları yazmak bile mümkün mü? Hakem değerlendirmesinde geçerli olacak, ancak daha fazla yardımcı olmayan notlar üreten akılsız bir kontrol listesi etkinliğine dönüşmeyecek olanlar: "42. satırda yorum yapmayı unuttun".

Bu kuralın kontrol listesindeki bir satır olarak kabul edildiğinde gerektirebileceği bir kod örneği:

/* Display an error message */
function display_error_message( $error_message )
{
    /* Display the error message */
    echo $error_message;

    /* Exit the application */
    exit();
}

/* -------------------------------------------------------------------- */

/* Check if the configuration file does not exist, then display an error */
/* message */
if ( !file_exists( 'C:/xampp/htdocs/essentials/configuration.ini' ) ) {
    /* Display an error message */
    display_error_message( 'Error: Configuration file not found. Application has stopped');
}

Bunu bir standartlar belgesinde doğru bir şekilde ifade etmek mümkünse ve basit bir şekilde olmayabilirse, şu satırlar boyunca bir fikir yakalamak isterim:

Her satır, dizi, ifade, bölüm, yapı, işlev, yöntem, sınıf, paket, bileşen, ... kodunun bir yorumunu düşünün. Ardından, bu yoruma ihtiyaç duymamak için yeniden adlandırmayı ve basitleştirmeyi düşünün; Yorumlar nadir iken kontrol edin. Son teslim tarihine kadar tekrarlayın. O zaman biraz daha tekrarla


21
Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
maple_shaft

32
“Yorumlar uzun tartışmalar için değil” bile kod yorumları için daha doğru. :) Bu /* Display an error message */yorumlar korkunç ve okunabilirliği gerçekten etkiliyor.
Andrea Lazzarotto 25:16

IDE'lerimizin yorumları gizleme seçeneklerine sahip olmaları gerekir. Belki hem blok hem de satır içi yorum için ayrı ayrı gizleme seçeneği. Bu şekilde her iki seçeneğin de en iyisini elde edersiniz. Çok fazla yorum yazın, ancak kodun temiz ve düzenli görünmesini sağlamak için bunları gizleme seçeneğine sahip olun.
Doug.McFarlane

1
@ Doug.McFarlane Vim için olması gerektiğini düşündüm. Tabii ki hem dosya hem de blok seviyelerinde - rtfm-sarl.ch/articles/hide-comments.html !
Michael Durrant

Yanıtlar:


171

Michael Durrant'ın cevabı IMHO'nun fena değil, ancak kelimenin tam anlamıyla soruyu yanıtlamıyor (kendisi tarafından itiraf ettiği gibi), bu yüzden şunu cevaplayacağım:

Ayrıca, yorumların kodun neden yaptığını değil neden yaptığını açıklaması gerektiğini de anlıyorum.

Tüm bunlar göz önüne alındığında, bu fikri yakalayan iyi kodlama standartları yazmak bile mümkün mü?

Açıkçası bir yazabilirsiniz kod yorumlara kontrol listesi gibi sorular içeren,

  • "Bir yorum varsa, kodun neden yaptığını açıklıyor mu?"
  • "Kodun her satırı - kendi bağlamında - ya yorum yapmaya gerek duymayacak kadar açıklayıcıdır, ya da değilse, o açığı kapatan bir yorum eşlik eder mi ya da (tercihen) kod değiştirilebildi mi? daha fazla yorum yapmak zorunda değil mi? "

İsterseniz, buna bir "kodlama standardı" diyebilirsiniz (ya da kodlama standardı teriminin bir braindead kuralları listesi için ayrılması gerektiğini düşünüyorsanız, yerine getirilip getirilmediğini cevaplaması kolay, kodun nasıl biçimlendirileceğini düşünüyorsanız gibi görünmeli ya da değişkenleri bildirecek yer olmalıdır). Hiç kimse sizi kolay bir rotaya girmek yerine sadece resmi kuralları koymak yerine, kontrol listenizin anlamsal sorular üzerinde yoğunlaştırmasını engellemez .

Günün sonunda ekibinizin böyle bir kontrol listesine ihtiyacı olduğundan emin olmalısınız. Bu tür soruları uygulamak için, gözden geçirenlerin tecrübesi olan programcılara ihtiyacınız var ve kodun bir uzman ekibinde okunabilirliğini gerçekten geliştirip geliştirmeyeceğini bulmanız gerekiyor. Ancak bu, ekibinizle birlikte çalışmanız gereken bir şeydir.


45
Bunu kim düşürdü? Bu kritik yazılım geliştirme için cevaptır. Bu, çoğu programcının çalıştığı yere kıyasla farklı bir dünya. Bu dünyalarda, her bir kod satırının kendi yorumuna sahip olmasını isteyen bir kodlama standardı doğru cevap değildir. Hiçbiri de yorum yapmıyor. OTOH, kod incelemesine konu olan yorumlar yapmak kesinlikle kritik yazılım için doğru standart standarttır. Daha gözden geçirilebilir ve korunabilir bir kod için yapar, ancak bu bir maliyetle gelir. Bu maliyet, kötü yazılmış yazılımlardan kaynaklanan multi milyon dolarlık davalarla karşılaştırıldığında.
David Hammen

4
akıllıca cevap. Kodlama için gerçek kurallar bulabilseydik, programcılara ihtiyacımız olmazdı. sadece makinelerin kodunu alabiliriz. olabilir! :(

4
@DavidHammen: Yorumunuz için teşekkür ederiz. Aslında, bunun yalnızca "kritik yazılım geliştirme" için geçerli olmadığını düşünüyorum. Yıllar boyunca, genellikle farklı kişiler tarafından tutulan ve geliştirilen her parça yazılımı, bir sonraki bakım programcısı için anlaşılabilir bir arı yetiştiriciliğinden faydalanacaktır.
Doktor Brown

5
Bu, sadece farklı insanlar tarafından tutulan kodlar için değil, herhangi bir kodlama için iyi bir tavsiyedir . Senaryo / program kullanan tek kişi olsanız bile, kodu bir yıl içinde değiştirmek zorunda kalacağınız gelecek netliği takdir edecektir (ve opak kodu deşifre etmek zorunda kalmadan harcadığınız zamanı).
Anthony Geoghegan

5
"Şu anda en çok oy alan cevabı" yanıtını daha objektif bir şeye göre düzenleyebilir misiniz? Her okuyucu bu cevapların oy tarihini bilmeyecek.
candied_orange

151

Daha az netlikle düşük kalite koduna yol açan ana anti-patern

btw okuyucu, başlık aslında "her kod satırı yorum?" oldu. İçimizdeki çoğumuzun içgüdüsel tepkisini hayal edebiliyorum. Daha sonra daha doğru bir unvanı almaya hak kazandım.

İlk başta sorunuzu okudum diye düşündüm, yorumlarda yinelenen şeyler yuch, ama tamam, belki birden fazla kişi tarafından incelemelerde yeterince striktür varsa ... ama sonra tekrar: insanlar hata yapar, tutarsızlıkları fark edemez vb. orada farklılıklar olacak. Yansıma üzerine, sorunun çok daha büyük olduğunu düşünüyorum:

Geliştiriciler daha kötü kod yazma eğilimindedir. Daha şifreli isimler ve yapılar kullanacaklar çünkü 'yorumda açıklanmıştır - bakın!'.

Düşünmek:

living_room_set = tables + chairs.

Şimdi düşünün:

set = tbls+chrs # Make the set equal to the table plus the chairs

Hem daha şifreli isimleriniz hem de okunacak daha çok şeyiniz yok, aynı zamanda ileri geri bakmak, koda bakmak, küme nedir? sola bak, yorumlara bak, tbls nedir, sola bak, yorumlara bak, chrs nedir, yoruma bak. Yuch!

özet

Bir geliştirici olarak şu anki pozisyonunuzda bulunmaya zorlanıyorsanız bir yorumlama standardı geliştirin veya geliştirin (Eski bir COBOL programlaması olarak, büyüklerini gördüm!) Ancak zamanınızın, enerjinizi ve tutkunuzu yorumlayıcı karşıtlığa karşı savunarak değişkenleri kullanarak desen:

  • Yalnızca bir tane değiştirildiğinde Kod ve Yorumlar birbirleriyle senkronize edilmiyor

  • Yorumlar, bir kişinin ne düşündüğünü açıklayabilir, ancak yanlış olabilir ve bu nedenle hataları gizleyebilir

  • Kod okumak zorlaşıyor

  • İyi kod yazmak zorlaşır

  • Daha fazla şifreli isim kullanma eğilimi

  • Kod ve açıklamalarda okunacak aşırı karakterler

  • Farklı editörler farklı stiller kullanır

  • Sadece kodlamadan daha yüksek İngilizce dil bilgisi gerektirir

  • Zaman ve kaynak alır ve uzun vadeli değerden çıkarır *

Artı , bu tür yorumlar olmadan daha iyi bir kod için savun, - aslında bir standart (!) Var - tüm değişken isimleri full_english_words olmalı - bir tane var! Bu yüzden bu 'standart' enerjiyi iyi yazılmış kod ve testlerin standartlarına doğru kullanın.

İki zor problemden biri, olayları adlandırmaktır - yorumlarda problemi atlamayın.

Diğer sorunlardan birinin erken optimizasyon olduğu ve genel olarak optimizasyonun 'neden bu şekilde' kodunu gizlemeye yol açabileceği göz önüne alındığında, bu, yukarıdaki uyarılar hala geçerli olsa da, açıkça zayıf kod için açıklayıcı yorumların yararlı olabileceği bir alandır.

* yarınlar kodu


8
Soruyu cevapladığına inanmıyorum. Soru, her satırda yorum yapmakla ilgili değil. Geliştiricilere, her satırda yorum yapmalarına neden olmadan kodu yorumlamalarını sormak istiyor.
hichris123

7
Evet, belirli standartlar sorusunu cevaplamıyorum, bunun yerine insanların o rotada ilerlememelerine yardımcı olmaya çalışıyorum. Dolayısıyla bu, belirli bir sorunun cevabı olmayabilir, ancak bir yorumda yer alması zor olan değerli tavsiyeler içerir.
Michael Durrant,

1
Diğer zor problem nedir?
David Grinberg,


1
Yorumlardan kaçınmak için nedenleriniz her biri karşılanabilir ancak StackExchange, burada hepsini ele almam için yeterince uzun yorumlara (heh) izin vermiyor. Basitçe: Aşırı oylama seçmen sahtekarlığı gibidir: olur, ancak çok nadiren olur; En son ne zaman gerçekleştiğini gördün? İyi yorumlar yazmak sadece bir düşünce olmamalıdır; Doğru yapılırsa, geliştirme sürecine yardımcı olur. Evet, kaynakları alır, ancak kazanç daha iyi bir koddur. Daha iyi bir değişken adlandırma standardı için yorumları feda ederek paranın karşılığını hiçbir zaman aynı elde edemezsiniz. Evet, her çizgiyi yorumlamak deliliktir.
kmoser

23

Kodlama standartları belgesinin, zaten genel olanın ne olduğunu belirtmenin yeri olduğunu sanmıyorum. Bir kodlama standardının amacı, makul kişilerin aynı fikirde olamayacağı konularla ilgili tutarlılığı sağlamak (ve tartışmalardan kaçınmak) ve tek bir açık ve doğru cevabı olmadığı, örneğin adlandırma, girintiler vb.

Örnekte olduğu gibi bu yorumlama nesnel olarak işe yaramaz ve deneyimsiz bir geliştiriciden veya yorumların varlığını mekanik olarak kontrol eden bir yapı sistemi ile çalışmak için kullanılan bir geliştirici (gerçekten kötü bir fikir, ancak var olabilir) nedeniyle olabilir. Her iki durumda da çözüm, muhtemelen kod incelemeleri yoluyla eğitimdir.

Her türlü "en iyi uygulama" türünü kodlama standardına eklemeye başlarsanız, daha önce birden fazla kitapta belirtilen tekrarları tamamlayacaksınız. Söz konusu geliştiriciye sadece "Temiz Kod", "Kod Tamamlandı" ve "Pragmatik Programlayıcı" satın alın ve kodlama standardınızı zayıf tutun.


63
Bu rakette 40 yıldan sonra öğrendiğim birçok şeyden biri, sağduyunun hiç ortak olmadığıdır.
John R. Strohm

10
Sağduyu diye bir şey yoktur.
whatsisname,

1
in_programming no .. gerçek dünya oh evet ama bu sadece gerçek dünyadaki tecrübeli bilgi için bir terim
Michael Durrant

@ JohnR.Strohm: Tecrübelerim sizinkinden çok daha olumluydu, ancak sağduyu kullanımının mekanik olarak zorlayan kurallar tarafından aktif olarak nasıl cesaretlendirilebileceğini de gördüm.
JacquesB

Bu cevap ile% 99,9 oranında anlaşma yapıyorum. Kodlama Standardı, geliştiricilerin Kod İncelemesinde bir tartışma gerçekleştiğinde gösterdikleri şeydir. Kod gözden geçirme, ürünü savaş başlatmayacak şekilde zenginleştirmek içindir. Kod İncelemelerinde Kod Yazma Standardı olmayan birçok savaş gördüm. Kodlama standardındaki öğelerin kontrolünü otomatikleştiremiyorsanız, içinde olması gerektiğini söylerim. Bir Kod incelemesi, daha az deneyimli geliştiricilere 'sağduyu' verme zamanıdır. Değişkenlerin isimlendirilmesi için mücadele etme zamanı değil. linux / kernel / gen_init_cpio.c line 335.
Andrew T Finnell

19

Mümkün değil. Esasen yapmaya çalıştığınız şey, neredeyse iyi karar vermeyi mekanize etmektir.

Yaşamı destekleyen tıbbi sistemler, kritik miktarlarda kontrol listeleri ve neredeyse kaçınılmaz olanlar gibi kritik yazılımlar yazarken. Sadece akıllı insanlar bile hata yapmakla kalmaz, bu cihazlara yönelik yazılımların çoğu işlerinde çok iyi olmayan insanlar tarafından yazılır, bu nedenle 'sistem' özensiz çalışmaya karşı güvence altına almak, güvenli bir şekilde yapmak için pazarlanabilirlik gideri.

En iyi seçeneğiniz, yorum yapmak ve ekibi örnek olarak yönlendirmek için titiz Kodlama Standartlarını dışlamaktır. Başkalarına, uygun şekilde yorumlanan iyi kalitede kod üretmeye çalışarak iyi yorumların nasıl göründüğünü gösterin. Nasıl yorum yazılacağını tarif etmenin nihai yolunu bulmak yerine (kendileri bir yargı çağrısından ziyade daha sık olanlardır) kendi kod incelemelerinizle günlük olarak ne demek istediğinizi gösterir. Diğer üyeler kodunuzu okudukça, yararlı olduğunu düşünüyorlarsa uygun olurlar. Ve eğer yapamazlarsa, hiçbir Standart başlangıçta daha iyi yorumlar yazmalarına yardımcı olmaz.


1
"İyi yargıyı makineleştirmeye çalışıyorsun" için +1, "Tek seçeneğin sadece en iyisini ummaktır" için, bu da oy vermememe neden oluyor. Eğitmek ve eğitim ekibinizin de bir seçenektir. Standartlar edebilir yargı için izin verir.
Joker

1
@Wildcard Belki de bir Standardın yargılamaya nasıl izin verebileceğini açıklayabilirsin? Bu o noktada bir rehber olmaz mıydı? Standart, "karşılaştırmalı değerlendirmelerde ölçü, norm veya model olarak kullanılan bir fikir veya şeydir". Kişi doğası gereği öznel bir şeyi nasıl kullanabilir, bu yüzden öznel bir kalitenin ölçüsü olarak kimlerin okuduğuna bağlıdır?
Andrew T Finnell 23:16

1
@Wildcard: Sorun, düzenlenmiş endüstrilere girdiğinizde, sürecin her şeye üstün gelmesidir; bir sürece sahip olmak, sürecin değerli olup olmamasından daha önemlidir. Bazı formlardaki onay kutularına her şeyin kaynaması gerekir, her onay kutusunun belirli ve doğrulanabilir olması gerekir ve bir onay kutusuna ne kadar fazla sahip olursanız, bir denetimde sıkıntı yaşama riskiniz o kadar artar.
whatsisname,

Garip bir dünya ve kuralların yazılım alanı hakkında çok az bilgisi olan bürokratlar tarafından yazıldığını ve sık sık kaliteli ürünleri temin etmenin bir aracı olmaktan ziyade kendilerini haklı çıkarmak ve bunlara ihtiyaç duymak için var olan sistemlerle sonuçlandığını unutmayın.
whatsisname,

1
@whatsisname Anladığım bir başkası olduğu için çok mutluyum. Cevaplarınız, benim için gayret gösterdiğimden daha zarif ve kesin olarak yazılmıştır. İfadesi with systems that exist to justify and require themselves rather than being a means to an end to ensure quality productsi göstermek için uğraş TAM budur. Sözlerimi benim için bulduğun için teşekkür ederim. Gerçekten demek istedim. Kaliteyi arttırma fikrini, aynı olmadıkları bir süreci takip etme fikrinden ayırmamız gerekir. Bu nedenle KG, Stackoverflow ve çok bağışlayan müşterilerimiz var.
Andrew T Finnell

14

Güncelleme

Vurgulama teklifindeki cevabım:

Yorumların Kodlama Standartlarında ele alınmaması gerektiğini belirten ve daha sonra bununla mücadele etmek için bir dizi savunma sorusu listelediğine dair cevabım tek doğru cevap.

Buradaki sorun, bir Kodlama Standartının tam da bir Standart olmasıdır . Son derece sübjektif fikirler gerekir değil bir olmak Kodlama Standardı . En İyi Uygulamalar kılavuzunda olabilir, ancak bu kılavuz Kod İnceleme sırasında bir geliştiriciye karşı kullanılamaz. Bana göre bir Kodlama Standardı, Automated'e mümkün olduğunca yakın olmalıdır. TÜM otomatikleştirilince adlandırma, boşluk bırakma, sekme, parantez, yorum vb. İle ilgili olarak Kod İncelemelerinde çok fazla zaman harcanmaktadır. Hakkında bile cevap tablesve chairsotomatik hale getirilebilir. LINT'ers sözlüklere, Kavram Başına Büyük Harf Çeklerine (Değişken, İşlev, Yöntem, Sınıf vb.) İzin verir.

JavaDoc kontrolü bile bir Çekme İsteği kabul edilmeden önce bir Robot LINT'er tarafından uygulanabilir. Bir çok Açık Kaynak projesi bu kesin şeyi yapıyor. Çekme İsteğinizi gönderirseniz, kod Statik Analiz de dahil olmak üzere bir Travis-CI dosyası ile oluşturulur ve nesnel olarak ifade edilebilecek tüm Kodlama Standartlarını geçmelidir. Hiçbir insan “yanlış yapmak” veya “yorumda bulunmama” ya da değişkenleri isimlendirmenin yanlış yolu hakkında hiçbir şey söylemez. Bu tartışmalar değer vermez ve en iyi şekilde, duygusal kodlamamızın netliğini alabilen üçüncü taraf bir robota bırakılabilir.

Aslında soruyu cevaplamak için , aşağıdaki soruyu nasıl cevaplayacağımıza değinecek bir Standart yazmayı ele almak zorunda kalacağız : Bu yorum size değer sağladı mı? Kodlama Standardı muhtemelen bir yorumun 'değerini' belirleyemez. Bu nedenle, bir insanın bu kontrol listesine girmesi gerekli hale gelir. Bir Kodlama Standardı'ndaki yorumlardan yalnızca bahsetmek, Orijinal Posterin kaçınmak istediği bir kontrol listesi oluşturur.

Bu nedenle yorumlar genellikle derleyici tarafından işlenmez ve çıkarılır. Onların değeri belirlenemiyor. Söz konusu yorum değerli midir? Evet veya Hayır?. Bu soruyu cevaplamak NP zordur. Yalnızca insanlar, doğru şekilde cevap verme şansına sahiptir ve o zaman bile, okuduğu kişi tarafından okunduğu zaman cevaplanabilir; Bu yorumun değeri, hava koşullarından, ev hayatından, katıldığı son toplantıya ve iyi bitmediyse, günün saati, yaptıkları kahve miktarından etkilenir. Resmin daha netleştiğine inanıyorum.

Herhangi bir standartta nasıl doğru bir şekilde ifade edilebilir? Standart, duygusallıktan çok objektiflik hakkında daha fazla olduğu yerlerde, tutarlı ve adil bir şekilde uygulanmadığı sürece yararlı değildir.

Bir Kodlama Standardının mümkün olduğunca Amaç olarak kalması gerektiğine itiraz ediyorum. Değişkenlerin IS hedefi olarak adlandırılma şekli. Doğru yazım, gramer yapısı ve mahfaza için bir sözlükle kolayca kontrol edilebilirler. Bunun ötesinde bir şey, en fazla güce sahip olan kişi tarafından veya "kaş atma" ile kazanılan bir "öfkeli eşleşme" dir. Kişisel olarak, yapmama konusunda mücadele ettiğim bir şey.

Yorum yaptığımda, üçüncü kişide gelecekteki benliğimle konuşurken her zaman yorum yaparım. 5 yıl içinde bu koda dönersem, ne bilmem gerekir? Ne yararlı olurdu, ne kafa karıştırıcı olurdu ve kodda güncel olmayan ne olurdu? Aranabilir bir genel API oluşturmak için kodlama kodu ile üçüncü taraf kendiniz bile olsa, bilinmeyen bir üçüncü tarafa değer sağlayan yorum kodu arasında farklı bir fark vardır.

İşte iyi bir turnusol testi. Projede SADECE biri olsaydı. Projede sadece sen olacağını biliyordun. Kodlama standartlarınızda neler olurdu? Kodunuzun gelecekte temiz, kendi kendini açıklayıcı ve anlaşılır olmasını istersiniz. Her satıra neden yorum yapmadığın konusunda kendin için bir kod incelemesi mi var? Teslim ettiğiniz 100 dosya üzerinde oluşturduğunuz her bir yorumu gözden geçirir misiniz? Değilse neden diğerlerini zorla?

Bu tartışmalarda kaçırıldığına inandığım bir şey de Geleceğin de bu projede geliştirici olduğudur. Değer hakkında soru sorurken, yarının da yorumdan değer elde edebilecek bir kişisiniz. Yani takım büyüklüğü, bence önemli değil. Takım deneyimi önemli değil, çok sık değişiyor.

Bunu gözden geçiren hiçbir yorum kodu yok, bir hız vericinin bir hastayı çökmesini ve öldürmesini engeller. Kodu etkileyen bir yorumdan bahsettikten sonra, yorumdan değil koddan bahsediyorsunuz. Tek gereken birisini öldürmek için eksik bir yorum ise, bu süreçte kokan başka bir şey var.


Bu tür zor kodlama yöntemlerinin çözümü, yazılımın kendisini yazmak için bir metodoloji olarak zaten sağlanmıştır. Ve yorumlarla ilgisi yok. Yorumlarla ilgili sorun, ürünün sonuçta çalışma biçiminde HAYIR etkisi olmadığıdır. Dünyadaki en iyi yorumlar, bir hızlandırıcı içerisine gömülü olduklarında yazılımın çökmesini önleyemez. Veya elektrik sinyallerini taşınabilir bir EKG ile ölçerken.

İki tür yorumumuz var:

Makine tarafından okunabilir yorumlar

Javadoc, JSDoc, Doxygen, vb. Gibi yorum stilleri, bir dizi kodun sağladığı ortak arayüzü yorumlamanın tüm yollarıdır. Bu arayüz sadece tek bir geliştirici (iki kişilik bir ekip için Özel kod), bilinmeyen sayıda geliştirici (örn. JMS) veya bir departman tarafından kullanılabilir. Bu kod, otomatik bir işlemle okunabilir; bu daha sonra bu yorumları, ala HTML, PDF ve benzerlerini okumak için farklı bir yol üretir.

Bu tür bir yorum için standart oluşturmak kolaydır. Herkese açık şekilde çağırılabilir her yöntem, işlev, sınıfın gerekli yorumları içermesini sağlamak için nesnel bir süreç haline gelir. Başlıklar, parametreler, açıklama et. El. Bu, başka bir ekibin kodu bulup kullanmasının kolay olmasını sağlamak içindir.

Delice görünen bir şey yapıyorum, ama gerçekten değil

Bu yorumlar, Niçin bu kodun belli bir şekilde yazıldığını neden görmesine yardımcı olmak için burada. Muhtemelen kodun üzerinde çalıştığı işlemcilerde sayısal bir hata vardır ve bu kod her zaman yuvarlanır, ancak geliştiriciler genellikle yuvarlayan kodlarla ilgilenir. Bu nedenle, koda dokunan bir geliştiricinin, geçerli bağlamın neden bir şey yaptığını anlamasının normal olarak mantıksız göründüğünü anlamasını sağlamak için yorum yapıyoruz , ancak gerçekte bu şekilde bilerek yazılmıştır.

Bu kod türü, bu kadar çok soruna neden olan şeydir. Genellikle yorumlanmaz ve daha sonra yeni bir geliştirici tarafından bulunur ve 'düzeltilir'. Böylece her şeyi kırıyor. O zaman bile, yorumlar sadece NEDEN herhangi bir şeyin kırılmasını önlemediğini açıklamak için var.

Yorumlar güvenilemez

Yorumlar sonuçta işe yaramaz ve güvenilmez. Yorumlar normal olarak programların çalışma şeklini değiştirmez. Ve eğer yaparlarsa, o zaman sürecin daha fazla soruna neden oluyor demektir. Yorumlar sonradan ve asla bir şey olamaz. Kod, bilgisayar tarafından işlenenler kadar önemlidir.

Bu kulağa asin gelebilir, ama benimle kal. Bu iki çizgiden hangisi gerçekten önemli?

// We don't divide by 0 in order to stop crashes.

return 1 / n;

Bu örnekte, önemli olan şey, 'n' nin ne olduğu hakkında hiçbir fikrimizin olmadığı, n'in 0 olması için herhangi bir kontrol bulunmadığıdır. Olsa bile, hiçbir şey bir geliştiricinin n = 0kontrolü kontrol etmeden sonra bırakmasını engellemez. Bu nedenle, yorum yararsızdır ve otomatikleştirilmiş hiçbir şey bunu asla yakalayamaz. Hiçbir standart bunu yakalayamaz. Yorumun, güzel (bazıları için) olmasına rağmen, ürünün sonucuna hiçbir etkisi yoktur.

Test Odaklı Geliştirme

Ürün üzerinde ne sonucu var? Yazılan kodun kelimenin tam anlamıyla birini kurtarabileceği veya öldürebildiği endüstriler titizlikle kontrol edilmelidir. Bu, kod incelemeleri, kod incelemeleri, testler, testler, kod incelemeleri, birim testleri, entegrasyon testleri, denemeler, aşamalar, test ayları, kod incelemeleri ve tek kişilik denemeler, aşamalandırma, kod incelemeleri, testler ve belki de sonunda yapılabilir üretime giriyor. Yorumların bununla hiçbir ilgisi yok.

NO yorumlu, spesifikasyonlu, spesifikasyonları doğrulayan ünite testleri, kodları üretim cihazında çalıştırma sonuçlarının incelemeleri, daha sonra hiç test edilmemiş veya daha önce hiç test edilmemiş herhangi bir şekilde kodlanmış herhangi bir kod içermeyen kod testleri tercih ederim. karşı kod.

Niçin birisinin belirli bir şeyi yaptığını anlamaya çalışırken belgeler güzeldir, ancak yıllar boyunca, belgelerin gerçekten ihtiyaç duyulmadığında 'akıllıca' bir şeyin neden yapıldığını açıklamak için kullanıldığını öğrendim. bu şekilde yazılmak.

Sonuç

Her satırı GEREKTİREN GEREKEN bir şirkette çalışıyorsanız, GARANTİ Projedeki yazılım mühendislerinden en az ikisi, hattın ne yaptığının genel fikrini belirleyen, Perl, Lisp veya Python'da bir otomatik belge programı hazırlamışlardır. , sonra bu satırın üstüne bir yorum ekler. Bunu yapmak mümkün olduğundan, yorumların yararsız olduğu anlamına gelir. Kodu otomatik olarak belgelemek ve bunları 'Her Satırda Yorum Yapma'nın neden zaman kaybettiğine, hiçbir değer sağlamadığına ve potansiyel olarak incindiğine dair kanıt olarak kullanmak için bu komut dosyalarını yazan mühendisleri bulun.

Bir kenara, programlama görevinde yakın bir arkadaşıma yardım ediyordum. Öğretmeni, her satırın belgelenmesi gerektiğine dair bir şart koymuştu. Böylece bu düşünce sürecinin nereden geldiğini görebiliyorum. Sadece kendinize sorun, ne yapmaya çalışıyorsunuz ve bu doğru olanı mı? O zaman kendinize sorun; Bu süreçte sistemi 'oyuna sokmanın' herhangi bir yolu var mı? Varsa, o zaman gerçekten herhangi bir değer katıyor mu? Bir kişi otomatik olarak kodun belirli bir şartnameyi karşıladığını test eden birim testlerini yazamaz ve eğer yapabilselerdi, bu kötü bir şey olmazdı.

Bir cihazın belirli koşullar altında çalışması gerektiğinden, bir insanın içinde olacağından, onları öldürmeyeceğinin garantilenmesinin tek yolu yıllarca süren sınavlar, meslektaşların incelemeleri, denemeler ve daha sonra bir daha asla ASLA kod değiştirmemesidir. Bu yüzden NASA hala bu kadar eski donanım ve yazılımı kullanıyordu. Yaşam ya da ölüm söz konusu olduğunda, sadece 'küçük bir değişiklik yapıp kontrol etmeyin'.

Yorumların hayat kurtarmakla ilgisi yok. Yorumlar insanlar içindir, insanlar yorum yazarken bile hata yaparlar. İnsanlara güvenme. Ergo, yorumlara güvenme. Yorumlar sizin çözümünüz değil.


3
Yorumlarla ilgili sorun, ürünün sonuçta çalışma biçiminde HAYIR etkisi olmadığıdır. kuyu eğer düşünüyorum okuma ve yazma kod sayımları insan bölümü yok nasıl etkiler sonuçta ama işleri kodu değil nasıl yürütür nihayet yazılı zaman, evet. Kod ile ilgili problemin güncelliğini yitirdiğini ve sonra kod olmamasından daha kötü olduğunu söyleyebilirim !
Michael Durrant

1
Burada, yaptığımız işle ilgili işleri en iyi hale getirebilmesi için yaptıklarımızla ilgili günlük raporlar isteyen bir bekçi vardı. Her halükarda, formunu doldurmak için her gün 15 dakika harcamak zorunda kalmamız gerektiğine dair biraz öfkeli olduk, bu yüzden kütüklerimizden çöpleri doldurarak bunu otomatikleştirdik.
Joojaa

1
"Çökmeleri durdurmak için 0'a bölmeyiz" yorumunda fazladan bir sorun var . Dilbilgisi, "sıralamak için" maddesinin bölünme eylemi veya olumsuzlaması için geçerli olup olmadığı açık değildir. Eğer kullanmak için "0'a bölmekten kaçınırız" kullanırsanız, bu belirsizlikten kaçınırsınız. :)
Wildcard

1
“kazaları durdurmak için sıfıra bölme” aslında bana bunu yazan kişinin zihniyeti hakkında çok şey anlatıyor. Kilitlenmeleri önlemek için kod yazmazsınız! Kodun doğru olması ve kodun çökmemesinin doğru olmasının sadece küçük bir kısmı olması için kod yazıyorsunuz. Enjekte etmek tıp miktarı için hesaplama sıfıra bölme işlemi biter varsa, ... 99999 gibi bazı kukla değeri döndürmek yok
immibis

1
@AndrewTFinnell, bazen sıfır hatayla bir bölme elde ederseniz, "if (divisor == 0) return <something>; // sıfıra bölmekten kaçın" ekleyerek kodunuzu daha doğru yapmazsınız demek istiyorum. Bunun yerine bölenin neden sıfır olduğunu bulmanız ve düzeltmeniz gerekir. Bazı algoritmalar sıfır bölen kaçınılmaz olacak şekilde tasarlanmıştır, ancak istisnadırlar (Ve bu durumda bir "sonuç hesaplanamaz" değerini döndürebilirsiniz).
immibis

12

Yorumlar hakkında konuştuğunuzda almanız gereken iki farklı şey var. Aynı değiller ve ayrım önemlidir.

Dokümantasyon size bir kod parçasının dışa dönük parçalarını - arayüzünü anlatır.

Genellikle takımlar, bunları 'bağımsız' bir şekilde okumanıza izin verir, yani aynı anda altta yatan koda bakmıyorsunuz.

Tüm arayüz belgelenmelidir (örneğin, özel yöntemler hariç her yöntem) ve girdiler, çıktılar ve diğer tüm beklentiler, sınırlamalar vb., Özellikle de kısıtlamalar, testler vb. Tam olarak ne kadar detay ve nereye gittiği projeye bağlı.

İyi dokümantasyon, potansiyel tüketicinin, kodu ne, ne zaman ve nasıl kullanacağına karar vermesine izin verir.

Kaynak koddaki yorumların farklı bir amacı vardır. Kaynak koduna bakan insanlar için oradalar. Öncelikle uygulamayı açıklarlar.

Yorumlar her zaman altta yatan kod arasında okunur.

Yorumlar, şaşırtıcı kararları veya karmaşık algoritmaları veya alınmamış seçeneklerin (ve muhakeme) açıklamalıdır. Gelecekteki geliştiricilerin öncüllerinin düşünce süreçlerini anlayabilmeleri ve ellerinde başka türlü göz ardı edip görmeyecekleri bilgiyi ellerinde bulundurmaları için oradalar.

# 'map' outperforms 'for' here by a factor of 10  

// This line works around an obscure bug in IE10, see issue #12053  

-- We are going to recursively find the parents up to and including the root node.
-- We will then calculate the number of steps from leaf node to root node.
-- We first use a WITH clause to get the ID of the root node.

Bir yorumun yokluğundan hiçbir şey çıkartamazsınız ve yorum elbette çevre kod kadar yanlış olabilir. Yargı hem yazarın hem de okuyucunun tarafında yapılmalıdır.

Her satırda bir yorum yapmak açıkça bir fırsat maliyeti ile gelen şüpheli ek bir değere sahiptir. Her satırın yorumlanması gerektiğini söyleyen bir kuralınız varsa, bunu alacaksınız, ancak önemli bölümlerin iyi bir şekilde yorumlanması pahasına .

Ancak bundan daha kötüsü: Her satırda yorum yapıldıysa, yorumun amacı yenilmez. Yorumlar kodu okumayı zorlaştıran gürültü haline gelir: açıklığa kavuşturmak yerine belirsiz. Dahası, ayrım gözetmeyen yorum yapmak gerçekten önemli yorumları tespit etmeyi zorlaştırır.

Ne yorumlar ne de belgeler, tanımladıkları kod kalitesine ilişkin herhangi bir önlem veya garanti sağlamaz; Orijinal KG için bir yedek değildir. Amaçları ileriye dönük, yani etkileşimde bulunanlara hata yapmaktan kaçınmalarına yardımcı olacaklarını umarak.

Özetle , kodlama standartlarınız dokümantasyon gerektirebilir ve gerektirmelidir (otomatik kontroller belgelenmemiş işlevlerin / yöntemlerin belirlenmesine yardımcı olur, ancak yine de belgelerin iyi olup olmadığını kontrol etmeleri gerekir). Yorumlar bir değerlendirme görüşmesidir ve stil rehberiniz bunu kabul etmelidir. Hiç yorum yapmayan ve düşünmeden yorum yapanların meydan okumasını beklemeleri gerekir.


Genel API'yi belgelemek iyi bir nokta ama şaşırtıcı kararları açıklamayı gerçekten seviyorum. En azından şaşkınlık ilkesinin ihlali en azından bir gerekçeyle ortaya çıkarsa çok hoş. +1
candied_orange

1
Gürültü gibi yabancı yorumlar için +1. Gürültüyü yüksek seviyede tutun.
sq33G

Her satır yorum yapıldığında özellikle bir yorum amacıyla +1 yenilir. Çok kötü bir şey olabilir (ve çoğu zaman) hiç yorum yapmamak için bir mazeret olarak kullanılabilir, ancak yine de çok doğru, çünkü bahsettiğiniz nedenlerden ötürü, çünkü eğer her satırda yorum yapılırsa çoğu kişi otomatik olarak ve anlaşılır bir şekilde tüm yorumları görmezden gelmeye başlar .
SantiBailors

10

Bir yorum standardını kodlayamazsınız, çünkü önemli yorumun önceden ne olacağını bilemezsiniz.

Fakat yine de, kodun doğru şekilde yorumlandığından emin olmak istiyorsunuz, çünkü bu hayati öneme sahip bir koddur. Çözüm, kod incelemesi için bir standarda sahip olmaktır - bu kod incelemesinin anlaşılabilirlikle ilgili yorumlarını gerektirir.

Bu, anlamsız bir kontrol listesine dönüşmeyeceğini garanti etmeyecek, ancak en azından kodu okumayı zorlaştırmasını engelleyecektir. Ve daha iyisini yapma imkanı var.

Bu, kod incelemesinin kendisinin anlamsız bir jest olmadığı, kodunuzun okunması zor bir şekilde geri gönderilmesinin iyi bir şey olduğu, hakaret veya sıkıntı olmadığı bir kültür gerektirir. Bir o kadar önemli, biri belirsiz olduğu söylendiğinde, okuyucunun başarısızlığı olarak görülmüyor.

Okunamayan kod, bir dereceye kadar kaçınılmazdır. Çünkü yazar, bağlamın içine daldırılmıştır ve yalnızca x, y veya z'yi biliyorsanız, açıkça görüldüğü zaman açık bir şey görecektir.

Bu nedenle, iyi geribildirim veren bir kurala sahip olamazsınız, ancak yorumları kontrol edebilirsiniz. Programcı olmayan bir yönetici bile bunu yapabilirdi - çünkü asıl soru okunabilir olmak için yazılmış kod değildi, fakat kod gerçekten okunabilirdi;


7
Re Bir yorum yapma standardını kodlanması olamaz - Elbette yapabilirsin. Kod incelemesine konu olan yorumlar yaparsınız ve yorumların kodu açıklamadığını söyleyen kod inceleme öğesi ele alınmalıdır. Bu bir masraftır, çoğu programlama ortamının ödemek istemediği bir masraftır. Kritik yazılımlar için karşılığını verir.
David Hammen,

“... eğer sadece x, y veya z'yi biliyorsanız açıktır.” Bir şeyi açık ve sonra görmek için önceden bilinmesi gereken {x, y, z} bilgi miktarını belirleyebilirsiniz. mekanik olarak) bunun geçerli kod için geçerli olup olmadığını kontrol edebilirsiniz. Olmadığında, olduğu kadar yorumlar ekleyin.
Trilarion

1
@DavidHammen: Bu yorum için bir standart değil, yorum için bir standart. Çözüm olarak önerdiğim şey buydu. Belli bir boyutta olması gerektiğini, belirli bir sözdizimi kullandığını ve hatta ilk etapta bir yorum gerektirdiğini bile söyleyemezsiniz (veya "i'ye bir tane ekle" yazın). Gözden geçirenin kod ve yorumlar hakkında yorum yapması gerektiğini söyleyebilirsiniz . Dediğiniz gibi, kod incelemesinde ortaya çıkan sorunların ele alınmasını isteyebilirsiniz. Ancak bunun için bir onus iyi bir iş yapmak için hakemde olmalı. Yalnızca gözden geçiren kişi kodun ve yorumun yeterli olup olmadığını yargılayabilir.
jmoreno

@DavidHammen İnceleme için seçilenler karar çağrısını mı yaptı? Ve ne zaman ayrılıyorlar? Yeni insanlar aynı şekilde düşünmezse veya İngilizce konuşabiliyorsa? 'Gözden Geçirenler' ayrılırsa? Öneriniz, birkaç geliştiriciyi Fildişi Kule'nin üzerine yerleştirerek muhalif, güvensizlik ve iletişimin bozulmasına yol açıyor. Yorumlar, onu kullanabilecekler için içgörü ya da açıklama sağlamak içindir. Belki Joe'nun buna ihtiyacı var ama Mary'nin ihtiyacı yok. Gözden geçiren Mary olduğunda ne olur? Veya Joe? Veya Mark?
Andrew T Finnell

@jmoreno - Kodlama standartlarına yorumlarla ilgili kurallar / kılavuzlar koymamak, programcıların birden fazla kaynağa bakması gerektiği anlamına gelir - ve yorumların standartların altında olduğunu söyleyerek geri dönene kadar nereye bakılacağını bilmezler. Kodlama standardındaki her şeyin otomatikleştirilebilir olması gerektiğini düşünmek yanlıştır. Örneğin, anlamlı isimler üzerindeki kurallar otomatik olarak değiştirilemez. En azından henüz değil. Örneğin, x, y, ve z, veya i, jve kbiri kendi formüllerde tam bu isimleri kullanılan bir dergi kağıda dayalı bilimsel bir algoritma uygulayan ise oldukça anlamlı isimler olabilir.
David Hammen

9

Her kod satırına yorum yapın? Hayır .

Bahsettiğiniz diğer kuralların amacı, kesinlikle bundan kaçınmaktır.

Okunabilir bir koda yapılan yorumlar en iyisidir ve en kötüsü yorumun varolmayan amacını aramaktan bir okuyucu çıkaracaktır.

Açıklayıcı olan tüm kodu yorumlarsanız, ek bilgi vererek okuma miktarını ikiye katlarsınız. Bu kadar fazlalığın işe yarayacağından emin değilim. display_errorYorum yapan kişi "uyarıyı gösterir " derken bir yorumcunun 42 olduğunu " " belirttiğini hayal edebilir . Ancak kodda bir değişiklik olduğunu hayal edin. Şimdi düzeltmek için iki yeriniz var. Bu stilin kopyala-yapıştır negatifleri olduğu anlaşılıyor.

En uygun şekilde, kodun dokümantasyon dışında herhangi bir yoruma ihtiyaç duymaması gerektiğini söyleyebilirim.

Tamamen karşıt stiller var, eğer çizgi hakkında şüpheleriniz varsa:

  1. Kod çok karmaşıktır ve kod bölümü için anlamsal olarak adlandırılmış bir isme sahip bir işleve yeniden yansıtılmalıdır. ifBir algoritmanın karmaşık veya bir kısmı olabilir. (Veya akıllı bir LINQ tek astar)

  2. Basitleştirilemiyorsa, yeterince dil deyimi bilmiyorsunuz.

(Şahsen ben hiç yorum yapma kuralının bir fanatiği değilim, ama bunu başarabilmek için iyi bir zihniyet olarak buluyorum.)

Tüm bunlar göz önüne alındığında, bu fikri yakalayan iyi kodlama standartları yazmak bile mümkün mü?

Süreci gelince. Standartımız gözden geçirene oldukça fazla kredi verdi. Kötü niyetli olmadıklarını varsayarsak bu işe yarar.

"Değişken onedir?" Diye sorduğunda , onu yeniden adlandırırsınız. Bu bloğun ne yaptığını sorarsa, refactor veya yorum yapın. Bir şeyin net olup olmadığına dair bir tartışma varsa, gözden geçiren kişi bulamadıysa, tanım gereği bu değildir. Çok nadir durumlarda, birkaç arkadaşın 2. görüşü gibi bir şey vardı.

Ortalama olarak, takımdaki ortalama programcı tarafından anlaşılabilir bir kod edinmelisiniz. IMO gereksiz bilgileri uzak tutar ve kodun en iyi bir optimum bulduğumuz takımın en az bir üyesi tarafından anlaşılabilir olmasını sağlar.

Ayrıca, mutlak bir şey yoktu . Küçük bir grup olduğumuza rağmen. 5 grupta konsensüs bulmak kolaydır.


2
Hangi değişkenlerin, sınıfların ve yöntemlerin seçilmesi gerektiğini belirlemek için kod incelemelerini kullanmak, insanları bir şirketten, işletmeden veya metodolojiden nefret ettirmenin en iyi yoludur. Kod incelemeleri, gerçekten önemli olmayan şeyleri zorlamanın bir yolu olarak kullanılmamalıdır. Bir Kodlama Standardı otomatik bir işlemle kontrol edilebilir olmalıdır. Değişken ad uzunluğu, Dairesel Karmaşıklık, Demeter Kanunu, kontrol edilebilen her şeydir. Birisi 'i' değişkenini indexForThePreviousCollection gibi bir şeye yeniden adlandırmamı söyleseydi, çalışacak başka bir yer bulurdum. Değişkenlerin> 3 karakterin tümü otomatik giriş yapmadan önce kontrol edilir.
Andrew T Finnell

3
@AndrewTFinnell İsmini verdiğiniz herhangi bir programlama paradigmasında kodu takip etmek imkansız olabilir.
candied_orange

2
@AndrewTFinnell Peki, kibarca katılmıyorum. " Dikte etmek için kod incelemelerini kullanma ", bunu nereden çektiğini bilmiyorum. Ben değişkenlerle kod üzerinde çalışmak istemem i, j, kbiryere sonra orijinal yazar kapanıyor. "İnsan" genomundaki amacınızı anlamıyorum. Tek ya da iki ifadenin anlaşılması zor olan bir dil olduğundan şüpheliyim. Dediğim gibi, karmaşık ifve LINQtek gömlekleri gördüm . Anlamsal olarak anlamlı bir isim altında yorumlanabilir veya düzeltilebilirler, sanırım bu sizin "iyi yorumunuz".
luk32

3
@ luk32 Katılmama hakkına saygı duyuyorum. Yineleme değişkenleri bence bağlamsal olarak oldukça açık. İfadenizin duygularını anlasam da, bu duyguyu aşırı uçlara götüren çok fazla uygulama olduğuna inanıyorum. : Gerçekten okur koda ihtiyacım var for (int indexForCurrentDatabaseRow = 0; indexForCurrentDatabaseRow < currentUserRecordSetResults.length; indexForCurrentDatabaseRow = indexForCurrentDatabaseRow + 1)karşı for (int i = 0; i < results.length; i++)? Belki de, koda bakmak için harcanan tercih ve / veya zaman meselesidir. Aşırı ayrıntılı isimler bana kokuyor.
Andrew T Finnell,

2
İsimlerin kod incelemelerinde karar verilmesi gerektiğini sanmıyorum. Kod incelemesi genellikle yazarın yeterince iyi olduğunu düşündükten sonra başlamalıdır, bu da doğru bir şekilde yorumlandığı, anlaşılması kolay ve değişkenlerin uygun adlara sahip olduğu anlamına gelir. Mesele şu ki, gözden geçirenler kodun çok karmaşık olduğunu düşünüyor veya bir değişkenin anlamıyla mücadele ediyorlarsa, kodu anlamak zordur. Bu tartışmalı değil - açıkça en az bir geliştirici - gözden geçiren - anlamadı. Yeniden refaktor edilmesi (ve nasıl) veya doğru şekilde yorumlanması gerekip gerekmediği farklı bir konudur.
Idan Arye,

9

Soru:

Tüm bunlar göz önüne alındığında, bu fikri yakalayan iyi kodlama standartları yazmak bile mümkün mü? Hakem değerlendirmesinde geçerli olacak, ancak daha fazla yardımcı olmayan notlar üreten akılsız bir kontrol listesi etkinliğine dönüşmeyecek olanlar: "42. satırda yorum yapmayı unuttun".

Yorumlar okuyucuyu dil üzerinde eğitmeye çalışmamalıdır. Bir okuyucunun dili yazardan daha iyi, yazardan çok daha az bağlamda tanıdığı varsayılmalıdır.

Bu kodun bir okuyucusu, örneğin, exit()uygulamadan çıkacağını bilmelidir - bu nedenle yorumu gereksiz kılar:

/* Exit the application */
exit();

Gereksiz yorumlar bir DRY ihlalidir ve kodda yapılan değişiklikler, kodun gerçekte ne yaptığını yansıtmayan yorumlar bırakmadan mutlaka yorumlara yayılmaz.

Bununla birlikte, bir şeyi neden yaptığınızı açıklayan yorumlar değerli olabilir - özellikle de kodun içindeki anlamı kolayca iletemiyorsanız.

Python'un PEP 8'i (CPython standart kütüphanesindeki Python için stil rehberi), satır içi yorumlar için aşağıdaki yönergeleri sağlar:

Satır içi yorumları dikkatli kullanın.

Satır içi yorum, ifade ile aynı satırdaki yorumdur. Satır içi yorumlar, ifadeden en az iki boşlukla ayrılmalıdır. Bir # ve bir boşlukla başlamalılar.

Satır içi yorumlar gereksizdir ve gerçekte açıkça ifade ettikleri takdirde rahatsız edicidir. Bunu yapma:

x = x + 1                 # Increment x

Ama bazen, bu yararlıdır:

x = x + 1                 # Compensate for border

Böyle bir örnek verildiğinde, şahsen bir adım daha ileri gitmeyi tercih ediyorum ve bu yorumu da ortadan kaldırmaya çalışacağım. Örneğin, şu noktalara varabilirim:

border_compensation = 1
compensated_x = x + border_compensation

Kodunuzu kendi kendinize belgelendirme yapmak yeni bir fikir değildir .

Asıl soruya dön:

Tüm bunlar göz önüne alındığında, bu fikri yakalayan iyi kodlama standartları yazmak bile mümkün mü?

PEP 8 rehberliğinin ve örneğinin bu fikri yakalayan iyi bir kodlama standardı gösterdiğine inanıyorum. Yani evet, mümkün olduğuna inanıyorum.


1
“Bir okuyucunun dili yazardan daha iyi bildiği varsayılmalıdır” Bunun doğru bir tutum olduğuna inanmakta zorlanıyorum. Ben bildikleri varsayarak görebilirsiniz kadar , ama her takım farklı ve bu noktadan hareketle bir battaniye açıklamada akıllıca görünmüyor böylece bir takımda her insan farklıdır.
Bryan Oakley

4
Bu rehberlik olmadan, kendi başlarına kimseye önemsiz kodu açıklayan yorumlar yapan genç programcılara ve sadece genç programcılar için kodu daha erişilebilir hale getirmek için garip çözümler kullanan orta seviye programcılarına sahip olacaksınız. Bu rehberlik fazlalığı ortadan kaldırır ve yetkin bir programcının bile kodlarını geliştirmeye devam etmesini sağlar. Kodu kendim tekrar ziyaret ettiğimde, bağlamı unutmuş olabilirim, ancak genel olarak, dilin ilk yazdığımdan daha iyi ne yaptığını biliyorum.
Aaron Hall

4

Sanırım bu tür bir yorum gördüğünüzde, bazen de bu şekilde kendim yazıyorum, Çünkü yazarı yorumlarda yazanları yazıyor, sonra da her bir yorumdan geçiyor ve uyguluyor.

Gerektiğinde işlevselliği yerine gerekli işlevselliği açısından anlaşılabilir kod üreten bir kodlama standardı yazmaya zorlanırsak (böylece hataların tespit edilebilmesi için) o zaman gerçekten özelliklerin nasıl tanımlandığı, belgelendiği ve bunlarla bağlantılı olduğu hakkında konuşuyoruz. son ürün?

Düzenle ----

Sadece netleştirmek için. Yorumlara vs tdd'ye karşı en iyisi ünite testlerine girmiyorum. Veya her satıra bir yorum önermek iyi / kötü

Ben sadece örnekte bahsi geçen yorum yapma tarzını görebilmeniz için bir neden öneriyorum.

Ve bu sorgulamadan, yorumlama ile ilgili bir kodlama standardının bir tür şartname belgesi şartı olarak daha iyi yazılıp yazılmayacağı daha iyi olur.

yani yorumlar, amacı açıklamak içindir, ki bu da bir özelliktir.


6
20 yıl boyunca hiç kimsenin yorum prototipini kodlarını bu şekilde görmedim, sonra boşlukları gerçek kodla doldurdum. Söylediklerinize veya söylediklerinize ulaşmak için zaten nesnel bir yol var. Buna Test Odaklı Gelişme denir. Birim Testleri, spesifikasyonu ve kodun bu spesifikasyona uyup uymadığını tanımlar. Hepsi yorum yapmadan.
Andrew T Finnell

9
Sorudaki kodun bunun iyi bir örneği olduğunu düşünmemekle birlikte, önce yorumlarda bir prosedür yazma ve daha sonra geri dönüp kodu doldurma uygulaması "Kod Tamamlandı" olarak özel olarak adlandırılıyor. @AndrewTFinnell, okunabilir kod üretmek için olası bir uygulama. Deneyiminiz dışında olsa bile, kesinlikle duyulmamış bir şey değil.
Josh Caswell

6
Ayrıca tdd inanıyorum inanıyorum
Ewan

2
Sahte Kod Programlama Sürecinden mi bahsediyorsun? Bunun amacı yorumları azaltmaktı. Yorumları belirten kitabın kodda bırakılması gerektiğini hiç hatırlamıyorum. Kavramsal bir prosedür üretmek için yorum yapmak, düşük seviye değil yüksek seviye anlamına gelir. Biri yazmak istedikleri her satırı yorumlayacak olsaydı, sadece satırları yazabilirlerdi. Fikir, her satırın değil, kodun ilkelerini prototip yapmaktır. Kitap her satırda yorum yapmayı önermiyor. Bu, bu sorunun odak noktası. Yanılıyor olabilirim ama bunun İkinci Basım'da olduğuna inanıyorum.
Andrew T Finnell

2
@JoshCaswell & Ewan, evet , yıllar önce bir teknikti ve gerçekten TDD'den önce geldi. Ancak daha sonra yorumları silmek zorunda kaldınız! Ve TDD, bir şartnameye uyan kod yaratmanın mantıklı bir yolu olarak bunu tamamen destekledi.
David Arno,

4

Tüm bunlar göz önüne alındığında, bu fikri yakalayan iyi kodlama standartları yazmak bile mümkün mü? Hakem değerlendirmesinde geçerli olacak, ancak daha fazla yardımcı olmayan notlar üreten akılsız bir kontrol listesi etkinliğine dönüşmeyecek olanlar: "42. satırda yorum yapmayı unuttun".

Bu açık bir şekilde dokümantasyonun ötesine geçiyor - bu kodun nasıl yapılandırıldığına, hangi algoritmaların seçildiğine vb. Değiniyor. Gereksinim analizi ve tasarımına bile değinebilir.

1 numaralı kuralım "Belli olanı belgeleme" dir. # 2 kuralı "Açık kod yaz" dır.

Güvenlikle ilgili kritik kodlar (üzerinde çalışmak zorunda kalmadığım, Tanrıya şükür) için bu, gerekli ancak hiçbir yerde yeterli ilk adımın yakınında değildir. Hangi dil özelliklerinden kaçınılması gerektiğini zorunlu hale getirmek için aşağı gelmek bile gerekebilir (" scanf( "%s", input ); Herhangi bir sebepten kullanmazsınız" şeklinde birden fazla standart şart gördüm .)


Bariz, sahibinin gözündedir. Ve son tarihe bağlı olarak değişir.
Tony Ennis

3

Kendi kendini belgeleyen kod en iyi uygulama ana akım bir fikir birliği değildir - anlaşılması kolay kodun şifreli koddan daha iyi olduğu yaygın olarak kabul edilebilir olmakla birlikte, herkes karmaşık kodun her zaman yeniden yapılandırılmasının gerekip gerekmediğini veya yorum yapmanın uygun olup olmadığını kabul etmemektedir. o.

Ancak bu tartışma, anlaşılması zor olan kod parçalarıyla ilgilidir - ve her kod satırını yorumlamaktan bahsediyorsunuz . Anlaşılması zor olan kod satırları çok nadir olmalıdır - satırlarınızın çoğu böyle karmaşıksa, akıllı eşek tek gömlekleri fazla kullanıyorsunuz ve durmalısınız! Elbette, bir çizginin rolünü bazen anlamak biraz zor olabilir, ancak bu daha büyük bir kod parçası bağlamındaki rolü - çizginin kendisinin yaptığı şey neredeyse her zaman kolaydır.

Bu yüzden, satırları yorumlamamalısınız - kod parçalarını yorumlamalısınız. Belirtilen satırların yanına özel yorumlar yerleştirilebilir, ancak bu yorumlar hala daha büyük koda atıfta bulunmaktadır. Satırın neyi / niçin yaptığını tanımlamıyorlar - bu kodda ne yaptığını ve / veya bu kodda neden gerekli olduğunu açıklıyorlar.

Yani yorumlanması gereken satırlar değil, daha büyük kod parçaları. Her kod parçası yorumlanmalı mı? Hayır. Harold Abelson " Programların insanların okuması için yazılması gerektiğini, ancak sadece makinelerin çalıştırması için tesadüfler " dedi. Ancak yorumlar yalnızca insanların okuması içindir - makine bunları yürütmez. Kodlama standartlarınız her satır / kod parçasına fazladan yorum yazmaya zorlarsa, sadece bunları yazması gereken geliştiriciye yük değil - aynı zamanda onları okumak zorunda kalacak geliştiricilere de yük oluyorsunuz !

Bu bir problem, çünkü okuduğunuz yorumların çoğu gereksiz olduğunda, onlara dikkat etmekten vazgeçersiniz (çünkü gereksiz olduklarını biliyorsunuzdur) ve sonra önemli yorumları kaçırırsınız . Ben de diyorum ki - sadece önemli yorumlarınızı yazın, böylece birileri kodda bir yorum gördüğünde kodu anlayabilmek için okumaya değeceğini bilirler.


1
Önemli yorumları kaçırmayın: +1. Başlayan cümle: “Tarif etmiyorlar” takibini kolaylaştırmak için bazı yeniden yapılandırmaları kullanabilir.
candied_orange 21:16

3

IMHO ikisini de yapmalı. Her çizgiyi yorumlamak aptalca çünkü sen onun gibi çizgilerle dolanıyorsun

  i++;    /* Increment i */

neden artırmak istediğinize dair hiçbir ipucu olmadan i. Bunu biraz daha genişletin ve kodun ne için olduğu veya nasıl çalıştığı hakkında herhangi bir fikir vermeden büyük miktarda bir sözlü yayın üreten tipik Doxygen stiliniz vardır. (En azından şimdiye kadar gördüğüm kadarıyla: Böyle bir sistemi kullanarak faydalı belgeler yazmanın mümkün olabileceğini kabul ediyorum, ancak nefesimi tutmuyorum.)

OTOH, eğer fonksiyonun başına iyi bir yorum bloğu yazarsanız (ya da ne tür bir gruplama mantıklıysa), hem neyin gerçekleştirileceğini ve ne kadar açıksa, ne kadar açıksa, işe yarayacak bir şeye sahipseniz. Bana kalırsanız, ilgili denklemler için LaTeX kodunu veya kağıtlara yapılan referansları da dahil edebilirsiniz, örneğin "Bu, ... 'de tartışıldığı gibi, Hamilton-Jacobi denklemlerinin çözümü için bir WENO şeması uygular."


2
Doxygen yorumu için +1: Bu kesinlikle doxygen "dokümantasyonu" koduma dahil etmem konusundaki itirazım; Zamanın% 95'i, işlev imzasında zaten açık olanı tekrarlıyor. Ben de, hiçbir şeye değecek tek bir oksijen dokümantasyonu görmedim. Bu yorumları yazmak üç kez zaman harcar: Bir kez yorum yazmak, bir kez daha okumak ve bir kez eski yorum içeriğinin neden olduğu sorunları ayıklamak için.
cmaster

1
Kendinle çelişmiyor musun? Sanırım bir işlevin kara kutu bakış açısıyla ne yaptığını açıklayan bir yorum yapmasının kritik bir fikir olduğunu hemfikirdik - "bu girdiler giriyor, işlev bunu yapıyor ve bu çıktılar çıkıyor". İşlevi yazan kişi ile işlevi kullananlar arasındaki sözleşmeyi oluşturur. Doxygen’in amacı, bu yorumların biçimini ayrıştırılabilecek ve aranabilir / dizine eklenebilir şekilde standart hale getirmektir. Öyleyse neden "iyi yorum bloğu" istiyorum ama olur değil standart, insan ve makine tarafından okunabilir formatta istiyorum?
Graham,

JSDoc, JavaDoc ve Doxygen gibi bir yorum standardının kullanımı, @Graham'ın dediği gibi aranabilir ve insan tarafından okunabilen belgeler sağlamak içindir. Bu cevapta belirtilen kod satırının Doxygen ile ilgisi yok. Çıktılan belgelerde bu yorumu ayrıştırıp bir girdi üreten bir kural setinin bile olduğunu hayal bile edemiyorum. JMI Dokümanlarına, Java Standart Kütüphanelerine vb. Baktığınızda hepsi Doxygen'e çok benzer bir araçla üretilir. Bunun amacı bu. Burada söylenenler değil
Andrew T Finnell

Bunu yapmıyorum - Kanadalı bir gereksinimi karşılamak için, çalıştığım bir şirket geliştiricilere OP'nin örneğinde olduğu gibi ÇOK İYİ yorumlar ekleyen bir ön işlemci yazdı. Sanırım bizim "C ADD I TO" ya da benzeri bir şeydi. FORTRAN'dı, bu yüzden döngüler benzer şekilde "1'den 10'a C LOOP" olarak kabul edildi. Kod işe yaramaz yorumlarla LOADED oldu. Kodları koruduğumda bütün bu pislikleri sildim. Kimse bana bir şey demedi.
Tony Ennis

2

Akış çizelgelerini geri getirmenin zamanı geldi! (pek değil ama bir dakika bekle)

Geçen gün eski akış şeması şablonumu buldum. Sadece ev ödevleri ve şakalar için kullandım (iyi bir saçma akış şemasını sevmelisin). Ancak bu zamana kadar, hala akış çizelgeleri kullanan çoğu ticari programcı onları koddan otomatik olarak üretiyordu (akış çizelgesinin orijinal amacını tamamen baltalıyordu, bu daha iyi kod yazarken yardımcı oldu ve makine kodunda oldukça kullanışlıdır). Bununla birlikte, daha yüksek seviyeli dillerde akış şeması bir koltuk değneği olmaktan bir hobiye dönüşmüştür: Neden? İyi yorumlar koddan farklı bir soyutlama düzeyindedir.Bunu yapmanın en kolay yolu, kodun neyi işlediğinin nedenini kullanmaktır.


Akış çizelgelerinin asla kaybolmadığını size bildirdiğim için üzgünüm.
Karınca P

İyi yorumlar koddan farklı bir soyutlama düzeyindedir . Duy duymak!
candied_orange 21:16

1
Bu iyi bir tavsiye olsa da, belki tek bir cümle dışında, sorulan soruyu ele almıyor gibi görünüyor.
Bryan Oakley

0

Soruyu belirtildiği gibi cevaplayacağım:

Tüm bunlar göz önüne alındığında, bu fikri yakalayan iyi kodlama standartları yazmak bile mümkün mü?

Evet. WYSIWYG. İyi bir kodlama standardı kelimenin tam anlamıyla " okuyucuya aşağıdaki kodun ne yaptığı ve neden olduğu açıktır " dır .

Başka bir deyişle, kod incelemem, kodun okunabilirliği hakkındaki yorumları tam anlamıyla, 1-1, zihinsel durumumdan ortaya çıkar

Ben, bir okuyucu olarak (daha iyisi, asgari bir standart olarak, daha az deneyimli fakat makul bir okuyucunun zihinsel bir modeli), aşağıdaki kodun amacını veya çalışma yöntemini anlamadım.

Genel olarak, insanlar, duydukları zaman "bu daha kolay okunabilirliğe ihtiyaç duyar" lafını almakta kolay olurlar "Ben, aptal olmadığına saygı duyduğum umudumdaki üst düzey bir geliştirici olarak, ilk önce bu kodu ya da neden ya da ne olduğunu anlamadım. yapar, bu yüzden açıklanması gerekiyor ".

Bu, söylemi “anlamsız standardı takip etmediniz” den, “kodunuzun pratik bir soruna yol açan belirli bir okunabilirlik eksikliğine sahip olması” na kaydırır .

Açık yapılması gereken ikinci bir standart "02:00 acil durum testi" dir.

Bu kodla karşılaşmamış olan yedeklemeniz, cep telefonu olmayan Şili And Dağları'nda tatildeyken, saat 02:00 'deki acil durum köprüsü çağrısı sırasında hata ayıklama sırasında sorunun ne olduğunu çözebilir mi?

Bu sübjektif görünebilir ancak pratik olarak ölçmesi kolaydır: üretim acil durumlarında geceleri tek hata ayıklaması olması beklenen rastgele bir genç ekip üyesini çağırın ve onlardan belirli bir yorumlanmamış kodun nasıl çalıştığını ve neden açıklamasını açıklamalarını isteyin. Orada.


0

Bu cevap çoğu konuyu kapsıyordu, ancak önemli bir şey var.

Satırları boyunca bir fikir yakalamak isterim: Her satır, sıra, ifade, bölüm, yapı, işlev, yöntem, sınıf, paket, bileşen, ... kodunun bir yorumunu düşünün.

Doxygen gibi kodlardan dokümantasyon oluşturmak için araçlar var. Bu tür araçlar kullanırsanız, dosyaları, işlevleri, sınıfları vb. Yorumlamak mantıklıdır. İşlev adı açıklayıcı olsa bile, yine de tutarlılık için yapıyorum, çünkü belgeleri okuyan insanlar minnettar olacak.


1
Ancak, bu tür araçlar tarafından oluşturulan "belgeler", en azından benim deneyimime göre, genellikle hiçbir belgeye sahip olmadıklarından daha az değerdedir, çünkü kullanıcıya faydalı bilgiler sağlamamaktadır (ve olmayanları çıkarmaya çalışırken zaman kaybetmelerine neden olmaktadır). (mevcut bilgiyi), ancak geliştiricileri kodlarını doğru bir şekilde belgelendiklerini düşünerek kandırır.
jamesqf

@jamesqf Evet, işlevlerin yarısı belgelenmediğinde ve diğer yarısı kötü. Ancak doxygen düzgün, vb sınıfları görevlerini yorumladı geliştiriciler varsayarak oldukça iyi belgeleri oluşturmak
BЈовић

-1

Mevcut cevapların birçoğu ayrıntılı, ancak cevaplamanın önemli olduğunu hissettim:

... [yorumlar] akran değerlendirmesinde geçerli olacak ancak akılsız bir kontrol listesi aktivitesine dönüşmeyecek ...

Bana göre, standart olabilecek tek yorum eksik olduğunda ne tür yorumlar olduğunu sorarak cevaplanabilir . Başka bir deyişle: IDE'ler veya dokümantasyon yazılımı tarafından kullanılan yorumlar.

Söylendiği gibi, bu, geliştiriciler tarafından hangi araçların kullanıldığı konusunda özneldir ve bu tür bir yazılım tarafından kullanılan yorumların hepsi birbirleri kadar faydalı değildir .

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.