Seringkali ketika saya mendengar tentang pernyataan switch, itu menunda sebagai cara untuk mengganti panjang jika ... rantai lain. Tapi sepertinya ketika saya menggunakan pernyataan switch saya menulis lebih banyak kode yang saya hanya akan menulis jika ... lain. Anda juga memiliki masalah lain seperti menjaga semua variabel untuk semua panggilan dalam cakupan yang sama .
Inilah beberapa kode yang mewakili aliran yang biasanya saya tulis ( terima kasih untuk diam )
String comment; // The generated insult.
int which = (int)(Math.random() * 3); // Result is 0, 1, or 2.
if (which == 0) {
comment = "You look so much better than usual.";
} else if (which == 1) {
comment = "Your work is up to its usual standards.";
} else if (which == 2) {
comment = "You're quite competent for so little experience.";
} else {
comment = "Oops -- something is wrong with this code.";
}
Kemudian mereka ingin saya menggantinya dengan ini:
String comment; // The generated insult.
int which = (int)(Math.random() * 3); // Result is 0, 1, or 2.
switch (which) {
case 0:
comment = "You look so much better than usual.";
break;
case 1:
comment = "Your work is up to its usual standards.";
break;
case 2:
comment = "You're quite competent for so little experience.";
break;
default:
comment = "Oops -- something is wrong with this code.";
}
Sepertinya lebih banyak kode dalam sintaks yang jauh lebih canggung. Tetapi apakah benar-benar ada keuntungan menggunakan pernyataan switch?
Jawaban:
Untuk situasi tertentu ini, tampaknya bagi saya bahwa kedua
if
dancase
adalah pilihan yang buruk. Saya akan menggunakan array sederhana:Sebagai catatan, Anda biasanya harus menghitung pengali berdasarkan ukuran array daripada hard-coding
3
.Seperti ketika Anda akan menggunakan case / switch, perbedaan dari kaskade
if
pernyataan (atau setidaknya satu perbedaan utama) adalah yangswitch
dapat mengoptimalkan secara semi-otomatis berdasarkan jumlah dan kepadatan nilai, sedangkan kaskadeif
pernyataan meninggalkan kompilator dengan sedikit pilihan selain menghasilkan kode seperti yang telah Anda tulis, menguji satu demi satu nilai hingga menemukan kecocokan. Dengan hanya tiga kasus nyata, itu hampir tidak menjadi perhatian, tetapi dengan jumlah yang cukup dapat / bisa signifikan.sumber
case
pernyataan atau riamif
pernyataan yang cocok. Sebagian besar waktu, mereka adalah pengganti (biasa-biasa saja) untuk semacam peta / jenis array hal, dan Anda lebih baik menggunakan salah satu yang terakhir secara langsung.static const
array itu, untuk memastikan bahwa itu selalu ada (tapi tidak ada bahasa yang diberikan dalam pertanyaan, jadi saya mencoba untuk tidak mengasumsikan satu dalam jawaban baik ).Masalah dengan
if...else if...
rantai adalah ketika saya datang untuk membacanya, saya harus melihat setiapif
kondisi untuk memahami apa yang sedang dilakukan program. Misalnya, Anda mungkin memiliki sesuatu seperti ini:(jelas, untuk sejumlah kecil pernyataan seperti ini, itu tidak terlalu buruk)
Saya tidak memiliki cara untuk mengetahui bahwa Anda mengubah variabel kondisi setengah jalan tanpa membaca setiap pernyataan. Namun, karena
switch
membatasi Anda hanya untuk variabel kondisi tunggal, saya dapat melihat sekilas apa yang terjadi.Pada akhirnya, saya lebih suka tidak
switch
satu pun atau rantaiif...else if
. Seringkali solusi yang lebih baik adalah semacam jump table atau kamus untuk kasus-kasus seperti dalam pertanyaan awal, atau polimorfisme (jika bahasa Anda mendukungnya). Tentu saja tidak selalu memungkinkan, tetapi saya akan mencari solusi yang menghindariswitch
langkah pertama ...sumber
Cara penulisan jenis sakelar jenis ini cukup umum. Alasan mengapa Anda merasakan sakelar ganti jika bulkier adalah karena tubuh Anda hanya satu garis dan dengan sakelar ganti Anda juga memerlukan pernyataan break. Jadi switch case memiliki ukuran tubuh dua kali lipat dari yang lain. Dengan kode yang lebih substansial, pernyataan break tidak akan menambah banyak ke tubuh. Untuk badan baris tunggal, itu adalah praktik umum untuk menulis kode di baris yang sama dengan pernyataan kasus.
Seperti yang orang lain telah sebutkan, kasus saklar membuat maksud lebih jelas, Anda ingin membuat keputusan berdasarkan nilai variabel / ekspresi tunggal. Komentar saya murni dari sudut pandang keterbacaan dan tidak berbasis kinerja.
sumber
return
string yang tepat, Anda dapat menghilangkanbreak
pernyataan.Dalam hal ini, pernyataan beralih lebih jelas cocok dengan maksud kode: pilih tindakan yang akan diambil berdasarkan nilai tunggal.
Sebaliknya, pernyataan if jauh lebih sulit dibaca - Anda harus melihat semuanya untuk memastikan apa yang terjadi. Bagi saya ini adalah kode yang lebih sedikit (walaupun jumlah karakter mungkin sedikit lebih tinggi) karena ada sedikit penguraian mental.
sumber
Saya setuju dengan Jerry bahwa serangkaian string lebih baik untuk kasus khusus ini, tetapi secara umum lebih baik menggunakan pernyataan switch / case daripada rantai elseifs. Ini lebih mudah dibaca, dan kadang-kadang kompiler dapat melakukan pekerjaan yang lebih baik untuk mengoptimalkan cara itu, tetapi ada manfaat lain juga: itu jauh lebih mudah untuk di-debug.
Ketika Anda menekan tombol itu, Anda hanya perlu melangkah satu kali untuk berakhir di cabang kanan, daripada dengan hati-hati melangkahi beberapa pernyataan jika satu per satu, dan mungkin menekan tombol terlalu cepat dan melangkah melewatinya dan kehilangan sesuatu dan memiliki untuk memulai.
sumber
Saya lebih suka beralih dalam kasus-kasus semacam itu, itu cocok dengan titik kode yang lebih baik, menjalankan pernyataan yang berbeda untuk setiap nilai input yang berbeda. The
if..else
bertindak lebih seperti "trik" untuk mencapai efek yang sama.switch
pernyataan juga lebih bersih, mudah untuk kesalahan ketik tersembunyi di semua itu==
Juga, untuk blok besar di C, sakelar lebih cepat.
else..if
bisa lebih tepat ketika Anda memiliki rentang seperti (antara 1 dan 100, lakukan ini, antara 100 dan 200 melakukannya), atau dalam C, ketika Anda mencoba untuk beralih dengan elemen seperti string (yang mungkin dalam bahasa lain). Itu sama saja.Saya cenderung menggunakan banyak sakelar ketika saya memprogram dalam C.
sumber
Pilih sesuatu yang efisien, singkat, dan kemudian dokumentasikan tidak hanya apa yang telah Anda lakukan, tetapi mengapa.
Kode dapat ditinjau kembali, dan tidak selalu oleh penulis aslinya.
Ada saat-saat ketika Anda mungkin dengan sengaja memilih satu implementasi dari yang lain karena Anda berpikiran maju tentang kode yang tidak ada.
sumber
Saya biasanya tidak suka pendekatan mana pun. Switch lama atau jika pernyataan hanya meminta untuk di refactored ke abstraksi berorientasi objek (namun contoh Anda, saya akan mengklasifikasikan sebagai pendek, tidak panjang).
Saya pribadi akan membungkus kode semacam itu ke dalam metode pembantu terpisah.
Menempatkan sakelar dalam metode terpisah memungkinkan Anda untuk menempatkan pernyataan pengembalian langsung di dalam pernyataan sakelar (setidaknya dalam c #), menghilangkan kebutuhan untuk pernyataan break juga, membuat kode lebih mudah dibaca.
Dan ini jauh lebih bagus daripada pendekatan if / else if / else if.
sumber
Dalam python, tidak ada pernyataan switch, karena jika / elif / else bagus:
Sederhana bukan?
sumber
Elif
hanyalah pernyataan if dengan beberapa huruf yang hilang. Ini jelas lebih sepertiif
pernyataan daripada pernyataan beralih. Fakta bahwa Python TIDAK memiliki saklar membuat orang yang membenci mereka (seperti saya) berpikir bahwa mereka tidak sendirian.meta
kecuali topik yang diketahui. Terima kasih telah memberikan saya saksi.Salah satu hal yang membuat gaya C / C #
switch
sangat mengganggu adalah desakan padacase
nilai menjadi literal. Satu hal yang menyenangkan tentang VB / VB.NET adalahselect/case
memungkinkan setiap case menjadi ekspresi boolean. Itu nyaman. Sejauh serangkaian ekspresi boolean yang saling eksklusif sering membantu, serangkaian if / else ifs lebih fleksibel, belum lagi lebih efisien untuk mengetik dan membaca.sumber