Apa keuntungan dan kerugian dari operator?: Dibandingkan dengan pernyataan standar if-else. Yang jelas adalah:
Bersyarat?: Operator
- Lebih pendek dan lebih ringkas saat menangani perbandingan dan penugasan nilai langsung
- Tampaknya tidak sefleksibel konstruksi if / else
Standar If / Else
- Dapat diterapkan ke lebih banyak situasi (seperti panggilan fungsi)
- Seringkali terlalu panjang
Keterbacaan tampaknya bervariasi untuk masing-masing tergantung pada pernyataannya. Untuk beberapa saat setelah pertama kali terpapar ke operator?:, Saya butuh beberapa waktu untuk mencerna persis bagaimana cara kerjanya. Apakah Anda akan merekomendasikan untuk menggunakannya sedapat mungkin, atau tetap menggunakan if / else mengingat saya bekerja dengan banyak non-programmer?
c#
conditional-operator
KChaloux
sumber
sumber
SomeCheck() ? DoFirstThing() : DoSecondThing();
- Anda harus menggunakan ekspresi untuk mengembalikan nilai.Jawaban:
Saya pada dasarnya akan merekomendasikan menggunakannya hanya ketika pernyataan yang dihasilkan sangat pendek dan mewakili peningkatan yang signifikan dalam keringkasan di atas setara if / else tanpa mengorbankan keterbacaan.
Contoh yang baik:
Contoh buruk:
sumber
return
menjadi bagian dari hasil operasi terner. Misalnya:check() ? return 1 : return 0;
tidak akan berhasil, tetapireturn check() ? 1 : 0;
akan. Selalu menyenangkan menemukan keanehan kecil ini dalam pemrograman.Ini cukup banyak tercakup oleh jawaban lain, tetapi "itu adalah ekspresi" tidak benar-benar menjelaskan mengapa itu sangat berguna ...
Dalam bahasa seperti C ++ dan C #, Anda dapat menentukan bidang hanya baca lokal (dalam badan metode) menggunakannya. Ini tidak mungkin dilakukan dengan pernyataan if / then konvensional karena nilai bidang hanya baca harus ditetapkan dalam pernyataan tunggal tersebut:
tidak sama dengan:
Dengan cara yang sama Anda bisa menyematkan ekspresi tersier di kode lain. Selain membuat kode sumber lebih ringkas (dan dalam beberapa kasus lebih mudah dibaca), ini juga dapat membuat kode mesin yang dihasilkan lebih ringkas dan efisien:
... mungkin menghasilkan lebih sedikit kode daripada harus memanggil metode yang sama dua kali:
Tentu saja, ini juga bentuk yang lebih nyaman dan ringkas (lebih sedikit mengetik, lebih sedikit pengulangan, dan dapat mengurangi kemungkinan kesalahan jika Anda harus menduplikasi potongan kode di if / else). Dalam kasus "pola umum" bersih seperti ini:
... itu hanya lebih cepat untuk membaca / parse / memahami (setelah Anda terbiasa) daripada bertele-tele jika / lain setara, sehingga dapat membantu Anda untuk 'grok' kode lebih cepat.
Tentu saja, hanya karena berguna tidak berarti itu adalah hal terbaik untuk digunakan dalam setiap kasus. Saya menyarankan hanya menggunakannya untuk potongan kode pendek di mana artinya jelas (atau dibuat lebih jelas) dengan menggunakan
?:
- jika Anda menggunakannya dalam kode yang lebih kompleks, atau menyarangkan operator terner satu sama lain, itu dapat membuat kode sangat sulit untuk dibaca .sumber
const
adalah konstan, yaitu tidak dapat diubah setelah pernyataan yang dideklarasikan telah dieksekusi.readonly
? Saya selalu berpikirconst
berarti " diselesaikan pada waktu kompilasi dan sejalan di mana saja digunakan ".Saya biasanya memilih operator terner ketika saya memiliki banyak kode duplikat sebaliknya.
Dengan operator terner, ini dapat dilakukan dengan yang berikut ini.
sumber
aVal = a > 0 ? a : -a; answer = compute(aVal,b,c,d,e);
Terutama jikab
,c
,d
dane
diperlukan pengobatan juga.compute(...)
adalaha > 0 ? a : -1
, yang semuanya dievaluasi secara terpisah dari argumen lain yang dipisahkan koma. Bagaimanapun, sayangnya C ++ tidak memiliki notasi yang diajukan pertanyaan Anda untuk menangani "tuple" dari nilai yang dipisahkan koma, jadi bahkana > 0 ? (a, b, c, d, e) : (-a, b, c, d, e)
ilegal, dan tidak ada yang sangat mirip yang berfungsi tanpa perubahan padacompute
dirinya sendiri.Saya merasa sangat membantu ketika melakukan pengembangan web jika saya ingin menetapkan variabel ke nilai yang dikirim dalam permintaan jika itu ditentukan atau ke beberapa nilai default jika tidak.
sumber
Penggunaan yang sangat keren adalah:
sumber
foo
salah, maka semuanya akan dievaluasi menjadi 4 tanpa melakukan tes lainnya.Operator bersyarat sangat bagus untuk kondisi pendek, seperti ini:
Saya menggunakannya sesekali karena waktu yang dibutuhkan untuk menulis sesuatu yang lebih sedikit ... sayangnya, percabangan ini terkadang dapat terlewatkan oleh pengembang lain yang menjelajahi kode Anda. Plus, kode biasanya tidak sesingkat itu, jadi saya biasanya membantu keterbacaan dengan meletakkan? dan: pada baris terpisah, seperti ini:
Namun, keuntungan besar menggunakan blok if / else (dan mengapa saya lebih suka mereka) adalah lebih mudah untuk masuk nanti dan menambahkan beberapa logika tambahan ke cabang,
atau tambahkan ketentuan lain:
Jadi, pada akhirnya, ini tentang kenyamanan untuk Anda sekarang (lebih singkat untuk digunakan:?) Vs. kenyamanan untuk Anda (dan orang lain) nanti. Ini adalah keputusan pengadilan ... tetapi seperti semua masalah pemformatan kode lainnya, satu-satunya aturan yang sebenarnya adalah konsisten, dan secara visual sopan kepada mereka yang harus mempertahankan (atau menilai!) Kode Anda.
(semua kode disusun oleh mata)
sumber
Satu hal yang perlu dikenali saat menggunakan operator terner bahwa itu adalah ekspresi, bukan pernyataan.
Dalam bahasa fungsional seperti skema, perbedaannya tidak ada:
(if (> ab) ab)
Kondisional?: Operator "Sepertinya tidak sefleksibel yang dibangun if / else"
Dalam bahasa fungsional itu.
Ketika memprogram dalam bahasa imperatif, saya menerapkan operator terner dalam situasi di mana saya biasanya akan menggunakan ekspresi (tugas, pernyataan bersyarat, dll).
sumber
Meskipun jawaban di atas valid, dan saya setuju dengan pentingnya keterbacaan, ada 2 hal yang perlu dipertimbangkan:
Ini membuatnya sangat ringkas untuk menggunakan terner:
Jika Anda memiliki tipe
T1
danT2
keduanya dapat secara implisit dikonversiT
, maka di bawah ini tidak berfungsi:(karena kompilator mencoba menentukan jenis ekspresi terner, dan tidak ada konversi antara
T1
danT2
.)Di sisi lain,
if/else
versi di bawah ini berfungsi:karena
T1
diubah menjadiT
dan begitu jugaT2
sumber
Terkadang hal itu dapat membuat penetapan nilai bool lebih mudah dibaca pada pandangan pertama:
sumber
Jika saya menetapkan nilai dan saya tahu itu akan selalu menjadi satu baris kode untuk melakukannya, saya biasanya menggunakan operator terner (bersyarat). Jika ada kemungkinan kode dan logika saya akan berubah di masa mendatang, saya menggunakan if / else karena lebih jelas bagi programmer lain.
Yang menarik bagi Anda lebih lanjut mungkin ?? operator .
sumber
Keuntungan dari operator bersyarat adalah bahwa ini adalah operator. Dengan kata lain, ini mengembalikan nilai. Karena
if
merupakan pernyataan, ia tidak dapat mengembalikan nilai.sumber
Saya akan merekomendasikan untuk membatasi penggunaan operator terner (? :) menjadi satu baris tugas sederhana jika / lain logika. Sesuatu yang menyerupai pola ini:
Dapat dengan mudah diubah menjadi:
Saya akan menghindari penggunaan operator terner dalam situasi yang memerlukan if / else if / else, bersarang if / else, atau logika cabang if / else yang menghasilkan evaluasi beberapa baris. Menerapkan operator terner dalam situasi ini kemungkinan besar akan menghasilkan kode yang tidak dapat dibaca, membingungkan, dan tidak dapat diatur. Semoga ini membantu.
sumber
Ada beberapa keuntungan kinerja menggunakan? operator misalnya. MS Visual C ++, tetapi ini benar-benar hal yang spesifik untuk kompiler. Kompilator sebenarnya dapat mengoptimalkan cabang bersyarat dalam beberapa kasus.
sumber
Skenario yang paling saya temukan sendiri menggunakannya adalah untuk nilai default dan terutama dalam pengembalian
Itu benar-benar satu-satunya tempat yang menurutku bagus, tapi untuk mereka aku lakukan.
Meskipun jika Anda mencari boolean, ini terkadang terlihat seperti hal yang tepat untuk dilakukan:
Karena sangat mudah dibaca dan dipahami, tetapi gagasan itu harus selalu dilemparkan agar lebih jelas:
sumber
Jika Anda membutuhkan banyak cabang dengan kondisi yang sama, gunakan if:
Jika Anda membutuhkan banyak cabang dengan kondisi berbeda, maka jika jumlah pernyataan akan semakin bertambah, Anda akan ingin menggunakan terner:
Selain itu, Anda dapat menggunakan operator terner dalam inisialisasi.
Melakukannya dengan if sangat berantakan:
Anda tidak dapat menempatkan inisialisasi di dalam if / else, karena ini mengubah cakupan. Tetapi referensi dan variabel konst hanya dapat diikat saat inisialisasi.
sumber
Operator terner dapat dimasukkan dalam nilai r, sedangkan jika-maka-lain tidak bisa; di sisi lain, if-then-else dapat mengeksekusi loop dan pernyataan lain, sedangkan operator terner hanya dapat mengeksekusi (kemungkinan void) rvalues.
Di catatan terkait, && dan || operator mengizinkan beberapa pola eksekusi yang lebih sulit diimplementasikan dengan if-then-else. Misalnya, jika seseorang memiliki beberapa fungsi untuk dipanggil dan ingin mengeksekusi sepotong kode jika ada yang gagal, itu dapat dilakukan dengan baik menggunakan operator &&. Melakukannya tanpa operator itu akan membutuhkan kode yang berlebihan, goto, atau variabel bendera tambahan.
sumber
Dengan C # 7 , Anda dapat menggunakan fitur ref lokal baru untuk menyederhanakan penetapan kondisional variabel yang kompatibel dengan ref. Jadi sekarang, Anda tidak hanya dapat melakukan:
... tetapi juga yang sangat luar biasa:
Baris kode tersebut memberikan nilai
a
ke salah satub
atauc
, bergantung pada nilaii
.Catatan
1. nilai-r adalah sisi kanan dari suatu tugas, nilai yang diberikan.
2. Nilai-l adalah sisi kiri tugas, variabel yang menerima nilai yang ditetapkan.
sumber