Bilgilendirici yorumları yorumlanmamış koddan ayırt etmek için bir yöntem var mı?


36

Programlama boyunca, kodu açıklayan bazı yorumlar ve kodu kaldıran bazı yorumlar ile biteceksiniz:

// A concise description 
const a = Boolean(obj);
//b = false;

Hangisinin hızlı bir şekilde ayrıştırılması için iyi bir yöntem var mı?

3 /'ü kullanarak ve /** */açıklayıcı yorumlar için oynadım .

Ayrıca vurgulamak için bir VSCode eklentisi kullandım //TODO:ve//FIXME:


2
Not olarak ///ve /** ... */yorumlar ayrıca Doxygen veya JSDoc gibi bazı dokümantasyon üreticileri tarafından da kullanılır. Bunları veya benzer araçları kullanırsanız, bu tür bir yorumu belgelerin bir parçası olması amaçlanmayan açıklayıcı yorumlar için kullanamayabilirsiniz.
Justin Time 2 Reinstate Monica,

1
Javascript'te çoğu kod satırı bir noktalı virgülle bitecektir. Yorumlarınız yapmadıkça, bu oldukça basit görünüyor ve bunu kolayca kontrol etmek için bir senaryo yazabilirsiniz;
Artemis Fowl

Yanıtlar:


187

Bunun çok basit bir çözümü var: yorumlanan kodu kaldır.

Gerçekten, kodu yorumlamak için iki iyi neden var: bir şeyi test etmek / düzeltme yapmak veya daha sonra kullanabileceğiniz kodu kaydetmek için. Bir şeyi test ediyor veya düzeltiyorsanız, yorum veya kodu tamamladığınızda yorumlanan kodu kaldırın. Daha sonra kullanacağınız bir kodu kaydediyorsanız, birinci sınıf bir kod yapın ve kütüphane gibi iyi bir şekilde kullanılabilecek bir yere koyun.


108
Ayrıca, kod teslim edilmişse: sadece kaldırmanız yeterli. Eğer geri ihtiyacın olursa, kaynak kontrolü seni
korumandı

38
Kod kaldırıldığında hiç kimse bir şey olmadığını fark eder. Bu iyileşmeyi zorlaştırıyor. Yorumlanmış kod bırakmanın değeri vardır, özellikle gelecekte kullanılması muhtemel görünüyorsa.
usr

76
@ usr: Kod kaldırıldığında hiç kimse var olduğunu fark etmedi - ve benim tecrübeme göre, gerçek dünyadaki tüm vakaların% 99'unda bu doğru olanı. % 1’de, ötelenen satırlarda bir değer olabilir, ancak yorumlanan kod birkaç hafta veya ay boyunca kalırsa (veya daha uzun), şanslar yüksekse, etkinliğin yeniden yapılandırılmasından dolayı daha fazla derleme yapmaz kod satırları "Gelecekteki kullanımlar için pontential value" argümanı, birkaç saat boyunca beyin işlerine yatırım yaptıkları kod tabanından bir şeyleri sıyırma konusunda duygusal bir sorunu olan insanlar tarafından yanlış bir bahane olarak kullanılır.
Doktor Brown,

21
Açıklayıcı yorumlar olmadan hiçbir zaman yorumlanmış kod yazmam. Kodu kısa vadede tekrar isteyebileceğiniz nadir durumlar vardır, ancak bunların her biri istisnaidir ve gelecekteki geliştiriciler (veya gelecekteki sizler) için bir açıklama gerektirir. Yorumlarımın% 90'ı "Kullanılmamış gibi görünüyor. Kaldırıldı.
Sorun

30
Meslektaşım bir keresinde, şu an için bir özellik kaldırdığımızda "Burada X'i yapan ama kodu çıkardım" kodu vardı. Bu gerçekten iyi çalıştı; O dosya için kaynak geçmişinde olduğunu biliyordun, ama seni rahatsız etmiyordu.
Erik,

45

@ RobertHarvey'in mükemmel cevabına ekleme Yaptığım yorumların kodunu geçici olarak bile olsa kontrol etmek için kaydettiğim tek meşru sebep olduğuna inanıyorum: şu anda bir nedenden ötürü kullanılmaması gereken veya kullanılmaması gereken bariz bir değiştirme kodu olması durumunda . O zaman bile, yorumların çoğu değiştirme kodu değil açıklama olmalıdır . Bu bir dil ya da henüz kararlı sayılmayan bir dilin bir özelliği olabilir. Böyle bir şeye benzeyebilir:

# TODO: Replace with `foo = frobnicate(bar)` once <link.to/bug> is fixed
foo = [some complex workaround]

Bu durumda, çalışma zaten yapıldı, ancak siz bundan faydalanamazsınız, bu nedenle silme birisinin daha sonra yeniden keşfetmesi gerektiği anlamına gelir. Aynı şey , yüzünde daha üstün görünebilecek düşük kaliteli çözümler veya benzer çözümlere karşı bilinçli takaslar için de geçerlidir .

Dikkat: Kodunuzu alternatif çözümlerle karıştırmayın. Her görev sonsuz farklı şekillerde yapılabilir ve bu alanı her değişiklik için uzun süre keşfetmek uygun değildir. Kod incelemeleri, meslektaşınız daha önce yetersiz olduğunu keşfettiğiniz bir iyileştirmeyi önerdiğinde, bu gibi eksik yorumları keşfetmek için iyi bir yer olabilir.


2
Bu kapak tarafı bazen açıklamaya gerek olduğunu neden kullanmadığınız frobnicate(bar)kimse gelip de "düzeltme" senin "inelegant" kod çalışacaktır böylece. Böylece, onlara mükemmel bir dünyada, frobnicatefonksiyonun gitmenin yolu olacağını bildiğinizi gösteriyorsunuz, ama acı verici deneyimlerden doğru şekilde çalışmadığını biliyorsunuz. Üçüncü tarafın bile bir hata olarak gördüğü, hatta düzeltmeye daha az değer veren bir beklenti olmayabilir; Yine de, bariz yaklaşıma neden katılmadığınız konusunda gelecekteki programcılara (kendiniz de dahil olmak üzere) yorum bırakmanız gerekir.
Monty Harder

3
İlgili bir durum, biri geçerli veriyi diğerinden çok daha hızlı işleyecek ve biri ne olursa olsun geçersiz veri alırsa, biri daha faydalı tanılama önerecek bir şey yapmanın iki yolu olabilir. Program, yalnızca geçerli olması için "garantili" olan verileri beslemesi gereken bir işlemin parçasıysa, ancak işlemdeki bir şey düzgün çalışmıyorsa, daha yavaş, ancak daha iyi tanılama sağlayan bir sürümün olmasını sağlayabilir. Neyin yanlış gittiğini belirlemek çok daha kolay.
supercat,

20

Hmm, bu soruyu Robert’tan biraz farklı bir şekilde okudum ve doğru bir şekilde kodun kaldırılması gerektiğini söyleyen var.

Bununla birlikte, daha sonra kaldırılmak üzere kodu işaretlemek için bir sözleşme arıyorsanız, eski bir favorim:

//b = false; //TODO: remove

Bazı IDE'nin bayrağı //TODO:yorumlar veya öğretilebilir. Değilse, genellikle aranabilir bir dizedir. Mağazanızın oluşturduğu her türlü konvansiyonu takip etmek en iyisidir çünkü bu birkaç şekilde yapılabilir. Her kod tabanı bunu tek yönlü yapmalıdır. Aranabilir tutar.

Çabuk ayrıştırmak hangisi?

Bu işaret olmadan bunu yapmanın otomatik yolu derleyici ile. Yorumun kaldırılması derleyen kod üretiyorsa, yorumlanmış olması gerekir. Zor olmayan kontrolleri yapan bir IDE eklentisi yazmak. Ama buggy yorum kodunu geride bırakacak.

Bu nedenle, yorumlanan kodu, yorum yaptığınız an kod olarak işaretlemeniz daha iyi olur. Bu, gerçekten gitmesini isteyip istemediğinize karar verirken zarar vermeden çalışmanıza olanak tanır. Hepimiz kesintiye uğradığından ve biraz unutkan olduğundan, bu durumda bazı çizgiler kontrol edilirse şaşırmayın. Yaparlarsa en azından açıkça işaretlenmiş ve aranabilir olmaları güzel. Klavye makroları geçmişte bu konuda bana yardımcı oldu. Tek bir tuşa dokunarak yapabiliyorsanız, bunun ortasında kesintiye uğramak zor.

Bunu, sürekli entegrasyon testlerinizde işareti taşıyan noktaya kadar alabilirsiniz. Hata! Olağanüstü TODO'ları tekrar kontrol etmeye çalışıyorum.


Yorumların kod olarak etiketlenmek için derlenip derlenmediğini görmek yerine, yorumları doğal bir dil işlemcisi aracılığıyla çalıştırabilir ve ekibinizin konuştuğu dilde cümle veya isim cümlesi olarak ayrılanları etiketleyebilirsiniz.
TheHansinator

3
@ Kulağa hoş geliyor ama cep telefonlarıyla olan deneyimim kodlayıcı jargonumla otomatik olarak doğru ilişki kurmamı sağlıyor.
candied_orange

Kod açıklamalarını ayrıştırmak için kullanılan NLP'nin, otomatik olarak düzeltmeye izin veren NLP'den çok daha iyi olacağını, çünkü bilgisayarın çalışacak tüm cümleyi olduğundan ve yazım hatalarını düzeltmeye çalıştığını sanmıyorum. Sahte olumsuzun burada daha iyi olduğunu belirtmek değil - bir insan silinmeden önce yorumu gözden geçirebildiği sürece, yararsız gobbledyook'a karşı uyarılmamak yerine, yorumu tekrar yazabilir.
TheHansinator

3
wrt ayrıştırma: double buffer (flip on)-> C prototip veya ultra-terse İngilizce? Bağlam olmadan söyleyemem, her iki dilde de doğru bir yapı değil. Bazı yanlış pozitifler ve negatifler kaçınılmazdır, doğası gereği yorumların içerik biçimlerini her iki yönde de kısıtlamadığı durumlarda kaçınılmazdır.
Leushenko

8

Hiçbir kodu değil, kodu kaldırmak için önişlemci yönergelerini kullanıyorum:

//comment
active_code();
#if FALSE
inactive_code();
#endif

Bu, aranması çok kolay bir şey yapar ve sözdizimi vurgulayıcım yorum olarak değerlendirir. Hatta tek bir satıra daraltabilirim:#if FALSE(...)

Birkaç seçeneğe sahip olmak için bu fikri genişletebilirsiniz:

#if OPTION == 0
code_for_option_0();
#elif OPTION == 1
code_for_option_1();
#else
code_for_all_other_options();
#endif

Ve derleme zamanı hata denetimi:

#if FOO >= 5
#error FOO should be less than 5!
#endif

Tabii ki, bu konuya aşırıya atılmak istemiyorsunuz, ya da neyin derlenip neyin toplanmadığını söylemek zorlaşıyor. Ama bu fikri anladınız ve bu yorumlanmış kodla aynı problemi ... sadece statik olarak kullandığınız sürece. Koşullarınız dinamikse daha kötüsüdür.


Hangisinin bu sorunu hiç dikkate almadığı hangisinin hangisi olduğunu belirlemek için, evrensel bir çözüm olduğunu sanmıyorum. Modelleri kendiniz bulmanız ve muhtemelen onları bulmak için bir regex kodlamanız gerekir.


Bu dünyada ne için iyi olurdu? Birden çok sürümü derlemeniz mi gerekiyor?
Tvde1

@ Tvde1 Gerçekten iyi yönetemiyorsan, bu bir olasılık ve potansiyel bir kabus . Ancak alternatif muhtemelen daha da kötü. Neredeyse aynı kodun birden çok kopyasına sahipseniz, ortak bir temadaki her bir varyasyon için bir tane varsa, bunları ayrı tutmanız ve senkronize tutmanız gerekir.
AaronD

Bunu yapmanın birkaç yolu var, ancak hepsinde karmaşık yapılandırma problemi veya bağımsız kopyalama problemi varyasyonları var: Hatalı bir düzeltmenin tüm bağımsız kopyalara ulaştığından emin misiniz? Ya değilse ve başka bir özellik eklenirse, bu özellik daha önce bilinen ancak şimdiye kadar taşınmamış olan hata düzeltmesinden kaynaklanırsa?
AaronD

3
Eğer varsa bu sadece çalışır sahip soru hakkındadır C gibi bir işlem öncesi adım javascript. Bazı ön işlemler yapabilirsiniz, ancak bu derleme sisteminin yeteneklerini artıracak ve standart değildir. Eğer bir derleme sisteminiz yoksa ya da derleme sistemi kod ayrıştırma ve çalıştırmayı desteklemiyorsa, bu çözümü uygulayamazsınız. Son olarak, soruyu ele almıyor bile - yorumlanan kod, koşullu olarak etkinleştirilen koda kesinlikle eşit değil. Etkin olması gerekmeyen artık olabilir.
VLAZ

Koşullu etkinleştirme, cevabın değil, yalnızca cevabın bir uzantısıdır. Aksi halde, daha da genişleten yorumları içerecek şekilde düzenlerdim.
AaronD,

4

Mümkün olan yerlerde yorum yapmak yerine eski kodun kaldırılması gerektiğini belirten cevabı kabul ediyorum, ancak yorumlanan kod gerektiğinde bu birkaç durum için bir sözleşme gözlemledim.

(Benim temelim C # ama bu herhangi bir C sözdizim diline uygulanabilir, örneğin java)

// An explanatory comment has a space between the comment marker and the content.

// The following lines are commented out code so do not have the space (except where indented).
//var a = something();
//if(a==2) {
//   doSomethingElse();
//}

2
Bu tamamen tarza bağlı: Kod yorumladığımda, genellikle //ilk sütuna ekliyorum ve neredeyse tüm kod girintili olduğundan, sonuç hemen hemen her zaman yorumun bazı sekmelerle başlamasından kaynaklanıyor. Normal yorumlar, benden öncü bir boşluğa sahip olan başka yorumlar olmadıkça benden bir liderlik alanı almaz. Bu nedenle, yönteminiz ürettiğim yorumlarda aşırı derecede başarısız olur ve yorum kalıplarımı tanımak için tasarlanan herhangi bir yöntem sizinkilerde aşırı derecede başarısız olur.
cmaster

@cmaster Ah anlıyorum ki sanırım soruyu yanlış anladım. Yorumları, tür için kolayca ayrıştırılabilecek şekilde biçimlendirmenin basit bir yolunu sağladım;
IanF1

2

Soruyu farklı yorumluyorum, yorumlanmış kod bulmak istediğinizi düşünüyorum.

C tarzı kodun içinde yarım virgül olması, yorumda ise yarım virgül olması olası değildir. Böylece, tek satırlı yorum kodu için bu normal ifadeyi kullanabilirsiniz:

\s*\/\/[\s\S]*;

Çok satırlı yorumlu kod için bu olabilir

\/\*[^\;]*;[^\;]*\*\/

Not Visual Studio, düzenli ifadelerdeki satır sonları konusunda biraz tuhaf, boş alan olarak sayılmaz, açık bir şekilde belirtmeniz gerekir \ n.


2

Arka planda çalışan bir derleyiciye sahip bir düzenleyici kullanıyorsanız (Xcode ve Clang gibi), yorum metnini derlemeyi deneyebilirsiniz. Örneğin “kısa bir açıklama” hata veriyor, “b = false;” yazmıyor. Daha sonra farklı sözdizimi vurgulamayı kullanabilirsiniz.

Daha basit bir yöntem, bazı sezgisel taramaları kullanan bir IDE eklentisidir, örneğin, anahtar kelimelerden yorumlara, satırlardan kodlara eşleştirilmiş kıvrımlı kıvrımlı noktadan başka birçok kelime gibi.


1

Diğer cevaplar, “kod hakkında yorum yapma” temasının varyasyonlarını kapsamıştır. Ama bazen hala referans olarak buralarda olmanı istiyorsun.

Kodun etrafında kalmak için gerçekten ihtiyacınız varsa, kodu "#if 0 ... #endif" ile çevrelemek için daha iyi bir çözüm, idealini nedenini söyleyen bir yorumla. MISRA dahil olmak üzere çeşitli kodlama standartlarından önerilen strateji budur.


-3

Basit, en azından benim için - ve C / C ++ dilinde. / * * / İçinde yer alan yorumlar bilgi vericidir. Geçici olarak kaldırılan test kodu, baştaki // ile yorumlanmıştır.

Ve test kodunu dosyada bırakmak için iyi bir neden var ama yorumda bulundum, en azından yaptığım işe göre. Er ya da geç birileri bir değişiklik yapmak isteyecek ve bu koda ihtiyaç duyacak. Bir bloğun yorumunu kaldırmak, tamamladığınız yere yeniden yorum yapmak gibi tek bir editör komutu alır.


Ayrıca #ifdef __DEBUG ... #endif, kullanmak istediğiniz herhangi bir özel tanım var. __DEBUGYine de güzel, çünkü bunu elde etmek için sadece proje yapılandırmasını değiştirmeniz gerekiyor. Ancak çoğu IDE size kendi konfigürasyonlarınızı tanımlamanıza izin verir, bu da size o noktada her şeyi verebilir.
AaronD

“Test kodu” ile neyi kastediyorsunuz? Birim testleri? Bunlar yorumlanmamalı ancak test odasında tutulmalı ve birinin gerekli olup olmadığını düşünmeden bağımsız olarak mümkün olduğunca sık çalıştırılmalıdır. Elbette, bir kod parçasını yeniden yorumlamak kolaydır, ancak hiç bir şey yapmamak ve test paketini zaten yerinde yapmak çok daha
kolaydır

1
Argh, yapma bunu. "Bir şeyi sınamak için" kodunu yorumlamak 100 defadan 99'unda mükemmel bir şekilde işe yarayacak ... ve tek bir durumda (artık gerekli değilse) kaldırmayı unutacaksınız veya - daha da kötüsü - rahatsız etmeyi unutmuş olacaksınız ( eğer gerekirse) ve işler çirkinleşebilir.
CharonX

@leftaroundabout: Hayır, değerleri kontrol etmek için kullanılan printf ifadeleri gibi şeyler demek istiyorum.
jamesqf

@jamesqf asla böyle şeylere ihtiyaç duymamalısınız, bunun için bir hata ayıklayıcı var. Ancak , yeni yazılmış kodu doğru almak için printf/ coutveya benzerini kullansanız bile (ki, geçmişte kendimi yaptığımı itiraf edeceğim), onları orada bırakmak gerçekten çok etkili değildir. Birisi değişiklik yapmak istiyorsa ve hangi değişkenler hakkında bilgiye ihtiyaç duyduğunu biliyorsa, yeni bir şeyi hızlı ve kolay bir şekilde yazmak kolaydır printf; oysa ki bu neyin gerekli olduğunu bilmiyorsa ve oradaki tüm bu printfifadelerin yorumunu kaldırır. terminal muhtemelen onlara da yardımcı olmaz.
leftaroundabout
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.