Cara mengatasi masalah komentar bersarang

23

Tampaknya tidak hanya dalam satu bahasa bahwa komentar tidak dapat disarangkan. Apakah Anda punya solusi yang baik untuk masalah ini? Salah satu solusi di C / C ++ dan Java adalah dengan hanya menggunakan komentar single-line tetapi menjadi mustahil untuk berkomentar di blok yang lebih besar. Saya menghadapi sesuatu seperti ini:

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

Jadi saya harus secara manual melalui dan mengedit komentar. Bisakah Anda memberi saran bagaimana kami harus menangani ini, dalam banyak bahasa? Saya tidak yakin tetapi mungkin python memiliki solusi untuk ini dengan '''cara yang mungkin dapat memasukkan #komentar dalam python? `

Niklas
sumber
4
Saya pikir hanya editor yang dapat membantu Anda di sana. IDLE akan memblokir komentar untuk Anda di Python IIRC.
Erik Reppen
7
Python tidak memiliki komentar blokir . The '''dan """yang string literal . Kebetulan interpreter akan mengevaluasinya selama kompilasi (untuk bytecode) dan mengenali string literal sebagai no-ops (karenanya mereka tidak memperlambat eksekusi bytecode / waktu pemuatan). Docstrings, yaitu string literal tepat setelah tanda deftetapi sebelum tubuh, tidak dilucuti karena penerjemah mengasumsikan mereka menyediakan dokumentasi untuk fungsi tersebut.
Bakuriu
7
Di C / C ++ jika Anda ingin menghapus bagian besar Anda menggunakan #if 0<code> #endif. Jadi ini bukan masalah. Menggunakan komentar untuk melakukan ini adalah alat yang salah.
Martin York
1
Saya beralih menggunakan hanya komentar baris dulu (selama saya tidak dipaksa, misalnya Javadoc). Tentu saja, Anda memerlukan dukungan editor (atau setidaknya mode kolom).
ziggystar

Jawaban:

46

Solusi terbaik, tentu saja, tidak hanya membuat sarang komentar Anda. Komentar bersarang biasanya merupakan tanda bahwa Anda menggunakan komentar yang salah. Contoh paling umum adalah kode commented-out yang berisi komentar itu sendiri, dan perbaikannya adalah menghapus kode alih-alih berkomentar.

Yang mengatakan, banyak bahasa pemrograman memiliki lebih dari satu jenis sintaks komentar, dan Anda dapat menggunakan fakta ini untuk bersarang setidaknya satu tingkat dalam. Misalnya, di Jawa:

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

Selain itu, dalam banyak bahasa, setidaknya satu jenis komentar cukup baik; dalam bahasa mirip-C, komentar baris di dalam komentar baris diabaikan:

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

Sebagian besar IDE mendukung mengomentari seluruh blok kode dengan komentar baris dalam satu tindakan, dan mereka menangani gaya komentar seperti ini dengan benar. Contoh yang sama dengan Python:

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

Seringkali, standar pengkodean untuk proyek tertentu memiliki aturan tentang gaya komentar mana yang digunakan saat; konvensi umum adalah dengan menggunakan komentar blok ( /* */) untuk metode dan dokumentasi kelas, dan komentar sebaris ( //) untuk komentar di dalam tubuh metode dan semacamnya, misalnya:

/**
 * 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;
    }
}

Dengan gaya seperti itu, kecil kemungkinan Anda perlu menyarang /* */komentar (jika Anda harus menonaktifkan sementara seluruh metode atau kelas, mengubah nama mereka berfungsi dengan baik, jika tidak lebih baik); dan //komentar lakukan sarang, setidaknya dengan sedikit bantuan dari IDE Anda.

Akhirnya, untuk menonaktifkan kode, Anda memiliki opsi lain dalam banyak bahasa pemrograman; misalnya, dalam C, Anda dapat memanfaatkan preprosesor:

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

Dalam bahasa yang dinamis, Anda seringkali dapat menggunakan ifpernyataan reguler sebagai gantinya:

<?php

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

Namun, tidak seperti contoh CPP, strategi ini membutuhkan file sumber secara keseluruhan valid secara sintaksis, sehingga sejauh ini tidak fleksibel.

Dan akhirnya, setidaknya ada beberapa bahasa yang memungkinkan untuk komentar bersarang. Jika Anda tertarik, wikipedia memiliki bagan perbandingan yang bagus .

tammmer
sumber
2
apakah beberapa varian SQL memungkinkan komentar bersarang?
Xavier Combelle
3
+1 untuk// And now for something completely different...
Vorac
1
@Vorac: senang Anda menyukai referensi: D
tdammers
18

C dan C ++ memang memiliki komentar blok bersarang:

#if 0
#endif

Banyak editor yang menyoroti memahami ini sebagai komentar dan banyak lainnya setidaknya akan menyorotnya sebagai kode lain yang dinonaktifkan.

Dalam banyak bahasa lain Anda harus bergantung pada dukungan editor. Untuk bahasa yang hanya memiliki komentar berbasis garis (perl, python, ruby, shell ...) agak mudah untuk menambahkan karakter komentar ke semua baris dalam rentang, sehingga sebagian besar editor dapat melakukan ini. Anda masih dapat mengetahui apa yang menjadi komentar sebelum mengomentari seluruh blok karena karakter komentar berlipat ganda - melakukannya hanya merupakan keuntungan di sini.

XML dan SGML mungkin adalah rasa sakit terbesar, definisi komentarnya hanya bodoh. Komentar akan sepele untuk sarang, tetapi mereka tidak hanya tidak, itu benar-benar dilarang untuk memiliki --komentar di dalam. Sayangnya saya tidak tahu editor mana yang memiliki dukungan yang baik untuk berkomentar di SGML / XML.

Jan Hudec
sumber
2
Tidak pernah berpikir untuk menggunakan arahan preprosesor sebagai komentar yang sebenarnya. Menarik, juga untuk C #, tetapi dalam hal ini, Anda harus melakukan sesuatu seperti #if _yang berfungsi dengan baik dan menjadi abu-abu di VS saya dengan Re #. Tip yang bagus!
Grimace of Despair
2

Meskipun bukan solusi umum, dan tentu saja tidak ideal, salah satu cara untuk mengatasi masalah khusus ini adalah dengan menggunakan bahasa pemrosesan templat sisi server untuk melakukan blokir komentar untuk elemen komentar kode bersarang. Ini membuat konten pada dasarnya tetap utuh, tetapi mencegah pengirimannya ke browser klien.

Itu tidak banyak membantu jika file tersebut adalah konten yang lurus dan murni yang tidak memerlukan pemrosesan sisi server lainnya. Dalam hal itu dan kasus yang lebih umum dari komentar bersarang, tanyakan mengapa Anda ingin melakukan itu. Dalam sebagian besar kasus itu, orang mungkin menemukan bahwa cara terbaik untuk menanganinya adalah dengan tidak menangani semuanya. Dengan kata lain, jika Anda ingin menghilangkan bagian, maka hilangkan itu, dan biarkan kontrol versi menangani mengingat perbedaan jika bagian itu sebagai artefak perlu dibangkitkan.

JustinC
sumber
0

Dalam kasus HTML / XML Anda dapat menggunakan instruksi pemrosesan yang tidak ada: lihat jawaban saya di SO

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

Swift mendukung komentar bersarang sehingga "itu muncul bukan hanya dalam satu bahasa yang komentarnya tidak bisa disarangkan" bukan lagi pernyataan yang benar. Jika Anda tidak puas dengan kurangnya dukungan untuk komentar bersarang dalam bahasa pemrograman Anda, saya sarankan mencoba Swift.

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

Bahasa Pemrograman Swift: Dasar-Dasar

ketidaknyamanan
sumber
0

Bahasa Pemrograman D memiliki komentar bertumpuk bawaan:

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

Dengan kata lain, /+dan +/komentar sarang.

noɥʇʎԀʎzɐɹƆ
sumber