Misalnya, apakah Anda lebih suka one-liner ini
int median(int a, int b, int c) {
return (a<b) ? (b<c) ? b : (a<c) ? c : a : (a<c) ? a : (b<c) ? c : b;
}
atau solusi if / else yang melibatkan beberapa pernyataan pengembalian?
Kapan ?:
tepat, dan kapan tidak? Haruskah itu diajarkan atau disembunyikan dari pemula?
operators
conditions
FredOverflow
sumber
sumber
Jawaban:
Tidak, itu adalah berkah.
Ketika itu sesuatu yang sangat sederhana, Anda tidak ingin membuang banyak baris.
Ketika keterbacaan dan kejelasan kode menderita dan potensi kesalahan melalui peningkatan perhatian yang tidak memadai, misalnya, dengan banyak operator rantai, seperti dalam contoh Anda.
Tes lakmus adalah ketika Anda mulai meragukan kode Anda mudah dibaca dan dipelihara dalam jangka panjang. Maka jangan lakukan itu.
sumber
myVar = someExpression ? false : true;
(someExpression ? var1 : var2)++
:-)Saya pikir operator ternary yang tidak diuji (yaitu, pernyataan di mana ia digunakan hanya sekali) baik-baik saja, tetapi jika Anda bersarang lebih dari satu, itu menjadi agak sulit dibaca.
sumber
Kapan itu tepat?
dan kapan bukan?
Jika Anda memiliki logika atau panggilan fungsi di dalam ekspresi ternary, Anda membuatnya mengerikan untuk melihatnya.
sumber
Satu perbedaan yang (saya pikir) tidak ada yang tunjukkan adalah jika-selain tidak bisa mengembalikan nilai, sedangkan operator ternary bisa.
Berasal dari F #, saya terkadang suka menggunakan operator ternary untuk meniru pencocokan pola.
vs.
sumber
var res = function() {switch(input) {case 1: return "1"; case 2: return "2"; ...}}()
untuk meniru switch sebagai ekspresi.expression
danstatement
tapi saya selalu khawatir saya akan mendapatkannya dengan cara yang salah dan mempermalukan diri sendiri :)const
variabel yang tidak dapat diubah nanti.Contoh (IMHO) dari penggunaan yang valid:
Ini menghasilkan kode yang lebih mudah dibaca daripada memiliki 2 pernyataan cetak yang berbeda. Contoh bersarang tergantung: (dapat dimengerti? Ya: tidak)
sumber
Sama sekali tidak jahat. Sebenarnya, itu murni , dan jika-maka-tidak.
Dalam bahasa fungsional seperti Haskell, F #, ML dll., Pernyataan if-then-else yang dianggap jahat.
Alasan untuk ini adalah bahwa "tindakan" apa pun seperti pernyataan imperatif if-then-else mengharuskan Anda untuk memisahkan deklarasi variabel dari definisinya, dan memperkenalkan status ke fungsi Anda.
Misalnya, dalam kode berikut:
vs.
Yang pertama memiliki dua keunggulan selain lebih pendek:
x
adalah konstan, dan karenanya menawarkan lebih sedikit kesempatan untuk memperkenalkan bug, dan berpotensi dapat dioptimalkan dengan cara yang kedua tidak pernah bisa.x
perlu tipeParity
.Yang membingungkan, dalam bahasa fungsional, operator ternary sering disebut if-then-else. Di Haskell, Anda mungkin berkata
x = if n mod 3 == 1 then Odd else Even
.sumber
Ekspresi khusus itu membuat mataku sakit; Saya akan mengecam pengembang apa pun di tim saya yang menggunakannya karena itu tidak dapat dipelihara.
Operator ternary tidak jahat jika digunakan dengan baik. Mereka bahkan tidak harus menjadi satu baris; Yang panjang yang diformat dengan baik bisa sangat jelas dan mudah dimengerti:
Saya suka itu lebih baik daripada rantai if / then / else yang setara:
Saya akan memformat ulang mereka menjadi:
jika kondisi dan tugas memungkinkan penyelarasan mudah. Tetap saya lebih suka versi terner karena lebih pendek dan tidak memiliki banyak kebisingan di sekitar kondisi dan tugas.
sumber
ReSharper di VS.NET terkadang menyarankan untuk mengganti
if...else
dengan?:
operator.Tampaknya ReSharper hanya menyarankan jika kondisi / blok di bawah tingkat kompleksitas tertentu, jika tidak maka akan tetap bertahan
if...else
.sumber
Ini dapat diformat ulang agar tampak sama bagusnya dengan kombinasi if / else:
Tetapi masalahnya adalah bahwa saya tidak begitu yakin apakah saya mendapat lekukan yang benar untuk mewakili apa yang sebenarnya akan terjadi. :-)
sumber
if-else
struktur yang setara . Kuncinya adalah pemformatan.Jauh dari kejahatan, operator ternary adalah anugerah.
Ini sangat berguna ketika Anda ingin membuat keputusan dalam ekspresi bersarang . Contoh klasiknya adalah panggilan fungsi:
Dalam contoh khusus Anda, ternary hampir serampangan, karena itu adalah ekspresi tingkat atas di bawah a
return
. Anda dapat mengangkat persyaratan ke tingkat pernyataan tanpa menduplikasi apa pun selainreturn
kata kunci.NB Tidak akan ada yang membuat algoritma khusus untuk median mudah dibaca.
sumber
printf("I see %d evil construct%s in this program\n", n, "s" unless (n == 1) "s");
Di samping argumen "Jahat", dalam pengalaman saya, saya telah menemukan korelasi yang tinggi antara seorang programmer yang menggunakan operator ternary dan kemungkinan seluruh basis kode menjadi sulit untuk dibaca, diikuti, dan dipelihara (jika tidak langsung tidak berdokumen). Jika seorang programmer lebih peduli dengan menyimpan beberapa baris karakter 1-2 daripada seseorang yang dapat memahami kode nya, maka setiap kebingungan kecil memahami pernyataan ternary biasanya adalah puncak gunung es.
Operator ternary menarik angka ajaib seperti s ** t menarik lalat.
Jika saya sedang mencari perpustakaan Open Source untuk memecahkan masalah tertentu, dan saya melihat kode seperti operator ternary poster asli dalam kandidat untuk kata perpustakaan, lonceng peringatan akan mulai berbunyi di kepala saya dan saya akan mulai mempertimbangkan untuk pindah ke beberapa proyek lain untuk meminjam.
sumber
Berikut ini adalah contoh dari ketika adalah kejahatan:
Ini membingungkan dan boros. Kompiler dapat mengoptimalkan ekspresi kedua (oldValue = oldValue), tetapi mengapa koder melakukan ini di tempat pertama?
Doozy lain:
Beberapa orang tidak dimaksudkan untuk menjadi pembuat kode ...
Greg mengatakan itu setara jika pernyataannya 'berisik'. Itu jika Anda menulisnya dengan berisik. Tetapi itu sama jika dapat ditulis sebagai:
Yang tidak ribut dari ternary. Saya ingin tahu apakah jalan pintas ternary; apakah semua ekspresi dapat dievaluasi?
sumber
if (x != 0) x = 0;
...Jahat? Lihat, mereka hanya berbeda.
if
adalah sebuah pernyataan.(test ? a : b)
adalah sebuah ekspresi. Mereka bukan hal yang sama.Ekspresi ada untuk mengekspresikan nilai. Pernyataan ada untuk melakukan tindakan. Ekspresi dapat muncul di dalam pernyataan, tetapi tidak sebaliknya. Jadi, Anda dapat menggunakan ekspresi ternary dalam ekspresi lain, seperti untuk istilah dalam penjumlahan, atau untuk argumen ke metode, dan sebagainya. Anda tidak harus , tetapi Anda bisa jika mau . Tidak ada yang salah dengan itu. Beberapa orang mungkin mengatakan itu jahat, tapi itu pendapat mereka.
Salah satu nilai dari ekspresi ternary adalah membuat Anda menangani kasus benar dan salah.
if
pernyataan tidak.Jika Anda khawatir tentang keterbacaan, Anda dapat memformatnya agar dapat dibaca.
Entah bagaimana "jahat" masuk ke kosa kata pemrograman. Saya ingin tahu siapa yang pertama menjatuhkannya. (Sebenarnya, saya punya tersangka - dia ada di MIT.) Saya lebih suka kita memiliki alasan obyektif untuk penilaian nilai dalam bidang ini, bukan hanya selera dan panggilan nama orang.
sumber
Itu punya tempat. Saya telah bekerja di banyak perusahaan di mana tingkat keterampilan pengembang berkisar dari mengerikan hingga penyihir. Karena kode harus dipelihara, dan saya tidak akan berada di sana selamanya, saya mencoba menulis hal-hal sehingga terlihat seperti miliknya di sana (tanpa melihat komentar dengan inisial saya, sangat jarang bagi Anda untuk dapat lihat kode yang telah saya kerjakan untuk melihat di mana saya membuat perubahan), dan seseorang dengan keterampilan kurang dari saya dapat mempertahankannya.
Sementara operator ternary terlihat nitziffic dan keren, pengalaman saya adalah bahwa baris kode tidak mungkin dipertahankan. Di perusahaan saya saat ini, kami memiliki produk yang telah dikirim selama hampir 20 tahun. Saya tidak akan menggunakan contoh itu di mana pun.
sumber
Saya tidak berpikir bahwa operator ternary itu jahat.
Tapi di sini ada gotcha yang membuatku bingung. Saya adalah seorang programmer C untuk banyak (10+) dan pada akhir 1990-an saya pindah ke pemrograman aplikasi berbasis web. Sebagai seorang programmer web, saya segera berlari di PHP yang juga memiliki operator ternary. Saya memiliki bug dalam program PHP yang akhirnya saya telusuri ke baris kode dengan operator ternary bersarang. Ternyata operator ternary PHP terkait dari kiri ke kanan tetapi operator ternary C (yang dulu saya kenal) mengaitkan kanan ke kiri.
sumber
Apa pun yang membuat kode Anda lebih buruk adalah jahat.
Jika Anda menggunakan ternary untuk membuat kode Anda lebih bersih, maka pastikan menggunakannya. Terkadang dalam php seperti itu bagus untuk melakukan penggantian inline, misalnya
Itu menghemat beberapa baris, dan itu cukup jelas, tetapi contoh Anda membutuhkan setidaknya pemformatan yang lebih baik untuk menjadi jelas, dan ternary tidak benar-benar baik untuk multi-line, maka Anda mungkin juga menggunakannya jika / selain itu.
sumber
Bisakah saya mengatakannya? Saya tidak dapat menemukan aplikasi jahat operasi ternary ini :
Tolong ampun, reputasi saya sudah cukup menyedihkan.
sumber
Kemenangan terbesar: Menunjukkan bahwa ada satu target aksi.
Ada dua jalur kode yang dapat Anda ikuti, dan pembaca harus membaca dengan cermat untuk melihat dua variabel yang sedang diatur. Dalam hal ini, itu hanya satu variabel, tetapi pembaca memiliki lebih banyak membaca untuk mencari tahu. Bagaimanapun, bisa jadi ini:
Dengan operator ternary, jelas bahwa hanya satu variabel yang ditetapkan.
Pada level yang paling rendah, ini adalah prinsip KERING (Jangan Ulangi Diri Sendiri) pada dasarnya. Jika Anda
$foo
hanya dapat menentukan sekali, lakukan saja.sumber
Jika ... maka ... lain cenderung menekankan kondisi dan karenanya tidak menekankan operasi yang dilakukan secara kondisional.
operator ternary adalah kebalikannya, ia cenderung menyembunyikan kondisi dan karenanya berguna ketika operasi yang dilakukan lebih penting daripada kondisi itu sendiri.
Ada gangguan teknis minor, dalam beberapa bahasa, bahwa mereka tidak cukup saling dipertukarkan karena satu menjadi pernyataan dan satu ekspresi misalnya konstelasi inisialisasi kondisional dalam C ++
sumber
Saya pikir ketika mengembangkan untuk sekelompok orang yang homogen, tidak ada masalah tetapi ketika Anda harus berurusan dengan orang-orang yang menangani level yang berbeda, oneliners semacam ini hanya memperkenalkan level kompleks lebih lanjut pada kode. Jadi, kebijakan saya tentang masalah ini adalah: kode jelas dan jangan jelaskan daripada kode pendek dan jelaskan 123123 kali.
Saya seharusnya tidak diajari untuk pemula, lebih memilih mereka untuk mencari tahu ketika perlu muncul, jadi itu akan digunakan hanya ketika diperlukan dan tidak setiap kali Anda membutuhkan jika.
sumber
IMO, operator itu sendiri tidak jahat, tetapi sintaks yang digunakan untuk itu dalam C (dan C ++) terlalu singkat. IMO, Algol 60 melakukannya dengan lebih baik, jadi sesuatu seperti ini:
akan terlihat lebih seperti ini (tetapi secara umum tetap menggunakan sintaksis mirip-C):
Bahkan dengan itu, bersarang yang terlalu dalam dapat menyebabkan masalah dengan keterbacaan, tetapi setidaknya A) siapa pun yang melakukan pemrograman sama sekali dapat mengetahuinya dengan sederhana, dan B) orang yang memahaminya dapat menangani sarang yang jauh lebih dalam dengan cukup mudah. OTOH, saya juga mencatat bahwa dalam LISP (misalnya) a
cond
cukup banyak seperti pernyataan ternary - bukan seperangkat pernyataan, tetapi satu ekspresi menghasilkan nilai (sekali lagi, sebagian besar LISP seperti itu .. .)sumber
A = (x==y) ? B : C
Sebuah toko yang secara teratur menulis metode 600-1200-line seharusnya tidak memberi tahu saya bahwa ternary "sulit untuk dipahami". Setiap toko yang secara teratur mengizinkan lima kondisi untuk mengevaluasi cabang kode tidak boleh memberi tahu saya bahwa kondisi yang diringkas secara konkret di suatu terner adalah "sulit dibaca".
sumber
Kapan?: Tepat, dan kapan tidak?
Haruskah itu diajarkan atau disembunyikan dari pemula?
Tidak masalah, tetapi tidak boleh disembunyikan dengan sengaja karena tidak terlalu rumit untuk dipelajari oleh seorang "pemula".
sumber
Dalam contoh Anda:
sangat mudah dibaca, dan jelas. Variabel antara <<adalah nilai kembali.
Memperbarui
sama, tetapi lebih sedikit baris kode. Masih sederhana menurut saya.
sumber
Itu juga perlu untuk const
sumber
const
begitu dalam bahasa tertentu. Dalam C #const
harus selalu kompilasi nilai diketahui waktu. yang berarticonst int nLegs = isChicken ? 2: 4 ;
tidak akan bekerja, tetapiconst int nLegs = true ? 2: 4 ;
akan