Mana yang akan dianggap lebih dapat dipertahankan?
if (a == b) c = true; else c = false;
atau
c = (a == b);
Saya sudah mencoba mencari di Kode Lengkap, tetapi tidak dapat menemukan jawaban.
Saya pikir yang pertama lebih mudah dibaca (Anda benar-benar dapat membacanya keras-keras), yang saya pikir membuatnya lebih mudah dikelola. Yang kedua tentu saja lebih masuk akal dan mengurangi kode, tapi saya tidak yakin itu bisa dipertahankan untuk pengembang C # (saya berharap untuk melihat idiom ini lebih dalam, misalnya, Python).
.net
code-quality
readability
maintainability
clean-code
Bret Walker
sumber
sumber
else c = false
untuk yang pertama atau membuat penugasan||=
dalam yang kedua.c = a==b ? true : false;
Jawaban:
Opsi kedua lebih baik.
Ada alasan yang pasti untuk waspada terhadap pintasan pemrograman yang cerdik yang mengganggu pemeliharaan dengan mengaburkan maksud kode. Jadi, saya tidak menyalahkan Anda karena mengajukan pertanyaan.
Namun, saya tidak menganggapnya
c = (a == b);
sebagai contoh trik cerdas. Ini adalah representasi langsung dari konsep sederhana. Sejujur yang Anda bisa.Sebuah tepat, "dipelihara" format contoh pertama Anda (tanpa kawat gigi hilang dan satu baris membangun, yang saya lakukan mempertimbangkan jalan pintas pintar) akan menghasilkan kode ini:
Dalam pengalaman saya, menulis logika boolean sederhana sedemikian verbose, rawan kesalahan adalah tanda kode "rapuh". Ini akan membuat saya bertanya-tanya bagaimana logika yang lebih kompleks sedang ditangani dalam basis kode ini.
sumber
Pertama, sadari bahwa kedua bentuk Anda tidak setara.
c
akan disetel ke true jikaa
sama denganb
, dan jika tidak, nilainya akan tetap apa pun yang sudah ada.c
akan disetel ke true jikaa
sama denganb
, dan jika tidak, itu akan disetel ke false.Jika Anda ingin yang setara dengan bentuk kedua, dengan gaya bentuk pertama, Anda perlu menulis seperti ini:
Sekarang sudah jelas mana dari keduanya yang lebih mudah dibaca, lebih dapat dipelihara, dan lebih kecil kemungkinannya untuk memperkenalkan bug jika ada perubahan. Tetap dengan bentuk kedua.
sumber
Saya tidak setuju bahwa formulir pertama Anda lebih mudah dibaca - tentu saja bukan C # yang idiomatis untuk memiliki dua pernyataan pada satu baris, dan tidak disarankan untuk memiliki
if
pernyataan tanpa menggunakan kawat gigi.Kedua, saya tidak melihat bagaimana bentuk kedua kurang bisa dipertahankan - tidak ada yang perlu dipertahankan. Ini adalah pernyataan sederhana tentang hubungan antara
a
danb
dan itu tidak bisa diungkapkan dengan lebih sederhana.Alasan lain untuk memilih bentuk kedua adalah bahwa Anda dapat mendeklarasikan
c
dan menetapkannya dalam satu pernyataan yaituMemodifikasi variabel dapat dengan mudah menyebabkan kesalahan, jadi saya akan menghindarinya. Menggunakan
if
pernyataan membutuhkan variabel yang harus dideklarasikan sebelum bersyarat dan kemudian dimodifikasi.sumber
Another reason to prefer the second form is that you can declare c and assign it in a single statement
""lebih bisa dipelihara" bisa sangat subyektif.
Saya biasanya lebih suka keterbacaan dan niat daripada pengurangan kode. Saya pikir Anda menyimpan 8 karakter yang diketik dengan menggunakan formulir dikurangi.
Membawa bahasa dan budaya di sekitar bahasa adalah karakteristik 'keterbacaan' menurut saya.
Ada kalanya kinerja dapat menyebabkan pengurangan kode untuk mengoptimalkan kode byte yang dihasilkan, tetapi itu harus dilakukan dengan hati-hati setelah beberapa profil.
sumber
Kedua. Ini memiliki pengulangan kurang (KERING) dan lebih mudah untuk memahami apa yang terjadi, yang
c
memegang nilai apakah atau tidaka
danb
sama.IMHO, bahkan lebih baik
Sama seperti saya akan menulis
1 + 2 + 3
dari pada((1 + 2) + 3)
5 + 3 * 7
dari pada(5 + (3 * 7))
Jelas dan sepele kode yang tidak perlu bukanlah suatu kebajikan. Itu berantakan.
sumber
Pemilih yang kurang, jelaskan apa yang salah dengan jawaban saya yang telah direvisi.
Ya,
c = (a == b);
bisa sulit dibaca (lebih buruk lagi, StyleCop mengeluh tentang tanda kurung yang tidak perlu), tapi saya masih suka kesederhanaana == b
. Oleh karena itu, di sini adalah apa yang saya ingin menggunakan ketika keduaa
danb
adalah sama:Dan kemudian Anda dapat melakukan:
this.c = this.NoPeriod
alih-alih:sumber
return this.MyWaveLength = this.HerWaveLength;
ataureturn this.MyWaveLength == this.HerWaveLength;
sebaliknya?c = (a == b);
tidak rawan kesalahan. Bentuk pertama dalam pertanyaan awal adalah cara yang lebih rentan kesalahan , seperti yang ditunjukkan oleh OP sendiri yang harus mengedit pertanyaannya untuk memperbaiki bug!