Kadang-kadang saya menemukan diri saya dalam situasi ketika bagian dari kode yang saya tulis adalah (atau tampaknya ) sangat jelas sehingga namanya pada dasarnya akan diulang sebagai komentar:
class Example
{
/// <summary>
/// The location of the update.
/// </summary>
public Uri UpdateLocation { get; set; };
}
(Contoh C #, tetapi silakan merujuk pertanyaan sebagai bahasa-agnostik).
Komentar seperti itu tidak berguna; apa yang saya lakukan salah? Apakah itu pilihan nama yang salah? Bagaimana saya bisa berkomentar bagian seperti ini lebih baik? Haruskah saya melewatkan komentar untuk hal-hal seperti ini?
programming-practices
documentation
language-agnostic
Tamás Szelei
sumber
sumber
return result # returns result
Jawaban:
Dalam sebagian besar proyek yang saya kerjakan, tidak ada banyak waktu untuk menulis komentar terperinci pada setiap anggota kelas.
Itu tidak berarti tidak ada waktu untuk komentar; sebaliknya, ada banyak waktu untuk komentar tautologis yang mendorong versi ulang dari apa pun yang sedang dikomentari. Mereka bekerja dengan baik sebagai titik awal .
Terutama mengingat penggunaan komentar Visual Studio yang menyertai IntelliSense , itu ide yang baik untuk memulai dengan sedikit informasi tentang bidang ini:
Dan saat Anda melanjutkan ke kode, ketika Anda tidak dapat mengingat apakah
UpdateLocation
lokasi pembaruan itu terjadi, atau lokasi di mana pembaruan itu dikirim, Anda harus meninjau kembali kode tersebut. Pada titik inilah Anda harus menambahkan informasi tambahan itu:Jika ada programmer lain yang menanyakan tentang detail pada sebuah bidang, perbarui komentar dengan informasi itu:
Sama seperti sebuah program yang memiliki bug, komentar yang baik memiliki bug yang perlu diulangi. Tujuan dari komentar adalah untuk membantu dalam memahami kode ketika Anda mengunjungi kembali enam bulan kemudian dan tidak dapat mengingat apa pun tentang cara kerja program.
Dan seperti halnya pemrograman, komentar Anda harus dimulai di suatu tempat. Komentar tautologis adalah
Hello World!
komentar, ketika Anda berlatih menulis dan memperbarui dokumentasi, dokumentasi awal Anda akan menjadi lebih dan lebih tangguh.sumber
Komentar tidak boleh menggandakan kode Anda. Komentar seharusnya tidak menjawab pertanyaan " bagaimana? ", Tetapi hanya " mengapa? " Dan " apa? ". Mengapa algoritma seperti itu dipilih, apa asumsi implisit di sini (kecuali bahasa Anda cukup kuat untuk mengekspresikannya dengan sistem tipe, kontrak, dan sejenisnya), apa alasan untuk melakukan hal ini sama sekali, dll.
Saya akan merekomendasikan untuk melihat praktik Pemrograman Literate untuk inspirasi.
sumber
Komentar harus menjelaskan kode, bukan menduplikatnya. Komentar tajuk ini hanya duplikat. Biarkan saja.
sumber
Tinggalkan mereka!
Biasanya, itu adalah praktik yang baik untuk menghapus komentar di mana informasi yang diungkapkan di dalamnya sudah ada di tempat lain. Jika Anda dapat mengekspresikan tujuan metode dengan jelas dan jelas dengan memberikan nama yang baik maka tidak perlu komentar .
Masukkan mereka!
Contoh Anda mengilustrasikan dua pengecualian untuk aturan ini:
Pertama, "UpdateLocation" mungkin (tergantung pada konteks) tidak jelas. Dalam hal ini, Anda harus memberikan nama yang lebih baik atau memberikan komentar untuk menghapus ambiguitas. Meningkatkan nama umumnya merupakan pilihan yang lebih baik, tetapi ini tidak selalu mungkin (ketika Anda menerapkan API yang diterbitkan, misalnya).
Kedua, "///" dalam C # menunjukkan komentar yang dimaksudkan untuk digunakan untuk menghasilkan dokumentasi secara otomatis. IDE menggunakan komentar ini untuk tips alat, dan ada alat (Sandcastle) yang dapat menghasilkan file bantuan dan sebagainya dari komentar ini. Dengan demikian, ada argumen untuk menyisipkan komentar ini bahkan jika metode yang mereka dokumentasikan sudah memiliki nama deskriptif. Namun, bahkan kemudian, banyak pengembang yang berpengalaman akan menyukai duplikasi informasi. Faktor penentu haruslah kebutuhan orang-orang yang menjadi tujuan dokumentasi.
sumber
<remarks/>
atau<see/>
lebih di untuk menyediakan beberapa konten tambahan. The<summary/>
masih diduplikasi, tapi komentar secara keseluruhan tidak sepenuhnya sia-sia.Saya sangat tidak setuju dengan respons "jangan tulis komentar". Mengapa? Izinkan saya menunjukkan dengan sedikit mengubah contoh Anda.
Jadi apa fungsi fungsi ini:
Anda dapat melihat bahwa tanpa komentar ada ambiguitas. Seorang pendatang baru dapat dengan mudah membuat kesalahan.
Dalam contoh Anda, ini adalah properti sehingga metode "get / set" mengungkapkan bahwa opsi kedua tidak benar dan itu memang berarti "perbarui lokasi" dan bukan "perbarui lokasi". Tetapi terlalu mudah untuk membuat kesalahan ini, terutama dalam kasus kata-kata yang tidak jelas seperti "pembaruan". Bermain aman. Jangan membingungkan seseorang yang baru dalam hal ini hanya karena menghemat beberapa detik dari waktu Anda.
sumber
Uri UpdateLocation()
akan ditolak oleh ulasan kode dan diubah menjadi salah satuUri GetUpdateLocation()
atau kevoid UpdateLocation()
.GetUpdateLocation
akan menghasilkan kode sepertiGetUpdateLocation = somelocation
.LocationOfUpdate
akan menjadi nama yang lebih baik, yang menghilangkan ambiguitas. Masalah dasarnya adalah bahwa OP menggunakan awalan kata kerja dan bukan kata benda. Kata kerja utama dianggap mengindikasikan tindakan suatu metode./// <summary>
blok digunakan untuk menghasilkan dokumentasi untuk IntelliSense dan dokumentasi API .Jadi, jika ini adalah API yang dihadapi publik, Anda harus selalu menyertakan setidaknya
<summary>
komentar, bahkan jika tujuan dari fungsi tersebut harus jelas bagi pembaca.Namun, ini pengecualian untuk aturan tersebut; secara umum, ingatlah untuk KERING (Jangan Ulangi Diri Sendiri) .
sumber
Isi komentar seperti itu hanya jika Anda tahu bagaimana Anda akan mendapat manfaat dari hal-hal seperti itu; kalau tidak, cukup usap mereka.
Bagi saya, kasus manfaat yang jelas adalah ketika ada pemeriksaan otomatis untuk komentar yang hilang dan saya menggunakan cek itu untuk mendeteksi kode di mana informasi penting perlu diisi; untuk ini saya memang mengisi beberapa tempat penampung - hanya untuk memastikan bahwa laporan alat tidak mengandung "alarm palsu".
Saya pikir selalu ada cara untuk menghindari duplikasi terang-terangan . Selama bertahun-tahun saya menggunakan pasangan "templat pengisi" untuk kasus-kasus seperti milik Anda - kebanyakan seperti nama deskriptif-sendiri dan lihat di atas .
Untuk contoh khusus ini, saya akan menggunakan sesuatu yang "jenis deskriptif diri" (dengan asumsi itu bukan kasus di mana memusnahkan akan melakukan pekerjaan), seperti itu:
Contoh ketika saya bisa menggunakan lihat pengisi jenis di atas akan menjadi komentar Javadoc yang membutuhkan bidang khusus untuk nilai balik, parameter dan pengecualian. Cukup sering, saya menemukan bahwa lebih baik menjelaskan sebagian besar atau bahkan semua ini dalam kalimat ringkasan tunggal, metode yang mengembalikan <uraikan apa yang dikembalikan> untuk parameter yang disediakan <uraikan parameter> . Dalam kasus seperti itu, saya mengisi bidang yang diperlukan secara formal dengan tampilan polos di atas , mengarahkan pembaca ke deskripsi ringkasan.
sumber
Inilah pertanyaan yang ingin saya tanyakan pada diri sendiri ketika memikirkan apakah akan menambahkan komentar ke dalam bagian kode: Apa yang dapat saya sampaikan yang akan membantu orang berikutnya memahami maksud keseluruhan kode dengan lebih baik, sehingga mereka dapat memperbarui, memperbaiki, atau memperpanjangnya lebih cepat dan lebih andal?
Kadang-kadang jawaban yang benar untuk pertanyaan ini adalah bahwa tidak ada banyak yang dapat Anda tambahkan pada saat itu dalam kode, karena Anda sudah memilih nama dan konvensi yang membuat maksudnya sejelas mungkin. Itu berarti Anda telah menulis kode self-documenting yang solid, dan memasukkan komentar di sana kemungkinan akan mengurangi lebih banyak daripada yang dapat membantu. (Perhatikan bahwa komentar yang berlebihan dapat benar-benar merusak keandalan kode dari waktu ke waktu dengan memperlambat ketidakselarasan dengan kode nyata dari waktu ke waktu dan dengan demikian mempersulit penguraian maksud sebenarnya.
Namun, di hampir semua program dan dalam bahasa pemrograman apa pun, Anda akan menemui titik di mana konsep dan keputusan penting tertentu yang dibuat oleh programmer asli - oleh Anda - tidak lagi terlihat dalam kode. Ini cukup banyak tidak dapat dihindari karena seorang programmer yang baik selalu memprogram untuk masa depan - yaitu, tidak hanya membuat program bekerja satu kali, tetapi untuk membuat semua perbaikan di masa depan dan versi dan ekstensi dan modifikasi dan port dan siapa yang tahu apa yang harus juga berfungsi dengan benar. Seperangkat tujuan yang terakhir jauh lebih sulit, dan membutuhkan lebih banyak pemikiran untuk melakukannya dengan baik. Juga sangat sulit untuk mengekspresikan dengan baik di sebagian besar bahasa komputer, yang lebih fokus pada fungsionalitas - yaitu, mengatakan apa yang melakukan ini versi program perlu dilakukan, saat ini, untuk membuatnya memuaskan.
Inilah contoh sederhana tentang apa yang saya maksud. Dalam kebanyakan bahasa, pencarian in-line cepat dari struktur data kecil akan memiliki kompleksitas yang cukup sehingga seseorang yang melihatnya untuk pertama kali kemungkinan tidak akan langsung mengenali apa itu. Itu adalah peluang untuk komentar yang baik, karena Anda dapat menambahkan sesuatu tentang maksud kode Anda yang mungkin akan segera dihargai oleh pembaca sebagai bantuan untuk menguraikan detail.
Sebaliknya, dalam bahasa seperti bahasa berdasarkan logika-Prolog, mengungkapkan pencarian dari daftar kecil bisa jadi sangat sepele dan ringkas bahwa setiap komentar Anda bisa menambahkan hanya akan menjadi kebisingan. Jadi, komentar yang baik tentu tergantung pada konteks. Itu termasuk faktor-faktor seperti kekuatan bahasa yang Anda gunakan dan keseluruhan konteks program.
Intinya adalah ini: Pikirkan masa depan. Tanyakan kepada diri sendiri apa yang penting dan jelas bagi Anda tentang bagaimana program harus dipahami dan dimodifikasi di masa depan. [1]
Untuk bagian-bagian dari kode Anda yang benar-benar mendokumentasikan diri, komentar cukup tambahkan noise dan tingkatkan masalah koherensi untuk versi yang akan datang. Jadi jangan menambahkannya di sana.
Tetapi untuk bagian-bagian kode Anda di mana Anda membuat keputusan kritis dari beberapa opsi, atau di mana kode itu sendiri cukup kompleks sehingga tujuannya tidak jelas, tolong, tambahkan pengetahuan khusus Anda dalam bentuk komentar. Sebuah komentar yang baik dalam kasus seperti itu adalah komentar yang membuat beberapa programmer di masa depan tahu apa yang harus dijaga tetap sama - yaitu konsep pernyataan invarian, secara kebetulan - dan apa yang boleh diubah.
[1] Ini melampaui masalah komentar, tetapi layak untuk dibahas: Jika Anda menemukan ide yang sangat tajam tentang bagaimana kode Anda dapat berubah di masa mendatang, Anda mungkin harus berpikir lebih dari sekadar membuat komentar dan menyematkan parameter-parameter itu. di dalam kode itu sendiri, karena itu akan selalu menjadi cara yang lebih dapat diandalkan untuk memastikan keandalan versi kode Anda di masa mendatang daripada mencoba menggunakan komentar untuk mengarahkan orang yang tidak dikenal di masa depan ke arah yang benar. Pada saat yang sama Anda juga ingin menghindari generalisasi yang berlebihan, karena manusia terkenal buruk dalam memprediksi masa depan, dan itu termasuk masa depan perubahan program. Jadi, cobalah untuk mendefinisikan dan menangkap dimensi masa depan yang masuk akal dan terbukti dengan baik di semua tingkat desain program, tetapi jangan
sumber
Dalam kode saya sendiri, saya akan sering meninggalkan komentar tautologi di tempat, termasuk yang sangat mengerikan seperti:
... yang jelas berkontribusi sedikit dalam hal membuat kode lebih mudah dipahami dari perspektif penjelasan.
Namun, dalam pikiran saya, komentar-komentar ini masih memiliki nilai, jika mereka membantu menjaga konsistensi visual dari pola warna dalam stabilo sintaksis Anda .
Saya menganggap kode memiliki struktur yang sangat mirip dengan bahasa Inggris, karena ada "kalimat" dan "paragraf" (meskipun "paragraf" seluruhnya terdiri dari satu "kalimat"). Saya biasanya menyertakan ringkasan baris dan satu baris di atas setiap "paragraf". Sebagai contoh:
(Abaikan kode yang tidak lengkap, suntikan SQL, dll. Anda mendapatkan ide.)
Bagi saya, komentar terakhir benar-benar menambah nilai pada kode, hanya karena itu membantu untuk secara visual menggambarkan satu "paragraf" dari yang lain dengan mempertahankan skema pewarnaan yang konsisten.
sumber
Komentar harus digunakan untuk melakukan salah satu dari yang berikut ini.
Komentar tidak boleh digunakan untuk melakukan hal berikut:
page=0; // Sets the page to 0
. Saya pikir setiap individu yang kompeten dapat mengetahuinya.sumber
Saya akan menghapus tautologi tetapi menyimpan komentar, saya akan mengomentari properti dan nama variabel dengan memberikan nilai sampel, sehingga penggunaannya dipahami dengan jelas:
Sekarang saya tahu persis apa yang terjadi di sana, dan dari komentar itu, saya punya ide yang jelas bagaimana menggunakannya.
sumber
Saya akan mengatakan itu tergantung pada tujuan dari komentar.
Jika mereka akan digunakan untuk menghasilkan dokumentasi untuk digunakan oleh tim yang membangunnya (atau jika mereka hanya komentar inline untuk menjelaskan sesuatu), maka saya pikir itu bisa diterima untuk meninggalkan itu. Dapat diasumsikan dengan aman bahwa itu sudah jelas; dan ketika tidak, ada anggota tim lain di dekatnya yang dapat menjelaskannya. Tentu saja, jika ternyata tidak terbukti sendiri bagi banyak orang, Anda harus menambahkannya.
Jika komentar akan menghasilkan dokumentasi untuk beberapa tim yang jauh secara geografis, maka saya akan meletakkan setiap bit dokumentasi di sana.
sumber
Saya pikir topik ini telah dibahas cukup luas dengan nama-nama seperti "komentar: anti-pola", atau "apakah komentar berbau kode?" ( satu contoh ).
Saya cenderung setuju dengan gagasan umum bahwa komentar harus menambahkan informasi baru, bukan duplikat. Dengan menambahkan komentar sepele seperti itu, Anda melanggar KERING, dan mengurangi rasio sinyal terhadap derau kode. Saya cenderung menemukan komentar tingkat tinggi yang menjelaskan tanggung jawab, alasan di balik, dan contoh penggunaan kelas jauh lebih berguna daripada komentar per-properti (terutama yang berlebihan).
Secara pribadi, dalam contoh Anda, saya akan meninggalkan komentar (jika tidak ada yang berguna untuk ditambahkan tentang properti).
sumber
Jika Anda dapat menulis kode yang tidak memerlukan komentar maka Anda telah mencapai pemrograman nirwana !.
Semakin sedikit komentar, kode Anda membutuhkan kode yang lebih baik!
sumber
Sepertinya tidak ada gunanya jika Anda sudah tahu apa
UpdateLocation
. Apakah "pembaruan" di sini adalah kata kerja atau kata benda adjunct? Yaitu, apakah ini sesuatu yang memperbarui lokasi, atau apakah itu lokasi pembaruan? Orang mungkin menyimpulkan yang terakhir dari fakta yangUpdateLocation
tampaknya properti, tetapi poin yang lebih besar adalah bahwa kadang-kadang tidak ada salahnya untuk secara eksplisit menyatakan sesuatu yang tampak jelas.sumber
Selain dokumentasi yang dikompilasi secara otomatis, kode harus mendokumentasikan dirinya sendiri, sehingga komentar hanya boleh mendokumentasikan di mana kode tidak cukup untuk mendokumentasikan dirinya sendiri.
sumber
"Lokasi" agak jelas, tetapi "Pembaruan" bisa agak kabur. Jika Anda tidak dapat menulis nama yang lebih baik, dapatkah Anda memberikan lebih banyak detail dalam komentar? Pembaruan apa? Kenapa kita perlu ini? Apa sajakah asumsi (apakah nol dibolehkan)?
sumber