Banyak orang mengklaim bahwa "komentar harus menjelaskan 'mengapa', tetapi tidak 'bagaimana'". Yang lain mengatakan bahwa "kode harus mendokumentasikan diri sendiri" dan komentar harus langka. Robert C. Martin mengklaim bahwa (diucapkan dengan kata-kata saya sendiri) sering "komentar adalah permintaan maaf untuk kode yang ditulis dengan buruk".
Pertanyaan saya adalah sebagai berikut:
Apa yang salah dengan menjelaskan algoritma yang rumit atau potongan kode yang panjang dan berbelit-belit dengan komentar deskriptif?
Dengan cara ini, alih-alih pengembang lain (termasuk Anda sendiri) harus membaca seluruh algoritme baris demi baris untuk mengetahui apa yang dilakukannya, mereka hanya dapat membaca komentar deskriptif ramah yang Anda tulis dalam bahasa Inggris.
Bahasa Inggris 'dirancang' agar mudah dipahami oleh manusia. Java, Ruby atau Perl, bagaimanapun, telah dirancang untuk menyeimbangkan keterbacaan manusia dan keterbacaan komputer, sehingga mengurangi keterbacaan teks oleh manusia. Seorang manusia dapat memahami sepotong bahasa Inggris lebih cepat sehingga dia dapat memahami sepotong kode dengan makna yang sama (selama operasi itu tidak sepele).
Jadi setelah menulis sepotong kode kompleks yang ditulis dalam bahasa pemrograman yang dapat dibaca sebagian manusia, mengapa tidak menambahkan komentar deskriptif dan ringkas yang menjelaskan pengoperasian kode dalam bahasa Inggris yang ramah dan dapat dimengerti?
Beberapa orang akan mengatakan "kode seharusnya tidak sulit untuk dimengerti", "membuat fungsi kecil", "gunakan nama deskriptif", "jangan menulis kode spaghetti".
Tapi kita semua tahu itu tidak cukup. Ini hanyalah pedoman - yang penting dan berguna - tetapi mereka tidak mengubah fakta bahwa beberapa algoritma rumit. Dan karena itu sulit untuk dipahami ketika membacanya baris demi baris.
Apakah benar-benar buruk untuk menjelaskan algoritma yang rumit dengan beberapa baris komentar tentang operasi umum itu? Apa yang salah dengan menjelaskan kode rumit dengan komentar?
sumber
Jawaban:
Dalam istilah awam:
Intinya:
Menjelaskan dirimu baik, tidak perlu melakukannya lebih baik.
sumber
Ada banyak alasan berbeda untuk kode menjadi rumit atau membingungkan. Alasan paling umum paling baik diatasi dengan refactoring kode untuk membuatnya kurang membingungkan, bukan dengan menambahkan komentar dalam bentuk apa pun.
Namun, ada beberapa kasus di mana komentar yang dipilih dengan baik adalah pilihan terbaik.
Jika algoritma itu sendiri yang rumit dan membingungkan, bukan hanya implementasinya — jenis yang ditulis dalam jurnal matematika dan selalu disebut sebagai Algoritma Mbogo — maka Anda memberikan komentar di awal implementasi, membaca sesuatu seperti "Ini adalah Algoritma Mbogo untuk widget refrobnicating, awalnya dijelaskan di sini: [URL kertas]. Implementasi ini berisi perbaikan oleh Alice dan Carol [URL makalah lain]." Jangan mencoba lebih detail dari itu; jika seseorang membutuhkan lebih banyak detail, mereka mungkin perlu membaca seluruh makalah.
Jika Anda telah mengambil sesuatu yang dapat ditulis sebagai satu atau dua baris dalam beberapa notasi khusus dan memperluasnya menjadi gumpalan besar kode imperatif, menempatkan satu atau dua baris notasi khusus tersebut dalam komentar di atas fungsi adalah cara yang baik untuk beri tahu pembaca apa yang harus dilakukan. Ini pengecualian untuk argumen "tetapi bagaimana jika komentar tidak sinkron dengan kode", karena notasi khusus mungkin lebih mudah untuk menemukan bug daripada kode. (Ini sebaliknya jika Anda menulis spesifikasi dalam bahasa Inggris.) Contoh yang baik di sini: https://dxr.mozilla.org/mozilla-central/source/layout/style/nsCSSScanner.cpp#1057 ...
Jika kode secara keseluruhan mudah, tetapi berisi satu atau dua hal yang terlihat terlalu berbelit-belit, tidak perlu, atau hanya salah, tetapi harus seperti itu karena alasan, maka Anda memberikan komentar tepat di atas bit yang tampak mencurigakan, di mana Anda nyatakan alasannya . Inilah contoh sederhana, di mana satu-satunya hal yang perlu dijelaskan adalah mengapa sebuah konstanta memiliki nilai tertentu.
sumber
4
seharusnyaCHAR_BIT / 2
;-)CHAR_BITS
16 dan sizeof (size_t) adalah 2, tetapi nilai maksimum size_t adalah misalnya 2 ^ 20 [size_t mengandung 12 bit padding]?reallocarray
, dan OpenBSD umumnya tidak percaya pada kemungkinan yang tidak terjadi pada ABI mereka .int
. Karena, diberikanuint32_t x,y,z;
, arti(x-y) > z
tergantung pada ukuranint
. Lebih lanjut, bahasa yang dirancang untuk menulis kode yang kuat harus memungkinkan pemrogram untuk membedakan antara jenis di mana perhitungan diharapkan melebihi kisaran jenis dan harus membungkus secara diam-diam, versus satu di mana perhitungan melebihi kisaran jenis yang harus dijebak, versus yang mana perhitungan tidak diharapkan untuk melebihi kisaran tipe, tapi ...Ini bukan masalah benar atau salah, tetapi tentang 'praktik terbaik', sebagaimana didefinisikan dalam artikel Wikipedia :
Jadi praktik terbaik adalah mencoba memperbaiki kode terlebih dahulu, dan menggunakan bahasa Inggris jika itu tidak mungkin.
Ini bukan undang-undang, tetapi jauh lebih umum untuk menemukan kode komentar yang memerlukan refactoring daripada kode refactored yang membutuhkan komentar, praktik terbaik mencerminkan hal ini.
sumber
//This code seriously needs a refactor
Suatu hari akan tiba ketika kode Anda yang indah, dibuat dengan sempurna, terstruktur dengan baik dan mudah dibaca tidak akan berfungsi. Atau itu tidak akan bekerja dengan cukup baik. Atau kasus khusus akan muncul di tempat yang tidak berfungsi dan perlu disesuaikan.
Pada titik itu, Anda perlu melakukan sesuatu yang mengubah beberapa hal agar berfungsi dengan benar. Terutama dalam kasus di mana ada masalah kinerja, tetapi juga sering dalam skenario di mana salah satu pustaka, API, layanan web, permata atau sistem operasi yang Anda kerjakan tidak berperilaku seperti yang diharapkan, Anda dapat membuat saran yang tidak tentu tidak elegan, tetapi kontra-intuitif atau tidak jelas.
Jika Anda tidak memiliki komentar untuk menjelaskan mengapa Anda memilih pendekatan itu, ada peluang yang sangat bagus bahwa seseorang di masa depan (dan seseorang yang mungkin adalah Anda) akan melihat kode tersebut, lihat bagaimana hal itu dapat "diperbaiki" untuk sesuatu yang lebih mudah dibaca dan elegan dan secara tidak sengaja membatalkan perbaikan Anda, karena itu tidak terlihat seperti perbaikan.
Jika semua orang selalu menulis kode yang sempurna maka akan jelas bahwa kode yang terlihat tidak sempurna itu bekerja di sekitar beberapa intervensi rumit dari dunia nyata, tetapi bukan itu cara kerjanya. Sebagian besar programmer sering menulis kode yang membingungkan atau agak kusut sehingga ketika kita menjumpai ini adalah kecenderungan alami untuk merapikannya. Saya bersumpah masa lalu saya adalah orang idiot yang sebenarnya setiap kali saya membaca kode lama yang saya tulis.
Jadi saya tidak menganggap komentar sebagai permintaan maaf untuk kode buruk, tapi mungkin sebagai penjelasan mengapa Anda tidak melakukan hal yang jelas. Memiliki
// The standard approach doesn't work against the 64 bit version of the Frobosticate Library
akan memungkinkan pengembang di masa depan, termasuk diri Anda di masa depan, untuk memperhatikan bagian dari kode dan menguji terhadap perpustakaan itu. Tentu, Anda mungkin memasukkan komentar di komit kontrol sumber Anda juga, tetapi orang-orang hanya akan melihatnya setelah ada yang tidak beres. Mereka akan membaca komentar kode saat mereka mengubah kode.Orang-orang yang memberi tahu kami bahwa kami harus selalu menulis kode yang sempurna secara teoritis tidak selalu orang dengan banyak pengalaman pemrograman di lingkungan dunia nyata. Kadang-kadang Anda perlu menulis kode yang berkinerja ke tingkat tertentu, kadang-kadang Anda perlu beroperasi dengan sistem yang tidak sempurna. Itu tidak berarti bahwa Anda tidak dapat melakukan ini dengan cara yang elegan dan ditulis dengan baik, tetapi solusi yang tidak jelas perlu penjelasan.
Ketika saya menulis kode untuk proyek-proyek hobi yang saya tahu tidak akan pernah dibaca orang lain, saya masih berkomentar bagian yang saya anggap membingungkan - misalnya, setiap geometri 3D melibatkan matematika yang saya tidak sepenuhnya di rumah dengan - karena saya tahu kapan saya kembali dalam enam bulan saya akan benar-benar lupa bagaimana melakukan hal ini. Itu bukan permintaan maaf untuk kode buruk, itu pengakuan keterbatasan pribadi. Yang akan saya lakukan dengan membiarkannya tanpa komentar adalah menciptakan lebih banyak pekerjaan untuk diri saya di masa depan. Saya tidak ingin masa depan saya harus mempelajari kembali sesuatu yang tidak perlu jika saya bisa menghindarinya sekarang. Nilai apa yang mungkin dimiliki nilai itu?
sumber
Kebutuhan akan komentar berbanding terbalik dengan tingkat abstraksi kode.
Misalnya, Bahasa Assembly, untuk tujuan praktis, tidak dapat dipahami tanpa komentar. Berikut adalah kutipan dari program kecil yang menghitung dan mencetak ketentuan dari seri Fibonacci :
Bahkan dengan komentar, itu bisa sangat rumit untuk grok.
Contoh Modern: Regex seringkali merupakan konstruksi abstraksi yang sangat rendah (huruf kecil, angka 0, 1, 2, baris baru, dll). Mereka mungkin perlu komentar dalam bentuk sampel (Bob Martin, IIRC, tidak mengakui ini). Berikut adalah regex yang (menurut saya) harus cocok dengan HTTP (S) dan URL FTP:
Saat bahasa berkembang hierarki abstraksi, programmer dapat menggunakan abstraksi menggugah (nama variabel, nama fungsi, nama kelas, nama modul, antarmuka, panggilan balik, dll) untuk menyediakan dokumentasi bawaan. Untuk mengabaikan mengambil keuntungan dari ini, dan menggunakan komentar untuk menulis di atasnya itu malas, merugikan dan tidak sopan dari pengelola.
Saya sedang berpikir untuk Numerical Recipes di C diterjemahkan sebagian besar verbatim untuk Numerical Recipes dalam C ++ , yang saya simpulkan dimulai sebagai Numerical Recipes (di FORTRAN), dengan semua variabel
a
,aa
,b
,c
,cc
, dll dipertahankan melalui setiap versi. Algoritme mungkin benar, tetapi mereka tidak memanfaatkan abstraksi bahasa yang disediakan. Dan mereka membuatku kesal. Contoh dari artikel Dr. Dobbs - Fast Fourier Transform :Sebagai kasus khusus tentang abstraksi, setiap bahasa memiliki idiom / cuplikan kode kanonik untuk tugas-tugas umum tertentu (menghapus daftar yang terkait dinamis dalam C), dan terlepas dari bagaimana tampilannya, mereka tidak boleh didokumentasikan. Pemrogram harus mempelajari idiom-idiom ini, karena mereka adalah bagian tidak resmi dari bahasa tersebut.
Jadi kesimpulannya: Kode non-idiomatik yang dibangun dari blok bangunan tingkat rendah yang tidak dapat dihindari membutuhkan komentar. Dan ini perlu WAAAAY kurang dari itu terjadi.
sumber
dec dword [term] ; decrement loop counter
. Di sisi lain, apa yang tidak ada pada contoh bahasa majelis Anda adalah komentar sebelum setiap "paragraf kode" menjelaskan apa yang dilakukan oleh blok kode berikutnya. Dalam hal itu, komentar biasanya akan setara dengan satu baris dalam pseudocode, seperti;clear the screen
, diikuti oleh 7 baris yang diperlukan untuk menghapus layar.^(((ht|f)tps?)\:\/\/)?(www\.)*[a-zA-Z0-9\-\.]+\.(com|edu|gov|mil|net|org|biz|info|name|museum|us|ca|uk)(\:[0-9]+)*(\/($|[a-zA-Z0-9\.\,\;\?\'\\\+&%\$#\=~_\-]+))*$
? Waspadai alamat numerik."The need for comments is inversely proportional to the abstraction level of the code."
Cukup banyak jumlah semuanya di sana.Saya tidak percaya ada yang salah dengan komentar dalam kode. Gagasan bahwa komentar entah bagaimana buruk menurut pendapat saya adalah karena beberapa programmer mengambil terlalu banyak hal. Ada banyak bandwagoning di industri ini, terutama terhadap pandangan ekstrem. Di suatu tempat sepanjang jalan berkomentar kode menjadi setara dengan kode buruk dan saya tidak yakin mengapa.
Komentar memang memiliki masalah - Anda harus terus memperbaruinya saat Anda memperbarui kode yang mereka rujuk, yang jarang terjadi. Wiki atau sesuatu adalah sumber yang lebih tepat untuk dokumentasi menyeluruh tentang kode Anda. Kode Anda harus dapat dibaca tanpa memerlukan komentar. Kontrol versi atau catatan revisi harus menjadi tempat Anda menggambarkan perubahan kode yang Anda buat.
Namun, tidak ada satu pun di atas yang membatalkan penggunaan komentar. Kami tidak hidup di dunia yang ideal sehingga ketika salah satu di atas gagal karena alasan apa pun, saya lebih suka memiliki beberapa komentar untuk mundur.
sumber
Saya pikir Anda terlalu banyak membaca apa yang dia katakan. Ada dua bagian berbeda untuk keluhan Anda:
(1) tidak bisa dihindari. Saya tidak berpikir bahwa Martin akan tidak setuju dengan Anda. Jika Anda menulis sesuatu seperti root kuadrat terbalik cepat , Anda akan memerlukan beberapa komentar, bahkan jika itu hanya "peretasan tingkat bit floating point jahat." Kecuali sesuatu yang sederhana seperti DFS atau pencarian biner, tidak mungkin orang yang membaca kode Anda akan memiliki pengalaman dengan algoritma itu, dan jadi saya pikir setidaknya harus disebutkan dalam komentar tentang apa itu.
Namun sebagian besar kode tidak (1). Jarang Anda akan menulis perangkat lunak yang tidak lain adalah implementasi mutex linting tangan, operasi aljabar linier yang tidak jelas dengan dukungan perpustakaan yang buruk, dan algoritme baru yang hanya diketahui oleh grup riset perusahaan Anda. Sebagian besar kode terdiri dari panggilan pustaka / framework / API, IO, boilerplate, dan unit test.
Ini adalah jenis kode yang dibicarakan Martin. Dan dia menjawab pertanyaan Anda dengan kutipan dari Kernighan dan Plaugher di bagian atas bab ini:
Jika Anda memiliki bagian yang panjang dan berbelit-belit dalam kode Anda, Anda gagal menjaga kode Anda tetap bersih . Solusi terbaik untuk masalah ini adalah tidak menulis komentar sepanjang paragraf di bagian atas file untuk membantu pengembang masa depan mengatasi masalah itu; solusi terbaik adalah menulis ulang.
Dan inilah yang dikatakan Martin:
Ini adalah milikmu (2). Martin setuju bahwa panjang, kode berbelit-belit memang membutuhkan komentar - tetapi ia menyalahkan kode itu di pundak programmer yang menulisnya, bukan gagasan samar-samar bahwa "kita semua tahu itu tidak cukup." Dia berpendapat bahwa:
sumber
Tidak ada yang seperti itu. Mendokumentasikan pekerjaan Anda adalah praktik yang baik.
Yang mengatakan, Anda memiliki dikotomi palsu di sini: menulis kode bersih vs menulis kode terdokumentasi - keduanya tidak bertentangan.
Yang harus Anda fokuskan adalah menyederhanakan dan mengabstraksi kode kompleks menjadi kode yang lebih sederhana, alih-alih berpikir "kode kompleks baik-baik saja asalkan dikomentari".
Idealnya, kode Anda harus sederhana dan didokumentasikan.
Benar. Inilah sebabnya mengapa semua algoritma API publik Anda harus dijelaskan dalam dokumentasi.
Idealnya, setelah menulis sepotong kode kompleks Anda harus (bukan daftar lengkap):
Tidak satu pun dari langkah-langkah ini yang sepele untuk dilakukan (yaitu masing-masing dapat memakan waktu beberapa jam) dan imbalan untuk melakukannya tidak langsung. Dengan demikian, langkah-langkah ini (hampir) selalu dikompromikan (oleh pengembang memotong sudut, manajer memotong sudut, tenggat waktu, kendala pasar / kondisi dunia nyata lainnya, kurangnya pengalaman dll).
Anda tidak perlu mengandalkan membaca implementasi untuk mengetahui apa yang dilakukan oleh API. Ketika Anda melakukan itu, Anda menerapkan kode klien berdasarkan pada implementasi (bukan antarmuka) dan itu berarti kopling modul Anda sudah melesat ke neraka, Anda berpotensi memperkenalkan dependensi tidak berdokumen dengan setiap baris kode baru yang Anda tulis, dan sudah menambahkan utang teknis.
Tidak - itu bagus. Menambahkan beberapa baris komentar saja tidak cukup.
Fakta bahwa Anda seharusnya tidak memiliki kode yang rumit, jika itu bisa dihindari.
Untuk menghindari kode yang rumit, formalkan antarmuka Anda, belanjakan ~ 8 kali lebih banyak pada desain API daripada yang Anda habiskan untuk implementasi (Stepanov menyarankan untuk menghabiskan setidaknya 10x pada antarmuka, dibandingkan dengan implementasi), dan masuk ke dalam mengembangkan proyek dengan pengetahuan yang Anda membuat proyek, bukan hanya menulis beberapa algoritma.
Sebuah proyek melibatkan dokumentasi API, dokumentasi fungsional, pengukuran kode / kualitas, manajemen proyek dan sebagainya. Tidak satu pun dari proses ini yang merupakan langkah cepat yang harus dilakukan (mereka semua membutuhkan waktu, memerlukan pemikiran dan perencanaan, dan semuanya mengharuskan Anda untuk kembali secara berkala dan merevisi / melengkapinya dengan detail).
sumber
Saya akan menganggap ini sedikit penyalahgunaan "komentar". Jika programmer ingin membaca sesuatu daripada keseluruhan algoritma, maka untuk itulah fungsi dokumentasi itu. OK, jadi dokumentasi fungsi mungkin benar-benar muncul di komentar di sumber (mungkin untuk diekstraksi dengan alat doc), tetapi meskipun secara sintaksis itu adalah komentar sejauh yang dikompilasi oleh kompiler Anda, Anda harus menganggap mereka memisahkan hal-hal dengan tujuan yang berbeda. Saya tidak berpikir "komentar harus langka" berarti dimaksudkan untuk "dokumentasi harus langka" atau bahkan "pemberitahuan hak cipta harus langka"!
Komentar dalam fungsi ini untuk seseorang untuk membaca serta kode. Jadi, jika Anda memiliki beberapa baris dalam kode Anda yang sulit dimengerti, dan Anda tidak dapat membuatnya mudah dimengerti, maka komentar berguna bagi pembaca untuk digunakan sebagai pengganti untuk baris-baris itu. Ini bisa sangat berguna ketika pembaca hanya mencoba untuk mendapatkan inti umum, tetapi ada beberapa masalah:
Ada pengecualian, tetapi sebagian besar pembaca harus memahami kode itu sendiri. Komentar harus ditulis untuk membantu itu, bukan untuk menggantinya, itulah sebabnya Anda umumnya disarankan bahwa komentar harus mengatakan "mengapa Anda melakukannya". Seorang pembaca yang mengetahui motivasi untuk beberapa baris kode berikutnya memiliki peluang lebih baik untuk melihat apa yang mereka lakukan dan bagaimana.
sumber
Seringkali kita harus melakukan hal-hal rumit. Memang benar untuk mendokumentasikannya untuk pemahaman di masa depan. Kadang-kadang tempat yang tepat untuk dokumentasi ini adalah dalam kode, di mana dokumentasi dapat tetap diperbarui dengan kode. Tapi itu pasti layak dipertimbangkan dokumentasi terpisah. Ini juga bisa lebih mudah disajikan kepada orang lain, termasuk diagram, gambar berwarna, dan sebagainya. Maka komentarnya adalah:
atau bahkan adil
Tentunya orang senang dengan fungsi yang bernama
MatchStringKnuthMorrisPratt
atauencryptAES
ataupartitionBSP
. Lebih banyak nama yang tidak jelas perlu dijelaskan dalam komentar. Anda juga bisa menambahkan data bibliografi dan tautan ke sebuah makalah tempat Anda menerapkan algoritma.Jika suatu algoritma itu kompleks dan baru dan tidak jelas, itu pasti bernilai dokumen, bahkan jika hanya untuk sirkulasi internal perusahaan. Periksa dokumen ke dalam kontrol sumber jika Anda khawatir dokumen itu hilang.
Ada kategori kode lain yang tidak terlalu algoritmik seperti birokratis. Anda perlu mengatur parameter untuk sistem lain, atau beroperasi dengan bug orang lain:
sumber
doPRD239Algorithm
yang memberitahu saya apa-apa tentang fungsi tanpa harus mencari algoritma, alasanMatchStringKnuthMorrisPratt
danencryptAES
kerjanya adalah bahwa mereka mulai dengan deskripsi tentang apa yang mereka lakukan, kemudian menindaklanjuti dengan deskripsi metodologi.Saya lupa di mana saya membacanya tetapi ada adalah garis tajam dan jelas antara apa yang harus muncul dalam kode Anda dan apa yang harus muncul sebagai komentar.
Saya percaya Anda harus mengomentari maksud Anda, bukan algoritma Anda . Yaitu berkomentar apa yang harus Anda lakukan, bukan pada apa yang Anda lakukan .
Sebagai contoh:
Di sini tidak ada upaya untuk menyatakan apa yang dilakukan setiap langkah, semua yang dinyatakan adalah apa yang seharusnya dilakukan.
PS: Saya menemukan sumber yang saya maksud - Coding Horror: Code Tells You How, Komentar Tell You Why
sumber
Future
dan menunjukkan bahwaget()
diikuti oleh cek terhadapnull
mendeteksi apakahFuture
sudah dijalankan - dengan benar mendokumentasikan maksud daripada proses .Benarkah? Sejak kapan?
Kode yang dirancang dengan baik dengan nama-nama baik lebih dari cukup di sebagian besar kasus. Argumen yang menentang penggunaan komentar diketahui dan didokumentasikan (seperti yang Anda rujuk).
Tetapi ini adalah pedoman (seperti yang lainnya). Dalam kasus yang jarang terjadi (menurut pengalaman saya, kira-kira setiap 2 tahun sekali) di mana segala sesuatunya akan menjadi lebih buruk ketika direactored menjadi fungsi-fungsi yang lebih mudah dibaca (karena kebutuhan kinerja atau kohesi) kemudian lanjutkan - masukkan komentar panjang yang menjelaskan apa sebenarnya benda itu. lakukan (dan mengapa Anda melanggar praktik terbaik).
sumber
Tujuan utama kode adalah memerintahkan komputer untuk melakukan sesuatu, jadi komentar yang baik tidak pernah menggantikan kode yang baik karena komentar tidak dapat dieksekusi.
Yang sedang berkata, komentar dalam sumber adalah salah satu bentuk dokumentasi untuk programmer lain (termasuk Anda). Jika komentar tentang masalah yang lebih abstrak daripada apa yang dilakukan kode pada setiap langkah, Anda melakukan lebih baik daripada rata-rata. Level abstraksi itu bervariasi dengan alat yang Anda gunakan. Komentar yang menyertai rutinitas bahasa majelis umumnya memiliki tingkat "abstraksi" yang lebih rendah daripada, misalnya, APL ini
A←0⋄A⊣{2⊤⍵:1+3×⍵⋄⍵÷2}⍣{⍺=A+←1}⎕
. Saya pikir itu mungkin pantas komentar tentang masalah yang ingin diselesaikan, hmmm?sumber
Jika kode itu sepele, tidak perlu komentar penjelasan. Jika kodenya non-sepele, komentar penjelas kemungkinan besar juga akan non-sepele.
Sekarang, masalah dengan bahasa alami non-sepele adalah bahwa banyak dari kita tidak pandai membaca atau menulisnya. Saya yakin kemampuan komunikasi tertulis Anda luar biasa, tetapi seseorang yang kurang paham bahasa tulisan mungkin salah mengerti kata-kata Anda.
Jika Anda berusaha sangat keras untuk menulis bahasa alami yang tidak dapat disalahartikan, Anda akan berakhir dengan sesuatu seperti dokumen hukum (dan seperti yang kita semua tahu itu lebih verbal dan sulit dipahami daripada kode).
Kode harus menjadi deskripsi paling ringkas dari logika Anda, dan seharusnya tidak ada banyak perdebatan tentang arti kode Anda karena kompiler dan platform Anda memiliki pendapat akhir.
Secara pribadi saya tidak akan mengatakan bahwa Anda tidak boleh menulis komentar. Hanya Anda yang perlu mempertimbangkan mengapa kode Anda perlu komentar, dan bagaimana Anda dapat memperbaikinya. Ini sepertinya menjadi tema umum dalam jawaban di sini.
sumber
Satu hal yang belum disebutkan adalah bahwa kadang-kadang mengomentari dengan tepat apa yang dilakukan sepotong kode dapat membantu dalam kasus-kasus di mana bahasa menggunakan sintaksis tertentu untuk berbagai keperluan. Misalnya, dengan asumsi semua variabel bertipe
float
, pertimbangkan:Pengaruh secara eksplisit casting
float
untukfloat
adalah untuk memaksa hasil yang akan dibulatkan ke presisi tunggal; komentar dengan demikian dapat dilihat hanya dengan mengatakan apa yang dilakukan kode. Di sisi lain, bandingkan kode itu dengan:Di sini, tujuan para pemain adalah untuk mencegah kompiler dari berkotek di cara komputasi yang paling efisien (f2 / 10) [ini lebih akurat daripada dikalikan dengan 0,1f, dan pada kebanyakan mesin lebih cepat daripada membaginya dengan 10.0f].
Tanpa komentar, seseorang yang meninjau kode sebelumnya mungkin berpikir para pemain ditambahkan dengan keyakinan yang keliru bahwa akan diperlukan untuk mencegah kompiler dari berkotek dan bahwa itu tidak diperlukan. Faktanya, para pemain berperan untuk melakukan persis apa yang dikatakan oleh spesifikasi bahasa: memaksa hasil perhitungan untuk dibulatkan ke presisi tunggal bahkan pada mesin di mana pembulatan akan lebih mahal daripada menjaga hasilnya dalam presisi yang lebih tinggi. Mengingat bahwa para pemain
float
dapat memiliki sejumlah arti dan tujuan yang berbeda, memiliki komentar yang menentukan makna yang dimaksudkan dalam skenario tertentu dapat membantu memperjelas bahwa makna yang sebenarnya sejalan dengan maksud.sumber
someFloatProperty
representasi yang paling akurat darif2/10
yang ia dapat; tujuan utama dari pemeran kedua adalah hanya untuk membuat kompilasi kode . Dalam contoh pertama, bagaimanapun, para pemain jelas tidak diperlukan untuk tujuan normal (mengubah satu tipe waktu kompilasi ke yang lain) karena operan sudahfloat
. Komentar berfungsi untuk membuat jelas bahwa para pemain yang dibutuhkan untuk tujuan sekunder (pembulatan).(float)
pemeran dalam contoh kedua. Pertanyaannya adalah tentang konstanta literal0.1
. Anda menjelaskan (dalam paragraf teks berikutnya) mengapa kami menulis0.1
: "lebih akurat daripada kalikan dengan 0,1f." Saya menyarankan agar itu adalah kata-kata yang seharusnya ada di komentar.double
untuk konstanta atau perhitungan menengah yang nilainya mungkin tidak dapat direpresentasikan sebagaifloat
[meskipun dalam bahasa yang membutuhkan gips double-to-float eksplisit yang menjengkelkan, kemalasan mungkin mendorong untuk menggunakanfloat
konstanta bukan untuk kecepatan, tetapi untuk meminimalkan gangguan].Komentar yang menjelaskan apa yang dilakukan kode adalah bentuk duplikasi. Jika Anda mengubah kode lalu lupa memperbarui komentar, ini dapat menyebabkan kebingungan. Saya tidak mengatakan jangan menggunakannya, gunakan saja dengan bijaksana. Saya berlangganan pepatah Paman Bob: "Hanya komentar apa kode tidak bisa mengatakan".
sumber