it-swarm-id.com

Haruskah saya menggunakan pernyataan switch atau lama jika ... rantai lain?

Seringkali ketika saya mendengar tentang pernyataan switch, itu menunda sebagai cara untuk mengganti panjang jika ... rantai lain. Tetapi tampaknya 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 lingkup yang sama .

Inilah beberapa kode yang mewakili aliran yang biasanya saya tulis ( terima kasih kepada 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?

36
TheLQ

Untuk situasi khusus ini, menurut saya keduanya if dan case adalah pilihan yang buruk. Saya akan menggunakan array sederhana:

String comments[] = {
    "You look so much better than usual.",
    "Your work is up to its usual standards.",
    "You're quite competent for so little experience."
};

String comment = comments[(int)(Math.random() * 3)];

Sebagai catatan, Anda biasanya harus menghitung pengali berdasarkan ukuran array daripada mengkodekan _ 3.

Mengenai kapan Anda akan menggunakan case/switch, perbedaan dari kaskade if pernyataan (atau setidaknya satu perbedaan utama) adalah bahwa switch dapat semi- secara otomatis mengoptimalkan berdasarkan jumlah dan kepadatan nilai, sedangkan kaskade pernyataan if membuat kompiler tidak memiliki banyak pilihan selain menghasilkan kode seperti yang 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.

57
Jerry Coffin

Masalah dengan if...else if... chain adalah ketika saya datang untuk membacanya, saya harus melihat setiap kondisi if tunggal untuk memahami apa yang sedang dilakukan program. Misalnya, Anda mungkin memiliki sesuatu seperti ini:

if (a == 1) {
    // stuff
} else if (a == 2) {
    // stuff
} else if (a == 3) {
    // stuff
} else if (b == 1) {
    // stuff
} else if (b == 2) {
    // stuff
}

(jelas, untuk sejumlah kecil pernyataan seperti ini, itu tidak terlalu buruk)

Saya tidak akan mengetahui bahwa Anda mengubah variabel kondisi setengah jalan tanpa membaca setiap pernyataan. Namun, karena switch membatasi Anda hanya untuk satu variabel kondisi saja, saya dapat melihat sekilas apa yang terjadi.

Pada akhirnya, saya lebih memilih switch atau rantai if...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 mungkin, tetapi saya akan mencari solusi yang menghindari switch sebagai langkah pertama ...

23
Dean Harding
switch (which) {
  case 0: comment = "String 1"; break;
  case 1: comment = "String 2"; break;
  case 2: comment = "String 3"; break;
  default: comment = "Oops"; break;
}

Cara penulisan jenis sakelar jenis ini cukup umum. Alasan mengapa Anda merasakan sakelar pengganti jika bulkier adalah karena tubuh Anda hanya satu garis dan dengan sakelar switch Anda juga memerlukan pernyataan break. Jadi switch case memiliki ukuran tubuh dua kali lipat jika 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.

14
aufather

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 kode yang lebih sedikit (walaupun jumlah karakter mungkin sedikit lebih tinggi) karena ada lebih sedikit untuk menguraikan mental.

8
FinnNk

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 sih jauh lebih mudah untuk di-debug.

Ketika Anda menekan tombol itu, Anda hanya perlu melangkah satu kali untuk berakhir di cabang kanan, daripada melangkah hati-hati beberapa pernyataan jika satu per satu, dan mungkin menekan tombol terlalu cepat dan melangkah melewatinya dan kehilangan sesuatu dan memiliki untuk memulai.

8
Mason Wheeler

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. if..else bertindak lebih seperti "trik" untuk mencapai efek yang sama.

switch pernyataan juga lebih bersih, mudah untuk salah 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.

3
Khelben

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.

private string GetInsult()
{
    int which = (int)(Math.random() * 3);  //  Result is 0, 1, or 2.

    switch (which) {
        case 0: return "You look so much better than usual.";
        case 1: return "Your work is up to its usual standards.";
        case 2: return "You're quite competent for so little experience.";
        default: return "Oops -- something is wrong with this code.";
    }
}

public void Foo()
{
    string comment = GetInsult();
    Print(comment);
}

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.

2
Pete

Pilih sesuatu yang efisien, singkat, dan kemudian dokumen bukan hanya apa yang telah Anda lakukan, tetapi mengapa.

Kode dapat ditinjau kembali, dan tidak selalu oleh penulis aslinya.

Ada kalanya Anda mungkin sengaja memilih satu implementasi daripada yang lain karena Anda berpikiran maju tentang kode yang tidak ada.

2

Salah satu hal yang membuat gaya C/C # switch sangat menyebalkan adalah desakan pada nilai case menjadi literal. Satu hal yang menyenangkan tentang VB/VB.NET adalah select/case memungkinkan setiap case menjadi ekspresi boolean. It nyaman. Sejauh serangkaian ekspresi boolean yang saling eksklusif sering membantu, serangkaian if/else ifs lebih fleksibel, belum lagi lebih efisien untuk mengetik dan membaca.

0
Joel Brown

Dalam python, tidak ada pernyataan switch, karena jika/Elif/else bagus:

a = 5

if a==1:
    print "do this"
Elif a == 2:
    print "do that"
Elif a == 3:
    print "do the other"
Elif 3 < a < 9:
    print "do more"
Elif 9 <= a < 15:
    print "do nothing"
else:
    print "say sorry"

Sederhana bukan?

0