Misalkan saya memiliki loop dalam C ++ atau C # yang berjalan seperti ini:
while( true ) {
doSomething();
if( condition() ) {
break;
}
doSomethingElse();
}
Ini biasa disebut "infinite loop". Namun itu tidak terbatas secara teknis - itu akan berhenti begitu kontrol mengalir break
.
Apa istilah untuk loop seperti itu - yang memiliki pernyataan kontrol loop "loop forever" dan "break" di dalamnya?
terminology
sharptooth
sumber
sumber
condition()
selalu mengembalikan false? Saya akan mengatakan itu adalah loop tak terbatas dengan istirahat bersyarat.break
, loop tidak terbatas (kill
, ctrl-alt-del, cabut ...). Jadi mengapa repot dengan detail terminologi?Jawaban:
Mempelajari CS, profesor ini mengajarkan kita bahwa ada loop pra-pengecekan (
while(cond) {}
), loop pasca-pengecekan (do {} while(cond);
), dan loop tengah-memeriksa . (Saya mungkin telah menerjemahkan ini ke dalam bahasa Inggris dengan buruk, tetapi Anda mendapatkan idenya.)C dan C ++ tidak memiliki yang terakhir (ISTR Ada yang memilikinya, BICBW), jadi konstruk Anda digunakan untuk itu dalam C dan C ++.
sumber
loop ... exit when condition; ... end loop;
Kursus pertama dalam CS di Stanford ( Metodologi Pemrograman oleh Mehran Sahami ) menyebut ini sebagai satu setengah lingkaran . Dan itu belum tentu praktik pemrograman yang buruk. Pertimbangkan contoh ini untuk mengumpulkan input pengguna (diambil dari The Art and Science of Java oleh Eric Roberts , di mana Roberts juga menyebutnya a-loop-and-a-half ):
Dan kemudian hal yang sama diselesaikan dengan menggunakan ide setengah dan setengah untuk menghindari kode duplikat:
sumber
Karena tidak memiliki nama resmi, saya akan menyebutnya Broken Loop . Ambiguitas istilah ini dimaksudkan, karena penembusan di tengah-tengah loop agak najis, hampir seperti a
goto
.sumber
goto
juga memiliki aplikasi yang valid, misalnya emulasi percobaan ... akhirnya diblokir dalam C.while(XEventGet(&ev) != NULL){ ... }
, Anda secara alami akan ingin memeriksa kunci dalam loop:if(ev.key == XK_q) break;
. Melakukan hal berikutwhile(XEventGet(&ev) != NULL && ev.key != XK_q){ ... }
:, jelek dan bisa dibilang lebih sulit dibaca daripada istirahat pertengahan-loop. Plus, bagaimana jika sesuatu harus dilakukan dengan nilai terlebih dahulu sebelum dapat diperiksa? Anda tidak akan dengan serius memasukkan semua itu ke dalam kasing loop, bukan?Tidak ada nama pasti. Loop tak terbatas, saya pikir, adalah istilah yang tepat. Tidak ada loop yang benar-benar tak terbatas, tetapi ini memiliki potensi untuk menjadi tak terbatas secara efektif karena mungkin cabang yang berisi istirahat tidak akan pernah terjadi.
Jika Anda memberi tahu seseorang "buat loop tak terbatas, dan gunakan jeda untuk kondisi X" dan mereka akan tahu apa yang Anda maksud. Jika seseorang meninjau kode Anda dan mengatakan tidak lebih dari "Saya tidak suka loop tak terbatas yang Anda tulis", Anda akan tahu apa yang mereka bicarakan (kecuali Anda memiliki lebih dari satu, tentu saja).
sumber
while
loop normal dan cara Anda melakukan pembatalan itu persis sama (menemukan metrik penurunan monoton adalah awal yang baik).Ini loop do-while dengan kondisional di tempat yang salah.
sumber
break
ataucontinue
. Menghindari nilai sentinel dengan cara apa pun, itu hanyalah sepotong negara sewenang-wenang yang harus dilacak secara mental, yang menyamarkan tujuan kode.Saya akan memilih "loop tanpa syarat" , mirip dengan "lompatan tanpa syarat". Ini menggambarkan apa yang sedang terjadi (kode loop tanpa syarat), tanpa berbohong (tidak seperti "loop tak terbatas").
sumber
if
/break
di tengah adalah bagian dari pola.Ini adalah loop tanpa batas dengan kondisi break.
Saya setuju dengan ammilind dalam hal itu jika Anda ingin memberikannya nama khusus, Anda dapat menyebutnya sebagai Infinite Partial Loop
sumber
Pada Kode Rosetta, pola khusus ini digambarkan sebagai loop "N plus satu setengah" . Meskipun ini bukan istilah favorit saya, itu tidak mengerikan dan jelas merupakan pola yang berguna untuk beberapa jenis loop. (Alternatifnya adalah menduplikasi kode sebelum-kondisi-berpotensi rumit dalam program nyata - atau untuk meningkatkan kedalaman bersarang dari kode setelah-kondisi sambil menambahkan variabel kondisi lingkaran; tidak meningkatkan kemampuan pemeliharaan atau pemahaman kode Satu-satunya alasan untuk menolak konstruksi tersebut adalah jika seseorang bersikeras menulis loop menjadi
break
-gratis.)sumber
Tidak ada istilah standar, tapi saya akan mengatakannya sebagai Partial loop .
Loop ini digunakan ketika Anda ingin memecah hanya setelah mengeksekusi beberapa bagian dari loop untuk yang terakhir kalinya (yaitu eksekusi parsial). Ini digunakan ketika Anda tidak menemukan situasi yang cocok di mana Anda mungkin ingin memutus seluruh loop .
Dalam hal ini, Anda ingin memutus loop setelah setidaknya mengeksekusi untuk
doSomething()
terakhir kalinya.sumber
Saya harus setuju dengan sbi di sini - Saya suka istilah loop tengah-memeriksa . Konstruk semacam ini lebih populer ketika Structured Programming mulai bergulir dan banyak bahasa memiliki dukungan sintaksis untuk mereka.
Yang mengatakan, sekarang pengetahuan luas bahwa
while
loop biasanya lebih dapat dipertahankan, karena lebih mudah untuk alasan tentang invarian dan mereka sering menangani kasus kosong yang rumit dengan lebih baik.Dalam kasus khusus Anda, loop Anda hanya setara dengan
jadi saya hanya akan menggunakan
break
versi jika salah satudoSomething
ataudoSomethingElse
melibatkan beberapa pernyataan dan saya lebih suka tidak menyimpannya dalam fungsi yang terpisah seperti yang Anda lakukan.Yang mengatakan, jika loop Anda lebih rumit maka iterasi (mulai, periksa, kenaikan) maka Anda harus mempertimbangkan refactoring itu menjadi sesuatu yang lebih sederhana.
sumber
Saya kira jika kita akan mencoba membuat istilah untuk ini, mungkin:
sumber
Saya menyebutnya apa adanya, "while true loop."
Juga lihat apakah praktik pemrograman yang buruk (benar)?
sumber
Tidak begitu buruk dalam setiap kasus. Saya menemukan diri saya menulis loop semacam ini dengan jenis API tertentu. Katakan, misalnya, bahwa Anda memiliki objek loop, dan perlu memeriksa beberapa kondisi yang cukup mendalam di dalamnya, seperti:
Sekarang anggaplah setiap metode getXXX berpotensi mengembalikan nol. Maka masih mungkin untuk menulis ekspresi boolean, meskipun yang cukup rumit dan tidak dapat dibaca. Dan kemudian kita harus melakukan mengulang hampir sama untuk mendapatkan objek handler saat ini. Dalam kasus seperti itu, saya merasa lebih mudah untuk menulis
while (true)
loop dengan break dan melanjutkan.sumber