İç içe yorumlar sorunu nasıl çözülür


23

Yorumların yuvalanamayacağı yalnızca bir dilde görünmüyor. Bu sorun için iyi bir çözümünüz var mı? C / C ++ ve Java'daki bir geçici çözüm yalnızca tek satırlı yorumu kullanmaktır, ancak daha büyük bir bloğu yorumlamak imkansız hale gelir. Bunun gibi bir şeyle karşı karşıyayım:

</li><!--
                <li><!-- Save -->

Bu yüzden yorumları el ile düzenlemeli ve düzenlemeliyim. Bunu birçok dilde nasıl halletmemiz gerektiğini tavsiye eder misiniz? Emin değilim ama belki python'un python'a '''bir #yorum ekleyebilecek şekilde bir çözümü olabilir mi? '


4
Bence sadece editörler orada yardımcı olabilir. IDLE yine de Python IIRC'deki yorumu engeller.
Erik Reppen

7
Python yok değil blok yorumlarınız . '''Ve """vardır dize hazır . Tercüman bunları derleme sırasında değerlendirecek (bytecode'a) ve string değişmezlerini no-ops olarak tanıyacak (dolayısıyla bytecode çalıştırma / yükleme süresini yavaşlatmazlar). Belgeler, yani defbedenden hemen önce ancak tam anlamıyla dize değişmezler , tercüman işlev için belge sağladıklarını varsaydığından uzaklaştırılmaz.
Bakuriu

7
C / C ++ 'da büyük bölümleri kaldırmak istiyorsanız #if 0<code>' ı kullanın #endif. Yani bu gerçekten bir sorun değil. Bunu yapmak için yorumları kullanmak yanlış bir araçtır.
Martin York

1
Uzun zaman önce sadece satır yorumları kullanmaya başladım (zorlamadığım sürece, örneğin Javadoc gibi). Tabii ki, editör desteğine (veya en azından sütun moduna) ihtiyacınız var.
ziggystar

Yanıtlar:


46

En iyi çözüm, açıkçası, yorumlarınızı yerleştirmemek. İç içe yorumlar, genellikle yorumları yanlış kullandığınızın bir işaretidir. En yaygın örnek, yorum içeren koddur ve düzeltilmesi, yorum yapmak yerine kodu kaldırmaktır.

Bununla birlikte, birçok programlama dili birden fazla yorum sözdizimine sahiptir ve bu gerçeği en az bir seviye derinleştirmek için kullanabilirsiniz. Örneğin, Java’da:

/* This is commented out!
Foo.bar.baz();
// And now for something completely different...
Quux.runWith(theMoney);
*/

Ayrıca, birçok dilde, en az bir tür yorum yapılabilir; C benzeri dillerde, satır açıklamalarının içindeki satır açıklamaları dikkate alınmaz:

// some_commented_out(code);
// // This is a comment inside the comment!
// // Still inside the nested comment.
// some_more_code_in(outer_comment);

Çoğu IDE, tüm kod bloklarını bir eylemde satır yorumlarıyla yorumlamayı destekler ve bu tür bir yorumlama stilini doğru kullanırlar. Python'da da aynı örnek:

# some_commented_out(code)
# # This is a comment inside the comment!
# # Still inside the nested comment.
# some_more_code_in(outer_comment)

Genellikle, belirli bir projenin kodlama standartları, hangi yorum stilinin ne zaman kullanılacağı hakkında kurallara sahiptir; Ortak bir kural, /* */yöntem ve sınıf dokümantasyonu için blok açıklamaları ( ) ve //yöntem organları içindeki açıklamalar için satır içi açıklamaları ( ) kullanmaktır.

/**
 * Helper class to store Foo objects inside a bar.
 */
public class Foobar {
    /**
     * Stores a Foo in this Foobar's bar, unless the bar already contains
     * an equivalent Foo.
     * Returns the number of Foos added (always 0 or 1).
     */
    public int storeFoo(Foo foo) {
        // Don't add a foo we already have!
        if (this.bar.contains(foo)) {
            return 0;
        }
        // OK, we don't have this foo yet, so we'll add it.
        this.bar.append(foo);
        return 1;
    }
}

Böyle bir stille, /* */yorumları yerleştirmeniz gerekmeyebilir (tüm yöntemleri veya sınıfları geçici olarak devre dışı bırakmanız gerekiyorsa , yeniden adlandırma işlemi daha iyi olmasa da aynı şekilde güzel çalışır); ve //yorumlar , en azından IDE'nizden biraz yardım alarak, yuva yapar .

Son olarak, kodu devre dışı bırakmak için birçok programlama dilinde başka seçenekleriniz vardır; örneğin, C'de, önişlemciden yararlanabilirsiniz:

this_is(activated);
#if 0
this_is(!activated);
/* Comments inside this block don't really nest, they are simply removed
   along with the rest of the block! */
#endif

Dinamik dillerde, ifbunun yerine genellikle normal ifadeleri kullanabilirsiniz :

<?php

if (0) {
   // This should never run... 
   some_stuff_that_should_never_run();
}

Bununla birlikte, CPP örneğinden farklı olarak, bu strateji kaynak dosyanın bir bütün olarak sözdizimsel olarak geçerli olmasını gerektirir, bu yüzden esnek değildir.

Ve son olarak, iç içe yorumlara izin veren en azından bazı diller var. İlgilendiğiniz takdirde wikipedia'nın güzel bir karşılaştırma tablosu var .


2
bazı SQL değişkenleri iç içe yorumlara izin veriyor mu?
Xavier Combelle

3
+1 için// And now for something completely different...
Vorac

1
@Vorac: Referansı beğendiğinize sevindim: D
tdammers 20:13

18

C ve C ++ 'nin yuvalanmış blok yorumu var:

#if 0
#endif

Birçok vurgulayıcı editör bunu bir yorum olarak anlar ve birçoğu en azından şartlı olarak devre dışı bırakılmış herhangi bir kod olarak onu vurgulayacaktır.

Diğer birçok dilde editör desteğine güvenmek zorundasınız. Yalnızca satır tabanlı yorumları olan diller için (perl, python, ruby, shell ...) yorum karakterini bir aralıktaki tüm satırlara hazırlamak oldukça basittir, böylece çoğu editör bunu yapabilir. Bloğun tamamını yorumlamadan önce yorumların ne olduğunu hala söyleyebilirsiniz, çünkü yorum karakteri iki katına çıkar - basitçe bunu yapmak avantaj.

XML ve SGML muhtemelen en büyük acı, yorum tanımı sadece aptalca. Yorumlar, yuvalamak için önemsiz olacaktı, ancak yalnızca değil, aynı zamanda --içeride yorum yapmak da kesinlikle yasaktır . Ne yazık ki, hangi editörlerin SGML / XML'de yorum yapmak için iyi bir desteği olduğunu bilmiyorum.


2
Bu önişlemci direktiflerini gerçek yorumlar olarak kullanmayı asla düşünmedim. İlginçtir, ayrıca C # için, ama bu durumda, #if _Re # ile VS'imde iyi çalışan ve grileşen gibi bir şey yapmalısınız . Güzel ipucu!
Umutsuzluk Karşıtı

2

Genel bir çözüm olmasa ve kesinlikle ideal olmasa da, bu belirli sorunu çözmenin bir yolu, iç içe kod yorum öğeleri için yorumları engellemek için sunucu tarafı şablon işleme dilini kullanmaktır. Bu, içeriği temelde bozulmadan bırakır, ancak istemci tarayıcıya gönderilmesini önler.

Dosya başka türlü sunucu tarafı işleme gerektirmeyen düz ve saf içerikse, bu pek yardımcı olmaz. Bu durumda ve daha genel iç içe geçmiş yorumlar durumunda, neden bunu yapmak istediğinizi sorun. Bu vakaların çoğunda, bir kişi onu ele almanın en iyi yolunun her şeyi ele almamak olduğunu görebilir. Başka bir deyişle, bir bölümü elemek istiyorsanız, o zaman eleyin ve sürüm kontrolünün bu bir yapı olarak tekrar yapılması gerektiğinde farklılıkları hatırlayarak ele almasına izin verin.


0

HTML / XML durumunda, mevcut olmayan bir işlem talimatı kullanabilirsiniz: SO'daki cevabımı görün

<?ignore
  <band height="20">
    <staticText>
      <reportElement x="180" y="0" width="200" height="20"/>
      <text><![CDATA[Hello World!]]></text>
    </staticText>
  </band>
?>
</detail>

0

Swift, yuvalanmış yorumları desteklediğinden, "yorumların yuvalanamayacağı tek bir dilde görünmez" artık gerçek bir ifade değildir. Programlama dilinizde iç içe geçmiş yorumlar için destek eksikliğinden memnun değilseniz, Swift'i denemenizi öneririm.

/* This is the start of the first multiline comment.
 /* This is the second, nested multiline comment. */
 This is the end of the first multiline comment. */

Swift Programlama Dili: Temel Bilgiler


0

D Programlama Dili, dahili olarak şu yorumu yerleştirmiştir:

/+ This is a nested comment 
  /+ This is part of that a comment +/
  /* So is this */
+/
/+ /* This is another nested comment */ +/
/* /* This is not a nested comment */

Başka bir deyişle, /+ve +/yorumlar yuva.

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.