Saya pribadi penganjur operator ternary: ()? :; Saya menyadari bahwa ini memiliki tempatnya, tetapi saya telah menemukan banyak programmer yang benar-benar menentang untuk menggunakannya, dan beberapa yang menggunakannya terlalu sering.
Apa perasaan Anda? Kode menarik apa yang Anda lihat menggunakannya?
Pendukung sesuatu adalah orang yang mendukung hal itu.
Doug McClean
8
Gunakan ketika sudah jelas, hindari ketika itu membingungkan. Itu panggilan penghakiman. Itu dapat membuat kode lebih mudah dibaca, tetapi hanya untuk ekspresi sederhana. Mencoba untuk selalu menggunakannya sama saja dengan ancaman tanpa henti menghindarinya.
Saya kadang-kadang menggunakan x = x if x else ytetapi kemudian bertanya tentang hal itu dan menyadari dengan bantuan orang lain bahwa itu benar-benar hanya berkurang menjadi x = x atau y ( stackoverflow.com/questions/18199381/self-referencing-ternary/… )
Scruffy
4
Pertanyaan seperti ini seharusnya tidak dianggap tidak konstruktif.
Ungeheuer
Jawaban:
243
Gunakan hanya untuk ekspresi sederhana :
int a = (b > 10) ? c : d;
Jangan membuat rantai atau membuat operator ternary karena sulit dibaca dan membingungkan:
int a = b > 10 ? c < 20 ? 50 : 80 : e == 2 ? 4 : 8;
Selain itu, ketika menggunakan operator ternary, pertimbangkan memformat kode sedemikian rupa sehingga meningkatkan keterbacaan:
Sepenuhnya setuju dengan beberapa pernyataan pertama tetapi sama sekali tidak setuju dengan contoh Anda tentang "peningkatan keterbacaan". Jika Anda menggunakan multi-line mengapa tidak menggunakan pernyataan if?
Joe Phillips
3
hanya karena jika tidak, ini adalah kata kerja yang cukup banyak untuk keputusan sederhana: int a = 0; if (b> 10) a = some_value; selain itu a = nilai_lainnya; Apa yang Anda sukai?
marcospereira
44
@ d03boy: Karena jika-pernyataan hanya itu, sebuah pernyataan, dan tidak akan melakukan ketika yang Anda inginkan hanyalah sebuah ekspresi.
Falstro
2
@roe dalam beberapa bahasa jika adalah ekspresi (misalnya dalam Scala), jadi val x = if(true) 0 else 1sangat legal
om-nom-nom
5
@ om-nom-nom dalam hal ini, yang akan menjadikannya ekspresi if, bukan pernyataan if, dan pada dasarnya adalah hal yang sama dengan operator?: -.
falstro
141
Itu membuat debugging sedikit lebih sulit karena Anda tidak dapat menempatkan breakpoint pada masing-masing sub ekspresi. Saya jarang menggunakannya.
Itu argumen terbaik melawan operator ternary yang pernah saya dengar. Saya tidak membeli argumen "tidak dapat dibaca" (sepertinya bagi saya orang terlalu malas untuk membiasakan diri), tetapi ini sebenarnya memiliki substansi.
EpsilonVector
80
Saya suka mereka, terutama dalam bahasa yang aman.
Saya tidak melihat bagaimana ini:
int count = (condition) ? 1 : 0;
lebih sulit dari ini:
int count;
if (condition)
{
count = 1;
}
else
{
count = 0;
}
edit -
Saya berpendapat bahwa operator ternary membuat semuanya lebih kompleks dan lebih rapi daripada alternatifnya.
@obobobo ini if/elsedengan kawat gigi adalah bagaimana mayoritas programmer akan menulis ulang terner ..
Andre Figueiredo
1
@obobobo jika / lain tanpa kawat gigi hanya meminta masalah. Jauh terlalu mudah bagi seseorang untuk menambahkan baris, tetapi lupa bahwa itu akan membutuhkan kawat gigi untuk melakukan apa yang mereka harapkan (jalankan baris tambahan sebagai bagian dari blok): stackoverflow.com/a/381274/377225
George Marian
43
Dirantai aku baik-baik saja dengan - bersarang, tidak begitu banyak.
Saya cenderung menggunakannya lebih banyak di C hanya b / c mereka adalah pernyataan if yang memiliki nilai, sehingga mengurangi pengulangan atau variabel yang tidak perlu:
Saya suka contoh pertama Anda - saya tidak pernah berpikir untuk merantai mereka seperti itu sebelumnya. Terima kasih telah berbagi. =)
Erik Forbes
5
+1 Sebenarnya saya baru saja mulai melakukan itu. Saya bahkan benar-benar melakukannya untuk mengganti pernyataan switch.
Davy8
1
Contoh bagus @rampion.
ylluminate
39
?:Operator Ternary hanyalah setara fungsional dari ifkonstruksi prosedural . Jadi selama Anda tidak menggunakan ?:ekspresi bersarang , argumen untuk / terhadap representasi fungsional dari operasi apa pun berlaku di sini. Tetapi operasi terner bersarang dapat menghasilkan kode yang benar-benar membingungkan (latihan untuk pembaca: cobalah menulis parser yang akan menangani persyaratan bersarang ternary dan Anda akan menghargai kompleksitasnya).
Tetapi ada banyak situasi di mana penggunaan konservatif ?:operator dapat menghasilkan kode yang sebenarnya lebih mudah dibaca daripada sebaliknya. Sebagai contoh:
Karena kodenya lebih ringkas maka noise sintaksisnya lebih sedikit, dan dengan menggunakan operator ternary secara bijaksana (yang hanya terkait dengan properti reverseOrder ) hasil akhirnya tidak terlalu singkat.
saya masih akan menganjurkan menggunakan pujian pada setiap if / then / else konstruksi yang tidak ternary tho, jadi contoh kedua Anda kehilangan beberapa imho.
Kris
Ya, itu fungsional. Ini seperti fungsi kecil yang memiliki argumen boolean tunggal dan, mengembalikan tipe apa pun yang Anda inginkan! Sebenarnya operatornya rapi.
bobobobo
24
Ini masalah gaya, sungguh; aturan bawah sadar yang cenderung saya ikuti adalah:
Hanya mengevaluasi 1 ekspresi - jadi foo = (bar > baz) ? true : false, tetapi TIDAKfoo = (bar > baz && lotto && someArray.Contains(someValue)) ? true : false
Jika saya menggunakannya untuk logika tampilan, mis <%= (foo) ? "Yes" : "No" %>
Hanya benar-benar menggunakannya untuk penugasan; tidak pernah mengalir logika (jadi tidak pernah (foo) ? FooIsTrue(foo) : FooIsALie(foo)) Logika aliran dalam ternary itu sendiri adalah sebuah kebohongan, mengabaikan poin terakhir itu.
Saya menyukainya karena ringkas dan elegan untuk operasi penugasan sederhana.
Saya pikir sebagian besar bahasa tidak akan membiarkan Anda menggunakannya untuk aliran logika, sehingga Anda tidak bisa melakukan (foo)? Benar (foo): Salah (foo); kecuali itu tugas.
Henry B
Ups, ya Anda benar, salah saya.
Keith Williams
21
Dua contoh pertama Anda benar-benar buruk. Hasil perbandingan sudah merupakan nilai boolean, jadi operator ternary Anda tidak berguna dan hanya menyulitkan kode.
Trillian
1
@Trillian +1 Ya, seharusnya pergi dengan tugas yang berbeda. foo = (bar > baz);jauh lebih sederhana
Eric
18
Seperti banyak pertanyaan pendapat, jawabannya pasti: tergantung
Untuk sesuatu seperti:
return x ? "Yes" : "No";
Saya pikir itu jauh lebih ringkas (dan lebih cepat bagi saya untuk menguraikan) daripada:
if (x) {
return "Yes";
} else {
return "No";
}
Sekarang jika ekspresi kondisional Anda kompleks, maka operasi ternary bukanlah pilihan yang baik. Sesuatu seperti:
x && y && z >= 10 && s.Length == 0 || !foo
bukan kandidat yang baik untuk operator ternary.
Sebagai tambahan, jika Anda seorang programmer C, GCC sebenarnya memiliki ekstensi yang memungkinkan Anda untuk mengecualikan bagian if-true dari ternary, seperti ini:
/* 'y' is a char * */
const char *x = y ? : "Not set";
Yang akan ditetapkan xdengan yasumsi ytidak NULL. Barang bagus.
Memperbaiki sedikit sintaks dan tata bahasa prob, Sean :-) Hilang y dari bit kode terakhir dan "assign x to y" berarti "y = x", jadi saya chgd untuk "set x to y".
paxdiablo
@ Max: Terima kasih! Saya memutar kembali perubahan sintaksis karena saya mencoba menunjukkan bahwa dengan ekstensi GCC Anda tidak memerlukan bagian if-true dari ternary.
Sean Bright
Maaf, tidak melihat paragraf itu. Tidak tahu bahwa saya setuju dengan hal-hal semacam itu karena memungkinkan orang untuk menulis kode yang tidak dapat dikompilasi dengan kompiler standar ISO. Namun, ketika GCC adalah orang terakhir berdiri, yang tidak akan peduli :-)
paxdiablo
Itu voodoo, pasti ... Dan siapa yang tidak menggunakan GCC? : D
Sean Bright
14
Dalam pikiran saya, masuk akal untuk menggunakan operator ternary dalam kasus di mana ekspresi diperlukan.
Dalam kasus lain, sepertinya operator ternary mengurangi kejernihan.
masalahnya adalah 99% dari bahasa, ekspresi dapat diganti dengan fungsi ... dan ppl menghindari operator ternary bahkan akan lebih suka solusi itu.
PierreBdR
11
Dengan ukuran kompleksitas siklomatik , penggunaan ifpernyataan atau operator ternary adalah setara. Jadi dengan ukuran itu, jawabannya tidak , kompleksitasnya akan sama persis seperti sebelumnya.
Dengan langkah-langkah lain seperti keterbacaan, rawatan, dan KERING (Jangan-Ulangi-Sendiri), salah satu pilihan mungkin terbukti lebih baik daripada yang lain.
Saya sering menggunakannya di tempat-tempat di mana saya dibatasi untuk bekerja di sebuah konstruktor - misalnya, .NET 3.5 LINQ ke XML yang baru - untuk menetapkan nilai default ketika parameter opsional nol.
Contoh buatan:
var e = new XElement("Something",
param == null ? new XElement("Value", "Default")
: new XElement("Value", param.ToString())
);
atau (terima kasih asterite)
var e = new XElement("Something",
new XElement("Value",
param == null ? "Default"
: param.ToString()
)
);
Tidak masalah apakah Anda menggunakan operator ternary atau tidak, memastikan kode Anda dapat dibaca adalah hal yang penting. Setiap konstruksi dapat dibuat tidak dapat dibaca.
Atau ... var e = XElement baru ("Sesuatu", XElement baru ("nilai", param == null? "Default": param.toString ()));
asterite
2
Saya suka Anda memformatnya agar mudah dibaca, begitu banyak yang tidak.
bruceatk
Apa gunanya kode sumber yang bisa dibaca manusia jika tidak bisa dibaca manusia? =)
Erik Forbes
9
Saya menggunakan operator ternary di mana pun saya bisa, kecuali itu membuat kode sangat sulit dibaca, tapi kemudian itu biasanya hanya indikasi bahwa kode saya bisa menggunakan sedikit refactoring.
Itu selalu membingungkan saya bagaimana beberapa orang berpikir operator ternary adalah fitur "tersembunyi" atau agak misterius. Ini adalah salah satu hal pertama yang saya pelajari ketika saya memulai pemrograman di C, dan saya pikir itu tidak mengurangi keterbacaan sama sekali. Itu adalah bagian alami dari bahasa tersebut.
Saya sepenuhnya setuju. Tidak ada yang tersembunyi atau rumit tentang hal itu.
mmattax
2
Ini dapat menyebabkan masalah keterbacaan, terutama saat bersarang.
David Thornley
Saya pikir " sangat sulit dibaca" agak terlalu permisif, tetapi secara keseluruhan saya setuju dengan Anda. Tidak ada yang sulit atau mistis tentang itu.
EpsilonVector
7
Saya setuju dengan jmulder: ini tidak boleh digunakan sebagai ganti a if, tetapi memiliki tempat untuk ekspresi balik atau di dalam ekspresi:
Jika Anda menggunakan operator ternary untuk penugasan bersyarat sederhana, saya rasa tidak masalah. Saya telah melihatnya (ab) digunakan untuk mengontrol aliran program tanpa membuat tugas, dan saya pikir itu harus dihindari. Gunakan pernyataan if dalam kasus ini.
Saya pikir operator ternary harus digunakan saat dibutuhkan. Ini jelas merupakan pilihan yang sangat subyektif, tetapi saya menemukan bahwa ekspresi sederhana (khususnya sebagai ekspresi balik) jauh lebih jelas daripada tes penuh. Contoh dalam C / C ++:
return (a>0)?a:0;
Dibandingkan dengan:
if(a>0) return a;
else return 0;
Anda juga memiliki kasus di mana solusinya adalah antara operator ternary dan membuat fungsi. Misalnya dengan Python:
l = [ i if i > 0 else 0 for i in lst ]
Alternatifnya adalah:
def cap(value):
if value > 0:
return value
return 0
l = [ cap(i) for i in lst ]
Cukup diperlukan bahwa dalam Python (sebagai contoh), ungkapan seperti itu dapat dilihat secara teratur:
l = [ ((i>0 and [i]) or [0])[0] for i in lst ]
baris ini menggunakan properti dari operator logis dalam Python: mereka malas dan mengembalikan nilai terakhir yang dihitung jika sama dengan keadaan akhir.
Saya telah melihat binatang buas seperti itu (sebenarnya jauh lebih buruk karena itu valid tanggal dan diperiksa bulan dan hari juga, tapi saya tidak bisa repot-repot mencoba mengingat semuanya):
Bagaimana Anda bisa mengatakan serangkaian isolasi jika pernyataan akan lebih mudah dibaca? Saya membaca "binatang" Anda baik-baik saja . reportedAgeadalah contoh yang memerlukan beberapa perhitungan - mungkin karena ini lebih merupakan kasus tertentu daripada mencari tahuisThisYearALeapYear
Axeman
4
Sintaksnya mengerikan. Saya menemukan fungsional jika sangat berguna, dan sering membuat kode lebih mudah dibaca.
Saya akan menyarankan membuat makro untuk membuatnya lebih mudah dibaca, tapi saya yakin seseorang dapat datang dengan kasus tepi yang mengerikan (karena selalu ada dengan CPP).
banyak implementasi dan varian BASIC yang memiliki fungsi IF yang menggantikan operator ternary. Saya telah melihat sejumlah basis kode dengan yang didefinisikan sebagai makro dalam C.
Sparr
Yah, saya sedang memikirkan bahasa pemrograman fungsional, tapi ya.
Marcin
"Membuat makro agar lebih mudah dibaca," kamu cukup joker!
niXar
4
Saya suka menggunakan operator dalam kode debug untuk mencetak nilai kesalahan jadi saya tidak harus mencarinya sepanjang waktu. Biasanya saya melakukan ini untuk men-debug cetakan yang tidak akan tetap begitu saya selesai mengembangkan.
int result = do_something();
if( result != 0 )
{
debug_printf("Error while doing something, code %x (%s)\n", result,
result == 7 ? "ERROR_YES" :
result == 8 ? "ERROR_NO" :
result == 9 ? "ERROR_FILE_NOT_FOUND" :
"Unknown");
}
Saya hampir tidak pernah menggunakan operator ternary karena setiap kali saya DO menggunakannya, itu selalu membuat saya berpikir lebih banyak daripada yang harus saya lakukan nanti ketika saya mencoba untuk mempertahankannya.
Saya suka menghindari verbositas, tetapi ketika membuat kode lebih mudah untuk diambil, saya akan menggunakan verbositas.
Mempertimbangkan:
String name = firstName;
if (middleName != null) {
name += " " + middleName;
}
name += " " + lastName;
Nah, itu agak bertele-tele, tapi saya merasa lebih mudah dibaca daripada:
String name = firstName;
name += (middleName == null ? "" : " " + middleName);
name += " " + lastName;
Sepertinya memampatkan terlalu banyak informasi ke dalam ruang yang terlalu sedikit, tanpa memperjelas apa yang terjadi. Setiap kali saya melihat operator ternary digunakan, saya selalu menemukan alternatif yang sepertinya lebih mudah dibaca ... sekali lagi, itu adalah pendapat yang sangat subyektif, jadi jika Anda dan kolega Anda merasa ternary sangat mudah dibaca, lakukan saja.
Itu bukan hal yang persis sama. Dalam contoh kedua Anda mengompresi ketiga pernyataan menjadi satu baris. Itulah yang mengurangi keterbacaan, bukan operator ternary.
ilitirit
Cukup adil, saya memperbarui untuk memasukkan komentar Anda, tetapi masih saja terasa berantakan bagi saya ... tapi sekali lagi, ini subjektif ... Saya tidak mengatakan ternary tidak dapat dibaca, saya katakan itu tidak dapat dibaca oleh saya (99) % dari waktu)
Mike Stone
3
Hanya bila:
$ var = (simple> test? simple_result_1: simple_result_2);
Tentu saja di sebagian besar bahasa, Anda tidak akan memerlukan bagian "== true" dari terner itu.
Michael Haren
Saya menyadari bahwa, meskipun saya cenderung memasukkannya hanya untuk membuat kode lebih mudah dibaca karena kompiler harus mengoptimalkannya ke hal yang sama seperti tanpa == true anyways
KPexEA
di tidak ada bahasa yang bisa Anda mungkin perlu "== true"
Nixar
Saya mengalami kesulitan memutuskan apakah akan memilih atau tidak. Contohnya bagus tapi == BENAR adalah sesuatu yang saya tidak tahan melihat kode orang lain.
Peter Perháč
3
Seperti yang orang lain tunjukkan, mereka bagus untuk kondisi sederhana pendek. Saya terutama menyukai mereka untuk default (seperti | | dan atau penggunaan dalam javascript dan python), misalnya
int repCount = pRepCountIn ? *pRepCountIn : defaultRepCount;
Penggunaan umum lainnya adalah untuk menginisialisasi referensi dalam C ++. Karena referensi harus dideklarasikan dan diinisialisasi dalam pernyataan yang sama, Anda tidak dapat menggunakan pernyataan if.
Luar biasa bahwa ini adalah penyebutan referensi inisialisasi yang pertama, yang merupakan salah satu dari sedikit tempat di mana "jika" tidak dapat digunakan sebagai pengganti? (Saya kira karena ini bukan pertanyaan khusus C ++ ...) Mereka juga berguna dalam daftar inisialisasi konstruktor, untuk alasan yang sama.
j_random_hacker
2
Saya banyak memperlakukan operator ternary seperti GOTO. Mereka memiliki tempat mereka, tetapi mereka adalah sesuatu yang biasanya Anda hindari untuk membuat kode lebih mudah dimengerti.
wow, itu mengerikan! bayangkan bersarang beberapa dari mereka bersama-sama! Satu-satunya hal yang samar-samar berguna yang dapat saya lihat adalah jika Anda memiliki fungsi yang mengembalikan array 2-elemen: var Name = getNames () [Jenis Kelamin == 'm']; ... tapi itu bahkan KURANG terbaca!
nickf
2
Untuk kasing sederhana, saya suka menggunakannya. Sebenarnya jauh lebih mudah untuk membaca / kode misalnya sebagai parameter untuk fungsi atau hal-hal seperti itu. Juga untuk menghindari baris baru saya ingin tetap dengan semua if / else saya.
Neseting itu akan menjadi NO-NO besar di buku saya.
Jadi, melanjutkan, untuk satu jika / saya akan menggunakan operator ternary. Untuk kasus lain, regular jika / selain itu jika / else (atau switch)
Saya suka kasus khusus Groovy dari operator ternary, yang disebut operator Elvis:?:
expr ?: default
Kode ini mengevaluasi expr jika bukan nol, dan default jika itu adalah nol. Secara teknis itu sebenarnya bukan operator ternary, tapi pasti terkait dengannya dan menghemat banyak waktu / mengetik.
Untuk tugas-tugas sederhana seperti menetapkan nilai yang berbeda tergantung pada kondisi mereka bagus. Saya tidak akan menggunakannya ketika ada ekspresi yang lebih lama tergantung pada kondisinya.
Begitu banyak jawaban yang mengatakan, itu tergantung . Saya menemukan bahwa jika perbandingan ternary tidak terlihat dalam pemindaian cepat ke bawah kode, maka itu tidak boleh digunakan.
Sebagai masalah sampingan, saya mungkin juga mencatat bahwa keberadaannya sebenarnya sedikit aneh karena pada C, pengujian perbandingan adalah pernyataan. Di Icon, ifkonstruk (seperti kebanyakan Icon) sebenarnya adalah ekspresi. Jadi Anda dapat melakukan hal-hal seperti:
x[if y > 5 then 5 else y] := "Y"
... yang saya temukan jauh lebih mudah dibaca daripada operator perbandingan ternery. :-)
Ada diskusi baru-baru ini tentang kemungkinan menambahkan ?: operator ke Icon, tetapi beberapa orang dengan benar menunjukkan bahwa sama sekali tidak perlu karena cara ifkerjanya.
Yang berarti bahwa jika Anda bisa melakukannya dalam C (atau bahasa lain mana saja yang memiliki operator ternery), maka Anda sebenarnya tidak memerlukan operator ternery sama sekali.
Jika Anda dan rekan kerja Anda memahami apa yang mereka lakukan dan mereka tidak dibuat dalam kelompok besar saya pikir mereka membuat kode lebih kompleks dan lebih mudah dibaca karena hanya ada sedikit kode.
Satu-satunya waktu saya pikir operator ternary membuat kode lebih sulit untuk dipahami adalah ketika Anda memiliki lebih dari 3 atau 4 dalam satu baris. Kebanyakan orang tidak ingat bahwa mereka didahulukan berdasarkan hak dan ketika Anda memiliki setumpuk dari mereka itu membuat membaca kode mimpi buruk.
x = x if x else y
tetapi kemudian bertanya tentang hal itu dan menyadari dengan bantuan orang lain bahwa itu benar-benar hanya berkurang menjadi x = x atau y ( stackoverflow.com/questions/18199381/self-referencing-ternary/… )Jawaban:
Gunakan hanya untuk ekspresi sederhana :
Jangan membuat rantai atau membuat operator ternary karena sulit dibaca dan membingungkan:
Selain itu, ketika menggunakan operator ternary, pertimbangkan memformat kode sedemikian rupa sehingga meningkatkan keterbacaan:
sumber
val x = if(true) 0 else 1
sangat legalItu membuat debugging sedikit lebih sulit karena Anda tidak dapat menempatkan breakpoint pada masing-masing sub ekspresi. Saya jarang menggunakannya.
sumber
Saya suka mereka, terutama dalam bahasa yang aman.
Saya tidak melihat bagaimana ini:
lebih sulit dari ini:
edit -
Saya berpendapat bahwa operator ternary membuat semuanya lebih kompleks dan lebih rapi daripada alternatifnya.
sumber
const int count = ...;
if/else
dengan kawat gigi yang tidak dibutuhkan di sana.condition
adalahbool
Anda hanya bisa melakukanint count = condition;
if/else
dengan kawat gigi adalah bagaimana mayoritas programmer akan menulis ulang terner ..Dirantai aku baik-baik saja dengan - bersarang, tidak begitu banyak.
Saya cenderung menggunakannya lebih banyak di C hanya b / c mereka adalah pernyataan if yang memiliki nilai, sehingga mengurangi pengulangan atau variabel yang tidak perlu:
daripada
Dalam penugasan seperti ini, saya merasa kurang untuk refactor, dan lebih jelas.
Ketika saya bekerja di ruby di sisi lain, saya lebih cenderung menggunakan
if...else...end
karena itu juga ekspresi.(walaupun, diakui, untuk sesuatu yang sederhana ini, saya mungkin hanya menggunakan operator ternary).
sumber
?:
Operator Ternary hanyalah setara fungsional dariif
konstruksi prosedural . Jadi selama Anda tidak menggunakan?:
ekspresi bersarang , argumen untuk / terhadap representasi fungsional dari operasi apa pun berlaku di sini. Tetapi operasi terner bersarang dapat menghasilkan kode yang benar-benar membingungkan (latihan untuk pembaca: cobalah menulis parser yang akan menangani persyaratan bersarang ternary dan Anda akan menghargai kompleksitasnya).Tetapi ada banyak situasi di mana penggunaan konservatif
?:
operator dapat menghasilkan kode yang sebenarnya lebih mudah dibaca daripada sebaliknya. Sebagai contoh:Sekarang bandingkan dengan ini:
Karena kodenya lebih ringkas maka noise sintaksisnya lebih sedikit, dan dengan menggunakan operator ternary secara bijaksana (yang hanya terkait dengan properti reverseOrder ) hasil akhirnya tidak terlalu singkat.
sumber
Ini masalah gaya, sungguh; aturan bawah sadar yang cenderung saya ikuti adalah:
foo = (bar > baz) ? true : false
, tetapi TIDAKfoo = (bar > baz && lotto && someArray.Contains(someValue)) ? true : false
<%= (foo) ? "Yes" : "No" %>
Hanya benar-benar menggunakannya untuk penugasan; tidak pernah mengalir logika (jadi tidak pernahLogika aliran dalam ternary itu sendiri adalah sebuah kebohongan, mengabaikan poin terakhir itu.(foo) ? FooIsTrue(foo) : FooIsALie(foo)
)Saya menyukainya karena ringkas dan elegan untuk operasi penugasan sederhana.
sumber
foo = (bar > baz);
jauh lebih sederhanaSeperti banyak pertanyaan pendapat, jawabannya pasti: tergantung
Untuk sesuatu seperti:
Saya pikir itu jauh lebih ringkas (dan lebih cepat bagi saya untuk menguraikan) daripada:
Sekarang jika ekspresi kondisional Anda kompleks, maka operasi ternary bukanlah pilihan yang baik. Sesuatu seperti:
bukan kandidat yang baik untuk operator ternary.
Sebagai tambahan, jika Anda seorang programmer C, GCC sebenarnya memiliki ekstensi yang memungkinkan Anda untuk mengecualikan bagian if-true dari ternary, seperti ini:
Yang akan ditetapkan
x
dengany
asumsiy
tidakNULL
. Barang bagus.sumber
Dalam pikiran saya, masuk akal untuk menggunakan operator ternary dalam kasus di mana ekspresi diperlukan.
Dalam kasus lain, sepertinya operator ternary mengurangi kejernihan.
sumber
Dengan ukuran kompleksitas siklomatik , penggunaan
if
pernyataan atau operator ternary adalah setara. Jadi dengan ukuran itu, jawabannya tidak , kompleksitasnya akan sama persis seperti sebelumnya.Dengan langkah-langkah lain seperti keterbacaan, rawatan, dan KERING (Jangan-Ulangi-Sendiri), salah satu pilihan mungkin terbukti lebih baik daripada yang lain.
sumber
Saya sering menggunakannya di tempat-tempat di mana saya dibatasi untuk bekerja di sebuah konstruktor - misalnya, .NET 3.5 LINQ ke XML yang baru - untuk menetapkan nilai default ketika parameter opsional nol.
Contoh buatan:
atau (terima kasih asterite)
Tidak masalah apakah Anda menggunakan operator ternary atau tidak, memastikan kode Anda dapat dibaca adalah hal yang penting. Setiap konstruksi dapat dibuat tidak dapat dibaca.
sumber
Saya menggunakan operator ternary di mana pun saya bisa, kecuali itu membuat kode sangat sulit dibaca, tapi kemudian itu biasanya hanya indikasi bahwa kode saya bisa menggunakan sedikit refactoring.
Itu selalu membingungkan saya bagaimana beberapa orang berpikir operator ternary adalah fitur "tersembunyi" atau agak misterius. Ini adalah salah satu hal pertama yang saya pelajari ketika saya memulai pemrograman di C, dan saya pikir itu tidak mengurangi keterbacaan sama sekali. Itu adalah bagian alami dari bahasa tersebut.
sumber
Saya setuju dengan jmulder: ini tidak boleh digunakan sebagai ganti a
if
, tetapi memiliki tempat untuk ekspresi balik atau di dalam ekspresi:Yang pertama hanyalah sebuah contoh, dukungan jamak yang lebih baik harus digunakan!
sumber
(Retasan hari ini)
Maka Anda dapat melakukan if-then-else sebagai ekspresi:
sumber
Jika Anda menggunakan operator ternary untuk penugasan bersyarat sederhana, saya rasa tidak masalah. Saya telah melihatnya (ab) digunakan untuk mengontrol aliran program tanpa membuat tugas, dan saya pikir itu harus dihindari. Gunakan pernyataan if dalam kasus ini.
sumber
Saya pikir operator ternary harus digunakan saat dibutuhkan. Ini jelas merupakan pilihan yang sangat subyektif, tetapi saya menemukan bahwa ekspresi sederhana (khususnya sebagai ekspresi balik) jauh lebih jelas daripada tes penuh. Contoh dalam C / C ++:
Dibandingkan dengan:
Anda juga memiliki kasus di mana solusinya adalah antara operator ternary dan membuat fungsi. Misalnya dengan Python:
Alternatifnya adalah:
Cukup diperlukan bahwa dalam Python (sebagai contoh), ungkapan seperti itu dapat dilihat secara teratur:
baris ini menggunakan properti dari operator logis dalam Python: mereka malas dan mengembalikan nilai terakhir yang dihitung jika sama dengan keadaan akhir.
sumber
Saya suka mereka. Saya tidak tahu mengapa, tetapi saya merasa sangat keren ketika saya menggunakan ekspresi ternary.
sumber
Saya telah melihat binatang buas seperti itu (sebenarnya jauh lebih buruk karena itu valid tanggal dan diperiksa bulan dan hari juga, tapi saya tidak bisa repot-repot mencoba mengingat semuanya):
di mana, jelas, serangkaian pernyataan jika akan lebih baik (meskipun yang ini masih lebih baik daripada versi makro yang pernah saya lihat).
Saya tidak keberatan untuk hal-hal kecil seperti:
atau bahkan hal-hal yang sedikit rumit seperti:
sumber
reportedAge
adalah contoh yang memerlukan beberapa perhitungan - mungkin karena ini lebih merupakan kasus tertentu daripada mencari tahuisThisYearALeapYear
Sintaksnya mengerikan. Saya menemukan fungsional jika sangat berguna, dan sering membuat kode lebih mudah dibaca.
Saya akan menyarankan membuat makro untuk membuatnya lebih mudah dibaca, tapi saya yakin seseorang dapat datang dengan kasus tepi yang mengerikan (karena selalu ada dengan CPP).
sumber
Saya suka menggunakan operator dalam kode debug untuk mencetak nilai kesalahan jadi saya tidak harus mencarinya sepanjang waktu. Biasanya saya melakukan ini untuk men-debug cetakan yang tidak akan tetap begitu saya selesai mengembangkan.
sumber
Saya hampir tidak pernah menggunakan operator ternary karena setiap kali saya DO menggunakannya, itu selalu membuat saya berpikir lebih banyak daripada yang harus saya lakukan nanti ketika saya mencoba untuk mempertahankannya.
Saya suka menghindari verbositas, tetapi ketika membuat kode lebih mudah untuk diambil, saya akan menggunakan verbositas.
Mempertimbangkan:
Nah, itu agak bertele-tele, tapi saya merasa lebih mudah dibaca daripada:
atau:
Sepertinya memampatkan terlalu banyak informasi ke dalam ruang yang terlalu sedikit, tanpa memperjelas apa yang terjadi. Setiap kali saya melihat operator ternary digunakan, saya selalu menemukan alternatif yang sepertinya lebih mudah dibaca ... sekali lagi, itu adalah pendapat yang sangat subyektif, jadi jika Anda dan kolega Anda merasa ternary sangat mudah dibaca, lakukan saja.
sumber
Hanya bila:
$ var = (simple> test? simple_result_1: simple_result_2);
CIUMAN.
sumber
Saya biasanya menggunakan hal-hal seperti ini:
sumber
Seperti yang orang lain tunjukkan, mereka bagus untuk kondisi sederhana pendek. Saya terutama menyukai mereka untuk default (seperti | | dan atau penggunaan dalam javascript dan python), misalnya
Penggunaan umum lainnya adalah untuk menginisialisasi referensi dalam C ++. Karena referensi harus dideklarasikan dan diinisialisasi dalam pernyataan yang sama, Anda tidak dapat menggunakan pernyataan if.
sumber
Saya banyak memperlakukan operator ternary seperti GOTO. Mereka memiliki tempat mereka, tetapi mereka adalah sesuatu yang biasanya Anda hindari untuk membuat kode lebih mudah dimengerti.
sumber
Baru-baru ini saya melihat variasi pada operator ternary (well, semacam) yang membuat standar "()?:" Varian tampaknya menjadi teladan kejelasan:
atau, untuk memberikan contoh yang lebih nyata:
Pikiran Anda, ini Javascript, jadi hal-hal seperti itu mungkin tidak dapat dilakukan dalam bahasa lain (untungnya).
sumber
Untuk kasing sederhana, saya suka menggunakannya. Sebenarnya jauh lebih mudah untuk membaca / kode misalnya sebagai parameter untuk fungsi atau hal-hal seperti itu. Juga untuk menghindari baris baru saya ingin tetap dengan semua if / else saya.
Neseting itu akan menjadi NO-NO besar di buku saya.
Jadi, melanjutkan, untuk satu jika / saya akan menggunakan operator ternary. Untuk kasus lain, regular jika / selain itu jika / else (atau switch)
sumber
Saya suka kasus khusus Groovy dari operator ternary, yang disebut operator Elvis:?:
Kode ini mengevaluasi expr jika bukan nol, dan default jika itu adalah nol. Secara teknis itu sebenarnya bukan operator ternary, tapi pasti terkait dengannya dan menghemat banyak waktu / mengetik.
sumber
??
dalam C #, operator penggabungan nol: stackoverflow.com/questions/278703/...Untuk tugas-tugas sederhana seperti menetapkan nilai yang berbeda tergantung pada kondisi mereka bagus. Saya tidak akan menggunakannya ketika ada ekspresi yang lebih lama tergantung pada kondisinya.
sumber
Begitu banyak jawaban yang mengatakan, itu tergantung . Saya menemukan bahwa jika perbandingan ternary tidak terlihat dalam pemindaian cepat ke bawah kode, maka itu tidak boleh digunakan.
Sebagai masalah sampingan, saya mungkin juga mencatat bahwa keberadaannya sebenarnya sedikit aneh karena pada C, pengujian perbandingan adalah pernyataan. Di Icon,
if
konstruk (seperti kebanyakan Icon) sebenarnya adalah ekspresi. Jadi Anda dapat melakukan hal-hal seperti:... yang saya temukan jauh lebih mudah dibaca daripada operator perbandingan ternery. :-)
Ada diskusi baru-baru ini tentang kemungkinan menambahkan
?:
operator ke Icon, tetapi beberapa orang dengan benar menunjukkan bahwa sama sekali tidak perlu karena caraif
kerjanya.Yang berarti bahwa jika Anda bisa melakukannya dalam C (atau bahasa lain mana saja yang memiliki operator ternery), maka Anda sebenarnya tidak memerlukan operator ternery sama sekali.
sumber
Jika Anda dan rekan kerja Anda memahami apa yang mereka lakukan dan mereka tidak dibuat dalam kelompok besar saya pikir mereka membuat kode lebih kompleks dan lebih mudah dibaca karena hanya ada sedikit kode.
Satu-satunya waktu saya pikir operator ternary membuat kode lebih sulit untuk dipahami adalah ketika Anda memiliki lebih dari 3 atau 4 dalam satu baris. Kebanyakan orang tidak ingat bahwa mereka didahulukan berdasarkan hak dan ketika Anda memiliki setumpuk dari mereka itu membuat membaca kode mimpi buruk.
sumber