Apakah praktik yang buruk menggunakan break
pernyataan di dalam for
loop ?
Katakanlah, saya mencari nilai dalam array. Bandingkan di dalam perulangan for dan ketika nilai ditemukan, break;
untuk keluar dari perulangan for.
Apakah ini praktik yang buruk? Saya telah melihat alternatif yang digunakan: definisikan variabel vFound
dan setel ke true ketika nilainya ditemukan dan periksa vFound
dalam for
kondisi pernyataan. Tetapi apakah perlu membuat variabel baru hanya untuk tujuan ini?
Saya bertanya dalam konteks normal C atau C ++ for loop.
PS: Pedoman pengkodean MISRA menyarankan agar tidak menggunakan istirahat.
break
di liga yang sama dengangoto
:)Jawaban:
Banyak jawaban di sini, tetapi saya belum melihat ini disebutkan:
Sebagian besar "bahaya" yang terkait dengan penggunaan
break
ataucontinue
pengulangan for dinegasikan jika Anda menulis pengulangan yang rapi dan mudah dibaca. Jika badan loop Anda mencakup beberapa panjang layar dan memiliki beberapa sub-blok bersarang, ya, Anda dapat dengan mudah lupa bahwa beberapa kode tidak akan dijalankan setelah jeda. Namun, jika loopnya pendek dan to the point, tujuan pernyataan break harus jelas.Jika sebuah loop menjadi terlalu besar, gunakan satu atau beberapa pemanggilan fungsi yang dinamai baik di dalam loop sebagai gantinya. Satu-satunya alasan sebenarnya untuk menghindari melakukannya adalah untuk memproses kemacetan.
sumber
Tidak, istirahat adalah solusi yang tepat.
Menambahkan variabel boolean membuat kode lebih sulit dibaca dan menambahkan potensi sumber kesalahan.
sumber
goto
keluar dari loop bersarang Level 2+ - karena tidak adabreak(level)
Anda dapat menemukan semua jenis kode profesional dengan pernyataan 'break' di dalamnya. Sangat masuk akal untuk menggunakan ini kapan pun diperlukan. Dalam kasus Anda, opsi ini lebih baik daripada membuat variabel terpisah hanya untuk tujuan keluar dari loop.
sumber
Baik-baik saja menggunakan
break
sertacontinue
dalam satufor
loop.Ini menyederhanakan kode dan meningkatkan keterbacaannya.
sumber
Jauh dari praktik buruk, Python (dan bahasa lain?)
for
Memperluas struktur perulangan sehingga sebagian darinya hanya akan dijalankan jika perulangan tidakbreak
.Keluaran:
Kode yang setara tanpa
break
dan itu bergunaelse
:sumber
Tidak ada yang salah dengan menggunakan pernyataan break, tetapi loop bersarang bisa membingungkan. Untuk meningkatkan keterbacaan banyak bahasa ( setidaknya Java ) mendukung pemutusan label yang akan sangat meningkatkan keterbacaan.
Saya akan mengatakan bahwa pernyataan break (dan return) sering kali meningkatkan kompleksitas siklomatik yang membuatnya lebih sulit untuk membuktikan kode melakukan hal yang benar dalam semua kasus.
Jika Anda mempertimbangkan untuk menggunakan jeda saat mengulang urutan untuk beberapa item tertentu, Anda mungkin ingin mempertimbangkan kembali struktur data yang digunakan untuk menyimpan data Anda. Menggunakan sesuatu seperti Set atau Peta dapat memberikan hasil yang lebih baik.
sumber
for
loop kompleks .break adalah pernyataan yang sepenuhnya dapat diterima untuk digunakan (begitu juga lanjutkan , btw). Ini semua tentang keterbacaan kode - selama Anda tidak memiliki loop yang terlalu rumit dan semacamnya, tidak masalah.
Ini tidak seperti liga yang sama dengan goto . :)
sumber
Aturan umum: Jika mengikuti aturan mengharuskan Anda melakukan sesuatu yang lebih canggung dan sulit dibaca kemudian melanggar aturan, maka langgar aturan tersebut.
Dalam kasus perulangan sampai Anda menemukan sesuatu, Anda mengalami masalah membedakan ditemukan dan tidak ditemukan ketika Anda keluar. Itu adalah:
Jadi oke, Anda bisa menyetel bendera, atau menginisialisasi nilai "ditemukan" ke null. Tapi
Itulah mengapa secara umum saya lebih suka mendorong pencarian saya ke dalam fungsi:
Ini juga membantu mengurai kode. Di baris utama, "temukan" menjadi pernyataan tunggal, dan jika kondisinya rumit, hanya ditulis sekali.
sumber
break
, saya mencoba menemukan beberapa cara untuk merefaktor kode menjadi sebuah fungsi, sehingga saya dapat menggunakanreturn
sebagai gantinya.Itu tergantung bahasanya. Meskipun Anda dapat memeriksa variabel boolean di sini:
tidak mungkin melakukannya saat melakukan itering pada array:
Bagaimanapun,
break
akan membuat kedua kode lebih mudah dibaca.sumber
Dalam contoh Anda, Anda tidak mengetahui jumlah iterasi untuk loop for . Mengapa tidak menggunakan while loop sebagai gantinya, yang memungkinkan jumlah iterasi menjadi tak tentu di awal?
Oleh karena itu, tidak perlu menggunakan statemement break secara umum, karena loop dapat lebih baik dinyatakan sebagai loop sementara .
sumber
Saya setuju dengan orang lain yang merekomendasikan penggunaan
break
. Pertanyaan konsekuensial yang jelas adalah mengapa ada orang yang merekomendasikan sebaliknya? Nah ... ketika Anda menggunakan break, Anda melewatkan sisa kode di blok tersebut, dan iterasi yang tersisa. Terkadang hal ini menyebabkan bug, misalnya:sumber daya yang diperoleh di bagian atas blok dapat dilepaskan di bagian bawah (ini berlaku bahkan untuk blok di dalam
for
loop), tetapi langkah rilis tersebut dapat dilewati secara tidak sengaja ketika keluar "prematur" disebabkan olehbreak
pernyataan (dalam "modern" C ++, "RAII" digunakan untuk menangani ini dengan cara yang andal dan aman untuk pengecualian: pada dasarnya, resource bebas penghancur objek dengan andal, tidak peduli bagaimana suatu cakupan keluar)seseorang dapat mengubah tes bersyarat dalam
for
pernyataan tanpa memperhatikan bahwa ada kondisi keluar yang terdelokalisasi lainnyaJawaban ndim mengamati bahwa beberapa orang mungkin menghindari
break
s untuk mempertahankan loop run-time yang relatif konsisten, tetapi Anda membandingkanbreak
dengan penggunaan variabel kontrol keluar awal boolean yang tidak berlaku.Sesekali orang yang mengamati bug tersebut menyadari bahwa mereka dapat dicegah / dimitigasi oleh aturan "tanpa jeda" ini ... memang, ada strategi terkait keseluruhan untuk pemrograman "lebih aman" yang disebut "pemrograman terstruktur", di mana setiap fungsi seharusnya memiliki satu titik masuk dan keluar juga (yaitu tidak ada goto, tidak ada pengembalian awal). Ini mungkin menghilangkan beberapa bug, tapi pasti memperkenalkan yang lain. Mengapa mereka melakukannya?
sumber
break
. Mereka memang menghindarinya tetapi gagal memikirkan kondisi yang menggantikan penggunaan break.Ini benar-benar valid untuk digunakan
break
- seperti yang ditunjukkan orang lain, itu tidak ada di liga yang sama sepertigoto
.Meskipun Anda mungkin ingin menggunakan
vFound
variabel saat Anda ingin memeriksa di luar loop apakah nilainya ditemukan dalam array. Juga dari sudut pandang pemeliharaan, memiliki bendera umum yang menandakan kriteria keluar mungkin berguna.sumber
Saya melakukan beberapa analisis pada basis kode yang sedang saya kerjakan (40.000 baris JavaScript).
Saya hanya menemukan 22
break
pernyataan, di antaranya:switch
pernyataan (kami hanya memiliki total 3 pernyataan switch!).for
loop - kode yang saya segera klasifikasikan untuk direfraktor menjadi fungsi terpisah dan diganti denganreturn
pernyataan.break
dalam terakhirwhile
... Aku berlarigit blame
untuk melihat siapa yang menulis omong kosong ini!Jadi menurut statistik saya: Jika
break
digunakan di luarswitch
, itu adalah kode bau.Saya juga mencari
continue
pernyataan. Tidak ditemukan.sumber
Saya tidak melihat alasan mengapa itu akan menjadi praktik yang buruk. DIBERIKAN bahwa Anda ingin menyelesaikan pemrosesan STOP pada saat itu.
sumber
Di dunia tertanam, ada banyak kode di luar sana yang menggunakan konstruksi berikut:
Ini adalah contoh yang sangat umum, banyak hal yang terjadi di balik tirai, khususnya interupsi. Jangan gunakan ini sebagai kode boilerplate, saya hanya mencoba mengilustrasikan sebuah contoh.
Pendapat pribadi saya adalah tidak ada yang salah dengan menulis loop dengan cara ini selama perawatan yang tepat dilakukan untuk mencegah tetap dalam loop tanpa batas.
sumber
continue
pernyataan di dalam logika aplikasi. Ada?Tergantung pada kasus penggunaan Anda. Ada aplikasi di mana runtime for loop harus konstan (misalnya untuk memenuhi beberapa batasan waktu, atau untuk menyembunyikan data internal Anda dari serangan berbasis waktu).
Dalam kasus tersebut bahkan akan masuk akal untuk menetapkan sebuah bendera dan hanya memeriksa nilai bendera SETELAH semua
for
iterasi loop benar-benar berjalan. Tentu saja, semua perulangan for perlu menjalankan kode yang masih membutuhkan waktu yang hampir bersamaan.Jika Anda tidak peduli dengan run time ... gunakan
break;
dancontinue;
buat kode lebih mudah dibaca.sumber
Pada aturan MISRA 98, yang digunakan di perusahaan saya di C dev, pernyataan break tidak boleh digunakan ...
Edit: Istirahat diperbolehkan di MISRA '04
sumber
Tentu,
break;
adalah solusi untuk menghentikan loop for atau foreach loop. Saya menggunakannya di php di foreach dan for loop dan ternyata berfungsi.sumber
Saya tidak setuju!
Mengapa Anda mengabaikan fungsionalitas bawaan dari perulangan for untuk membuatnya sendiri? Anda tidak perlu menemukan kembali roda.
Saya pikir lebih masuk akal untuk memiliki cek Anda di bagian atas loop for Anda seperti itu
atau jika Anda perlu memproses baris tersebut terlebih dahulu
Dengan cara ini Anda dapat menulis fungsi untuk melakukan semuanya dan membuat kode yang lebih bersih.
Atau jika kondisi Anda rumit, Anda dapat memindahkan kode itu juga!
"Kode Profesional" yang penuh dengan jeda tidak terdengar seperti kode profesional bagi saya. Kedengarannya seperti pengkodean malas;)
sumber
break
berpendapat bahwa itu untuk keterbacaan kode. Sekarang lihat lagi kondisi gila sepanjang 5 mil di loop di atas ...