Mengapa kompilator tidak secara otomatis meletakkan pernyataan break setelah setiap blok kode di sakelar? Apakah karena alasan sejarah? Kapan Anda ingin menjalankan beberapa blok kode?
94
Mengapa kompilator tidak secara otomatis meletakkan pernyataan break setelah setiap blok kode di sakelar? Apakah karena alasan sejarah? Kapan Anda ingin menjalankan beberapa blok kode?
break
.Jawaban:
Terkadang ada gunanya memiliki beberapa kasus yang terkait dengan blok kode yang sama, seperti
dll Sekadar contoh.
Dalam pengalaman saya, biasanya itu adalah gaya yang buruk untuk "gagal" dan memiliki beberapa blok kode yang dieksekusi untuk satu kasus, tetapi mungkin ada kegunaannya dalam beberapa situasi.
sumber
// Intentional fallthrough.
saat Anda menghilangkan jeda. Menurut pendapat saya, ini bukanlah gaya yang buruk seperti "mudah melupakan istirahat secara tidak sengaja". PS Tentu saja tidak dalam kasus-kasus sederhana seperti pada jawaban itu sendiri.case
ditumpuk seperti itu. Jika ada kode di antara mereka maka ya, komentar tersebut mungkin pantas.case
, seperticase 'A','B','C': doSomething(); case 'D','E': doSomethingElse();
:, tanpa perlu jeda antar kasus. Pascal dapat melakukannya: "Pernyataan kasus membandingkan nilai ekspresi ordinal dengan setiap pemilih, yang dapat berupa konstanta, subrentang, atau daftar di antaranya yang dipisahkan dengan koma." ( wiki.freepascal.org/Case )Secara historis , itu karena
case
pada dasarnya mendefinisikanlabel
, juga dikenal sebagai titik sasaran darigoto
panggilan. Pernyataan switch dan kasus terkaitnya benar-benar hanya mewakili cabang multiway dengan beberapa titik masuk potensial ke dalam aliran kode.Semua yang dikatakan, telah dicatat dalam jumlah yang hampir tak terbatas yang
break
hampir selalu merupakan perilaku default yang Anda inginkan di akhir setiap kasus.sumber
Java berasal dari C dan itu adalah sintaks dari C.
Ada kalanya Anda ingin beberapa pernyataan kasus hanya memiliki satu jalur eksekusi. Di bawah ini adalah contoh yang akan memberi tahu Anda berapa hari dalam sebulan.
sumber
Saya pikir itu adalah kesalahan. Sebagai konstruksi bahasa, ini semudah memiliki
break
default dan sebagai gantinya memilikifallthrough
kata kunci. Sebagian besar kode yang telah saya tulis dan baca memiliki jeda setelah setiap kasus.sumber
continue <case name>
yang memungkinkan untuk secara eksplisit menentukan dengan pernyataan kasus mana yang akan dilanjutkan;case
dalam arusswitch
, ini hanya menjadigoto
. ;-)Anda dapat melakukan segala macam hal menarik dengan kasus fall-through.
Misalnya, katakanlah Anda ingin melakukan tindakan tertentu untuk semua kasus, tetapi dalam kasus tertentu Anda ingin melakukan tindakan itu ditambah sesuatu yang lain. Menggunakan pernyataan switch dengan fall-through akan membuatnya cukup mudah.
Tentu saja, mudah untuk melupakan
break
pernyataan di akhir kasus dan menyebabkan perilaku yang tidak terduga. Kompiler yang baik akan memperingatkan Anda saat Anda menghilangkan pernyataan break.sumber
Mengesampingkan keinginan baik untuk dapat menggunakan blok yang sama untuk beberapa kasus (yang dapat berupa kasing khusus) ...
Ini terutama untuk kompatibilitas dengan C, dan bisa dibilang merupakan peretasan kuno dari masa lalu ketika
goto
kata kunci menjelajahi bumi. Itu memang memungkinkan beberapa hal luar biasa, tentu saja, seperti Perangkat Duff , tetapi apakah itu poin yang menguntungkan atau menentang adalah ... paling banter argumentatif.sumber
The
break
setelah saklarcase
s digunakan untuk menghindari fallthrough dalam laporan switch. Menariknya, hal ini sekarang dapat dicapai melalui label sakelar yang baru dibentuk seperti yang diterapkan melalui JEP-325 .Dengan perubahan ini,
break
dengan setiap sakelarcase
dapat dihindari seperti yang ditunjukkan lebih lanjut: -Saat menjalankan kode di atas dengan JDK-12 , output komparatif dapat dilihat sebagai
dan
dan tentu saja hal itu tidak berubah
sumber
Jadi Anda tidak perlu mengulang kode jika Anda membutuhkan beberapa kasus untuk melakukan hal yang sama:
Atau Anda dapat melakukan hal-hal seperti:
Dengan gaya bertingkat.
Benar-benar rentan bug / kebingungan, jika Anda bertanya kepada saya.
sumber
do this
dando that
untuk ini tetapi hanyado that
untuk itu?Sejauh catatan sejarah berjalan, Tony Hoare menemukan pernyataan kasus pada tahun 1960-an, selama revolusi "pemrograman terstruktur". Pernyataan kasus Tony mendukung banyak label per casing dan keluar otomatis tanpa
break
pernyataan yang tidak sedap . Persyaratan untuk eksplisitbreak
adalah sesuatu yang keluar dari garis BCPL / B / C. Dennis Ritchie menulis (dalam ACM HOPL-II):Saya belum dapat menemukan tulisan sejarah tentang BCPL, tetapi komentar Ritchie menunjukkan bahwa
break
itu kurang lebih merupakan kecelakaan sejarah. BCPL kemudian memperbaiki masalah tersebut, tetapi mungkin Ritchie dan Thompson terlalu sibuk menciptakan Unix untuk direpotkan dengan detail seperti itu :-)sumber
break
memungkinkan "beberapa blok kode untuk dieksekusi", dan lebih mementingkan motivasi pilihan desain ini. Yang lain menyebutkan warisan terkenal dari C hingga Jawa, dan jawaban ini mendorong penelitian lebih jauh ke hari-hari sebelum C. Saya berharap kami memiliki pencocokan pola ini (meskipun sangat primitif) sejak awal.Java diturunkan dari C, yang warisannya mencakup teknik yang dikenal sebagai Perangkat Duff . Ini adalah pengoptimalan yang bergantung pada fakta bahwa kontrol berpindah dari satu kasus ke kasus berikutnya, jika tidak ada
break;
pernyataan. Pada saat C distandarisasi, ada banyak kode seperti itu "di alam liar", dan akan menjadi kontraproduktif jika mengubah bahasa untuk mematahkan konstruksi semacam itu.sumber
Seperti yang orang katakan sebelumnya, itu adalah untuk membiarkan jatuh dan itu bukan kesalahan, itu adalah fitur. Jika terlalu banyak
break
pernyataan mengganggu Anda, Anda dapat dengan mudah menyingkirkannya dengan menggunakanreturn
pernyataan. Ini sebenarnya adalah praktik yang baik, karena metode Anda harus sekecil mungkin (demi keterbacaan dan pemeliharaan), jadiswitch
pernyataan sudah cukup besar untuk sebuah metode, oleh karena itu, metode yang baik tidak boleh berisi yang lain, ini adalah sebuah contoh:Eksekusi mencetak:
seperti yang diharapkan.
sumber
Tidak adanya jeda otomatis yang ditambahkan oleh kompilator memungkinkan untuk menggunakan sakelar / kasing untuk menguji kondisi seperti
1 <= a <= 3
dengan menghapus pernyataan putus dari 1 dan 2.sumber
karena ada situasi di mana Anda ingin mengalir melalui blok pertama misalnya untuk menghindari penulisan kode yang sama di beberapa blok tetapi masih dapat membaginya untuk lebih banyak kontrol. Ada juga banyak alasan lain.
sumber
Ini adalah pertanyaan lama tetapi sebenarnya saya menggunakan case tanpa pernyataan istirahat hari ini. Tidak menggunakan break sebenarnya sangat berguna saat Anda perlu menggabungkan fungsi yang berbeda secara berurutan.
misalnya menggunakan kode respons http untuk mengotentikasi pengguna dengan token waktu
kode respons server 401 - token sudah usang -> buat ulang token dan masukkan pengguna.
Kode respons server 200 - token OK -> masukkan pengguna.
dalam pernyataan kasus:
Dengan menggunakan ini, Anda tidak perlu memanggil fungsi pengguna log in untuk respons 401 karena ketika token dibuat ulang, runtime melompat ke kasus 200.
sumber
Anda dapat dengan mudah memisahkan jenis lain dari angka, bulan, hitungan.
Ini lebih baik jika dalam kasus ini;
sumber
Saya sekarang mengerjakan proyek di mana saya membutuhkan
break
dalam pernyataan switch saya jika tidak kode tidak akan berfungsi. Bersabarlah dengan saya dan saya akan memberi Anda contoh yang baik tentang mengapa Anda membutuhkanbreak
dalam pernyataan sakelar Anda.Bayangkan Anda memiliki tiga status, satu yang menunggu pengguna memasukkan angka, yang kedua untuk menghitungnya dan yang ketiga untuk mencetak jumlahnya.
Jika demikian, Anda memiliki:
Melihat negara bagian, Anda ingin urutan eksaksi dimulai di state1 , lalu state3 dan terakhir state2 . Jika tidak, kami hanya akan mencetak input pengguna tanpa menghitung jumlahnya. Untuk memperjelasnya lagi, kita menunggu pengguna memasukkan nilai, lalu menghitung jumlahnya dan mencetak jumlahnya.
Berikut adalah contoh kode:
Jika kita tidak menggunakannya
break
, itu akan dieksekusi dalam urutan ini, state1 , state2 dan state3 . Tetapi dengan menggunakanbreak
, kami menghindari skenario ini, dan dapat memesan dalam prosedur yang benar yaitu dimulai dengan state1, kemudian state3 dan terakhir tetapi tidak sedikit state2.sumber
Tepatnya, karena dengan beberapa penempatan yang cerdik, Anda dapat mengeksekusi blok secara bertingkat.
sumber