Ke ternary atau tidak ke ternary? [Tutup]

186

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?

piksel
sumber
22
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.
Abel
3
Sebenarnya, itu adalah operator bersyarat. Pertanyaan hampir duplikat adalah stackoverflow.com/questions/725973/… .
Daniel Daranas
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:

int a = (b > 10) ? some_value                 
                 : another_value;
marcospereira
sumber
81
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.

David Segonds
sumber
44
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.

Ian P
sumber
5
Inisialisasi ternary bahkan lebih bermanfaat dalam D atau C ++ ketika variabelnya konstan. misalnya const int count = ...;
deft_code
Nah, Anda agak salah mengartikan if/elsedengan kawat gigi yang tidak dibutuhkan di sana.
bobobobo
1
Juga, dalam hal ini jika conditionadalah bool Anda hanya bisa melakukan int count = condition;
bobobobo
1
@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:

x = (y < 100) ? "dog" :
    (y < 150) ? "cat" :
    (y < 300) ? "bar" : "baz";

daripada

     if (y < 100) { x = "dog"; } 
else if (y < 150) { x = "cat"; }
else if (y < 300) { x = "bar"; } 
else              { x = "baz"; }

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...endkarena itu juga ekspresi.

x =   if (y < 100) then "dog"
    elif (y < 150) then "cat"
    elif (y < 300) then "bar"
    else                "baz"
    end

(walaupun, diakui, untuk sesuatu yang sederhana ini, saya mungkin hanya menggunakan operator ternary).

rampion
sumber
2
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:

int compareTo(Object object) {
    if((isLessThan(object) && reverseOrder) || (isGreaterThan(object) && !reverseOrder)) {
       return 1;
    if((isLessThan(object) && !reverseOrder) || (isGreaterThan(object) && reverseOrder)) {
       return -1;
    else
      return 0;              
}

Sekarang bandingkan dengan ini:

int compareTo(Object object) {
    if(isLessThan(object))
        return reverseOrder ? 1 : -1;         
    else(isGreaterThan(object))
        return reverseOrder ? -1 : 1;
    else        
       return 0;              
}

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.

Ryan Delucchi
sumber
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.

Keith Williams
sumber
pedoman yang bagus dan contoh yang bagus!
nickf
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.

Sean Bright
sumber
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.

John Mulder
sumber
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.

Greg Hewgill
sumber
10

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.

Erik Forbes
sumber
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.

ilitirit
sumber
1
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:

echo "Result: " + n + " meter" + (n != 1 ? "s" : "");
return a == null ? "null" : a;

Yang pertama hanyalah sebuah contoh, dukungan jamak yang lebih baik harus digunakan!

PhiLho
sumber
Terner pertama salah - Anda punya: di mana? harus pergi: (n! = 1 ? "s": "")
Erik Forbes
Ya, terima kasih telah menunjukkannya! Tetap.
PhiLho
7

(Retasan hari ini)

#define IF(x) x ?
#define ELSE :

Maka Anda dapat melakukan if-then-else sebagai ekspresi:

int b = IF(condition1)    res1
        ELSE IF(condition2)  res2
        ELSE IF(conditions3) res3
        ELSE res4;
John John
sumber
ini tidak menjawab pertanyaan
Bruno Alexandre Rosa
6

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.

Bill the Lizard
sumber
5

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.

PierreBdR
sumber
3
Kalimat terakhir itu menyakiti otak saya ...
Erik Forbes
5

Saya suka mereka. Saya tidak tahu mengapa, tetapi saya merasa sangat keren ketika saya menggunakan ekspresi ternary.

JimDaniel
sumber
5

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):

isLeapYear =
    ((yyyy % 400) == 0)
    ? 1
    : ((yyyy % 100) == 0)
        ? 0
        : ((yyyy % 4) == 0)
            ? 1
            : 0;

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:

reportedAge = (isFemale && (Age >= 21)) ? 21 + (Age - 21) / 3 : Age;

atau bahkan hal-hal yang sedikit rumit seperti:

printf ("Deleted %d file%s\n", n, (n == 1) ? "" : "s");
paxdiablo
sumber
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).

Marcin
sumber
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");
}
indiv
sumber
4

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 + (middleName == null ? "" : " " + middleName)
    + " " + lastName;

atau:

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.

Mike Stone
sumber
1
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);

CIUMAN.

Jared Farrish
sumber
3

Saya biasanya menggunakan hal-hal seperti ini:

before:

if(isheader)
    drawtext(x,y,WHITE,string);
else
    drawtext(x,y,BLUE,string);

after:

    drawtext(x,y,isheader==true?WHITE:BLUE,string);
KPexEA
sumber
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.

SomeType& ref = pInput ? *pInput : somethingElse;
maccullt
sumber
2
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.

Dan Walker
sumber
2

Baru-baru ini saya melihat variasi pada operator ternary (well, semacam) yang membuat standar "()?:" Varian tampaknya menjadi teladan kejelasan:

var Result = [CaseIfFalse, CaseIfTrue][(boolean expression)]

atau, untuk memberikan contoh yang lebih nyata:

var Name = ['Jane', 'John'][Gender == 'm'];

Pikiran Anda, ini Javascript, jadi hal-hal seperti itu mungkin tidak dapat dilakukan dalam bahasa lain (untungnya).

pilsetnieks
sumber
1
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)

Rodrigo Gómez
sumber
2

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.

Steve Losh
sumber
Ya, saya suka yang itu juga - itu ??dalam C #, operator penggabungan nol: stackoverflow.com/questions/278703/...
Jarrod Dixon
2

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.

Svet
sumber
2

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.

ahli statika
sumber
2

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.

Alex
sumber