Premis
Kode berikut harus dianggap bentuk yang buruk, terlepas dari bahasa atau fungsi yang diinginkan:
while( true ) {
}
Argumen Pendukung
Bentuk while( true )
loopnya buruk karena:
- Memutus kontrak tersirat dari loop sementara.
- Deklarasi while loop harus secara eksplisit menyatakan satu - satunya kondisi keluar.
- Menyiratkan bahwa loop selamanya.
- Kode di dalam loop harus dibaca untuk memahami klausa terminating.
- Loop yang berulang selamanya mencegah pengguna untuk menghentikan program dari dalam program.
- Tidak efisien.
- Ada beberapa kondisi penghentian loop, termasuk memeriksa "benar".
- Rawan bug.
- Tidak dapat dengan mudah menentukan di mana harus meletakkan kode yang akan selalu dieksekusi untuk setiap iterasi.
- Menghasilkan kode kompleks yang tidak perlu.
- Analisis kode sumber otomatis.
- Untuk menemukan bug, analisis kompleksitas program, pemeriksaan keamanan, atau secara otomatis mendapatkan perilaku kode sumber lainnya tanpa eksekusi kode, menentukan kondisi pemutusan awal memungkinkan algoritme untuk menentukan invarian yang berguna, sehingga meningkatkan metrik analisis kode sumber otomatis.
- Loop tak terbatas.
- Jika setiap orang selalu menggunakan
while(true)
untuk loop yang tidak terbatas, kita kehilangan kemampuan untuk berkomunikasi secara ringkas ketika loop sebenarnya tidak memiliki kondisi penghentian. (Bisa dibilang, ini sudah terjadi, jadi intinya diperdebatkan.)
Alternatif untuk "Pergi ke"
Kode berikut adalah bentuk yang lebih baik:
while( isValidState() ) {
execute();
}
bool isValidState() {
return msg->state != DONE;
}
Keuntungan
Tidak ada bendera. Tidak goto
. Tanpa pengecualian. Mudah diubah. Mudah dibaca. Mudah diperbaiki. Selain itu kode:
- Mengisolasi pengetahuan tentang beban kerja loop dari loop itu sendiri.
- Memungkinkan seseorang memelihara kode dengan mudah memperluas fungsinya.
- Memungkinkan beberapa kondisi pengakhiran untuk ditugaskan di satu tempat.
- Memisahkan klausa penghentian dari kode yang akan dieksekusi.
- Lebih aman untuk pembangkit listrik tenaga nuklir. ;-)
Poin kedua penting. Tanpa mengetahui cara kerja kode, jika seseorang meminta saya untuk membuat loop utama, biarkan utas (atau proses) lain memiliki waktu CPU, dua solusi muncul dalam pikiran:
Pilihan 1
Masukkan jeda dengan mudah:
while( isValidState() ) {
execute();
sleep();
}
Pilihan 2
Timpa eksekusi:
void execute() {
super->execute();
sleep();
}
Kode ini lebih sederhana (sehingga lebih mudah dibaca) daripada loop dengan embedded switch
. The isValidState
Metode hanya harus menentukan apakah loop harus terus. Pekerja keras metode ini harus diabstraksikan ke dalam execute
metode, yang memungkinkan subclass untuk menimpa perilaku default (tugas yang sulit menggunakan switch
dan tertanam goto
).
Contoh Python
Bandingkan jawaban berikut (dengan pertanyaan Python) yang diposting di StackOverflow:
- Ulangi selamanya.
- Minta pengguna untuk memasukkan pilihan mereka.
- Jika input pengguna adalah 'restart', lanjutkan looping selamanya.
- Jika tidak, hentikan perulangan selamanya.
- Akhir.
Kode
while True:
choice = raw_input('What do you want? ')
if choice == 'restart':
continue
else:
break
print 'Break!'
Melawan:
- Inisialisasi pilihan pengguna.
- Loop sedangkan pilihan pengguna adalah kata 'restart'.
- Minta pengguna untuk memasukkan pilihan mereka.
- Akhir.
Kode
choice = 'restart';
while choice == 'restart':
choice = raw_input('What do you want? ')
print 'Break!'
Di sini, while True
menghasilkan kode yang menyesatkan dan terlalu kompleks.