Apa cara yang baik untuk berkomentar if-else-clauses? [Tutup]

15

Setiap kali saya menulis if-else-construct dalam bahasa apa pun, saya bertanya-tanya apa yang akan menjadi cara terbaik (dalam hal keterbacaan dan tinjauan) untuk menambahkan komentar. Terutama ketika mengomentari klausa lain, komentar selalu terasa tidak pada tempatnya bagi saya. Katakanlah kita memiliki konstruk seperti ini (contoh ditulis dalam PHP):

if ($big == true) {
    bigMagic();
} else {
    smallMagic()
}

Saya bisa berkomentar seperti ini:

// check, what kind of magic should happen
if ($big == true) {
    // do some big magic stuff
    bigMagic();
} else {
    // small magic is enough
    smallMagic()
}

atau

// check, what kind of magic should happen
// do some big magic stuff
if ($big == true) {
    bigMagic();
}
// small magic is enough
else {
   smallMagic()
}

atau

// check, what kind of magic should happen
// if:   do some big magic stuff
// else: small magic is enough
if ($big == true) {
    bigMagic();
} else {
    smallMagic()
}

Apa contoh praktik terbaik Anda untuk mengomentari ini?

puncak
sumber
8
else { // for future reader: sorry, at the moment of writing this I did not have time and skills to come up with a better way to express my logic
Agak
1
Mengapa lebih besar lebih baik / disukai / berbeda? Lihat, saya tidak tahu.
JeffO
Apakah ini subjek pertanyaan atau perdebatan? Bahkan jika pertanyaannya bermaksud baik, itu adalah permulaan perang.
Independen
1
Saya merasa menarik bahwa begitu banyak orang merasa bahwa pertanyaan ini layak untuk dijawab, tetapi tidak layak untuk diangkat. Sementara saya tertarik pada jawaban (saya adalah +1), pertanyaannya tampaknya menjadi contoh klasik dari masalah sepeda-shedding.
canisrufus
1
@canisrufus Hanya terlihat seperti itu bagi Anda karena suara turun mengimbangi suara naik. Pada saat ini, ada 6 suara naik dan turun 4 untuk bersih +2.
Caleb

Jawaban:

34

Saya lebih suka:

if ($magic == big) {
    bigMagic();
}
else {
    smallMagic();
}

atau:

if ($magic == big) {
    // big magic requires a big surprise, so I'm telling you about it here
    surprisingThing();
}
else {
    // give a magical feeling even if $magic is noMagicAtAll
    smallMagic();
}

Agak konyol untuk menulis komentar yang menjelaskan apa yang diperiksa kondisi Anda kecuali jika kode tidak menyatakannya dengan jelas. Meski begitu, lebih baik menulis ulang kode untuk membuatnya sejelas mungkin. Hal yang sama berlaku untuk badan-badan blok bersyarat - jika Anda dapat membuat alasan untuk melakukan sesuatu yang jelas, lakukan itu alih-alih berkomentar.

Saya tidak berlangganan filosofi "tidak pernah menulis komentar", tetapi saya percaya menghindari komentar yang mengatakan apa yang seharusnya dikatakan oleh kode. Jika Anda menulis komentar seperti "periksa keajaiban apa yang harus terjadi" ketika kode itu bisa mengatakan if ($magic == big) {..., pembaca akan berhenti membaca komentar Anda dengan sangat cepat. Menggunakan lebih sedikit, komentar yang lebih bermakna memberi masing-masing komentar Anda nilai lebih, dan pembaca lebih cenderung memperhatikan mereka yang Anda tulis.

Memilih nama yang bermakna untuk variabel dan fungsi Anda adalah penting. Nama yang dipilih dengan baik dapat menghilangkan kebutuhan akan komentar penjelasan di seluruh kode Anda. Dalam contoh Anda, $magicatau mungkin $kindOfMagicsepertinya nama yang lebih baik daripada $bigkarena menurut contoh Anda, itu adalah "jenis sihir" yang sedang diuji, bukan "besar" sesuatu.

Katakan sebanyak mungkin dalam kode. Simpan prosa untuk kasus-kasus yang membutuhkan lebih banyak penjelasan daripada yang bisa Anda tulis dalam kode.

Caleb
sumber
13
+1 jangan berlebihan komentar, kode yang jelas tidak memerlukan komentar
ratchet freak
3
@ratchetfreak Sepertinya kita sebagian besar sepakat, tetapi komentar sering kali diperlukan untuk membuat kode menjadi jelas. Memberikan konteks historis, menjelaskan perilaku mengejutkan, atau menyelesaikan ambiguitas paling baik dilakukan dengan komentar.
Caleb
1
Poin bagus, Caleb. Memang benar bahwa kode harus semacam komentar otomatis sendiri selama mungkin.
acme
7
Komentar yang baik tidak menjelaskan apa yang - "periksa, jenis sihir apa yang harus terjadi" - mereka menjelaskan mengapa, yaitu, "Pengguna dapat memilih jenis sihir yang akan dijalankan" atau "Layanan akan mengisi sihir besar jika mereka tersedia, jadi kita harus memeriksa tipe "atau apa pun. Tidak peduli seberapa bagus pengkodean Anda, mengapa tidak diketahui oleh mereka yang tidak terbiasa dengan aturan bisnis.
Bruno Brant
1
Masalahnya adalah lebih mudah menulis kode yang sulit dibaca dan tidak berkomentar. Menulis kode juga sulit untuk dibaca tetapi komentari dengan baik daripada menulis kode secara konsisten sehingga bagus tidak perlu komentar.
asfallows
11

Coba nama variabel penjelas

Komentar dapat menjadi sangat bagus, tetapi jika memungkinkan, buat kode untuk didokumentasikan sendiri. Salah satu cara untuk melakukan ini adalah dengan nama variabel penjelas. Misalnya, daripada ini:

if (user.has_sideburns && user.can_gyrate) {
  // This user is a potential Elvis impersonator

}

Saya lebih suka variabel bernama:

is_potential_elvis_impersonator = user.has_sideburns && user.can_gyrate

if (is_potential_elvis_impersonator) {
  ...
}
Nathan Long
sumber
2
Aku melangkah lebih jauh dan menggunakan: is_potential_elvis_impersonator. (Is / Memiliki / etc. Awalan untuk variabel boolean ..)
Jake Berger
@ jberger - Saya suka itu. Mengedit jawaban sesuai.
Nathan Long
3

Hanya untuk melengkapi beberapa komentar:

Penggunaan komentar yang tepat adalah untuk mengkompensasi kegagalan kami untuk mengekspresikan diri dalam kode. Perhatikan bahwa saya menggunakan kata gagal. Aku serius. Komentar selalu gagal. Kita harus memilikinya karena kita tidak bisa selalu mencari cara untuk mengekspresikan diri tanpa mereka, tetapi penggunaannya bukan merupakan alasan untuk perayaan. ( Clean Code oleh Robert C. Martin )

BTW: Saya merekomendasikan buku ini.

CSA
sumber
3

Komentar tidak boleh memparafrasekan kode tetapi menjelaskan hal-hal yang tidak ada dalam kode (gambaran yang lebih besar, mengapa, mengapa alternatif tidak dipilih ...) Dan contoh komentar Anda hanya itu: parafrase kode.

Anda mungkin kadang-kadang merasa bahwa parafrase diperlukan pada awal elsecabang, tetapi itu sering merupakan pertanda bahwa thencabang Anda terlalu besar.

Pemrogram
sumber
2

Dalam contoh spesifik Anda, komentar mungkin tidak diperlukan. Seperti yang disebutkan Caleb , jika kode ditulis dengan jelas dan variabel memiliki nama semantik, jika pernyataan cenderung membutuhkan komentar.

Bandingkan cuplikan Anda dengan ini:

if ($x) {
    func1();
} else {
    func2();
}

Dalam hal ini, Anda pasti ingin menggunakan komentar untuk menggambarkan apa yang mewakili x, func1, dan func2 (dan menampar orang yang menamakan sesuatu dengan skema itu, terutama jika itu Anda). Anda bahkan tidak tahu apakah $xseharusnya boolean. Tetapi ini juga merupakan kasus di mana Anda tidak perlu berkomentar, jika Anda dapat melakukan refactor dan mengganti nama.

Secara umum, saya suka menulis komentar untuk blok logis yang menjelaskan hal-hal yang tidak bisa dilakukan sendiri oleh kode. Satu baris setiap ~ 10-20 baris yang menggambarkan apa yang dicapai beberapa baris berikut pada satu tingkat abstraksi yang lebih tinggi (misalnya // Make the right amount of magic happenuntuk contoh Anda) akan membantu Anda tetap berorientasi dan memberikan wawasan pengulas baru tentang apa yang Anda lakukan dan kapan .

Saya sebenarnya sering menulis ini satu-baris sebelum saya mulai menulis kode, sehingga saya tidak kehilangan jejak yang seharusnya dimiliki segmen.

Akhirnya, jika Anda benar-benar lebih suka (atau ada mandat yang mengharuskan) mengomentari klausa di blok if terlepas dari keterbacaan kode, saya sarankan:

// Broad description of block
if (something) {
    //Do this because something
    something();
} else {
    //Do this because !something
    somethingElse();
}

Saya merasa ini yang terbersih, karena komentar berbaris dengan kode yang berkaitan. Sebuah komentar yang menjelaskan kode apa yang harus dilakukan sedekat mungkin dengan komentar yang digambarkannya mungkin.

asfallows
sumber
2
if (IsWeekDay(day))
{// weekday -> alarm at 7am
   ...
}
else if(day == DayOfWeek.Saturday)
{// saturday -> alarm at 11am
   ...
}
else
{// (sunday) -> no alarm
   ...
}

Saya menjaga tanda kurung saya dan meletakkannya tepat setelah braket.

[Condition] -> [pseudo-code]

Di sisi lain, secara teknis berarti semua kondisi lain gagal, jadi saya biasanya menggunakan tanda kurung.

([Condition]) -> [pseudo-code]

Catatan: ini untuk C #.

Jake Berger
sumber
1

Saya mencoba dan menggunakan komentar di dalam blok yang mengatakan apa yang dilakukan oleh blok itu (sampel pertama Anda).

Di mana ini agak rusak adalah ketika menggunakan elseif. Saya menggunakan Basic sehingga tidak ada blok akhir yang eksplisit dan sering harus mengomentari kondisi apa yang memeriksa pada baris di atas (dengan jeda baris tentu saja) jika terlalu panjang.

'Check XYZ
If Condition1 then
  'We need to do T and S
  DoCodeFor1();

'Check ABC
ElseIf Condition1 then
  'This requires something else to be done
  DoCodeFor2()

Else
  'We have no other option than to...
  DoCodeFor3()

End If
Deanna
sumber
Ya, ini benar-benar berfungsi lebih baik ketika Anda menggunakan bahasa tanpa tanda kurung.
acme
1
  • Jagalah agar blok persyaratan Anda tetap pendek.
  • Panggil metode dengan nama deskriptif yang bagus jika sepertinya kode kondisional Anda akan lebih dari satu atau dua baris sederhana.
  • Gunakan nama deskriptif yang bagus untuk variabel Anda.
  • Pastikan pernyataan kondisional jelas artinya, dan tidak dikaburkan atau panjang. Gunakan metode jika itu membantu menjaga hal-hal bersih dan mudah dibaca.

Jika semua hal di atas gagal, tambahkan komentar deskriptif yang sangat kecil sebelum pernyataan if, untuk memperjelas maksud Anda. Kalau tidak, tidak perlu ada komentar sama sekali.

S.Robins
sumber
0

Dalam C ++ atau C # Saya biasanya tidak akan berkomentar kasus sederhana (ketika jelas apa yang terjadi), dan menggunakan gaya semacam ini untuk mengomentari final lain ...

if (pattern == AAA)
{
  DoSomethingAAA();
}
else if (pattern == BBB)
{
  DoSomethingBBB();
}
else // if (pattern == CCC)
{
  DoSomethingCCC();
}
dodgy_coder
sumber
4
Atau lebih baik, "pattern.doSomething ()" dan biarkan OO melakukan tugasnya.
Paul Tomblin