Öncül
Aşağıdaki kod, dil veya istenen işlevsellikten bağımsız olarak kötü form olarak kabul edilmelidir:
while( true ) {
}
Destekleyici Argümanlar
while( true )
Döngü bunun nedeni kötü biçimidir:
- Bir while döngüsünün zımni sözleşmesini bozar.
- While döngüsü bildirimi, tek çıkış koşulunu açıkça belirtmelidir .
- Sonsuza dek döndüğünü ima eder.
- Sonlandırma cümlesini anlamak için döngü içindeki kod okunmalıdır.
- Sonsuza kadar tekrar eden döngüler, kullanıcının programı program içinden sonlandırmasını engeller.
- Verimsizdir.
- "Doğru" nun kontrol edilmesi dahil olmak üzere birden fazla döngü sonlandırma koşulu vardır.
- Böceklere eğilimlidir.
- Her yineleme için her zaman çalıştırılacak kodun nereye koyulacağını kolayca belirleyemez.
- Gereksiz karmaşık koda yol açar.
- Otomatik kaynak kodu analizi.
- Hataları bulmak, program karmaşıklığı analizi, güvenlik kontrolleri yapmak veya kod yürütmeden başka herhangi bir kaynak kodu davranışını otomatik olarak türetmek için, ilk kırılma koşullarının belirtilmesi, algoritmaların yararlı değişmezleri belirlemesine olanak tanır ve böylece otomatik kaynak kodu analizi ölçümlerini iyileştirir.
- Sonsuz döngüler.
- Herkes
while(true)
sonsuz olmayan döngüler için her zaman kullanıyorsa , döngüler gerçekte sonlandırma koşulu olmadığında kısaca iletişim kurma yeteneğimizi kaybederiz. (Muhtemelen, bu zaten olmuştur, bu nedenle mesele tartışmalıdır.)
"Git" e alternatif
Aşağıdaki kod daha iyi bir formdur:
while( isValidState() ) {
execute();
}
bool isValidState() {
return msg->state != DONE;
}
Avantajları
Bayrak yok. Hayır goto
. İstisna yok. Değiştirmesi kolay. Okuması kolay. Düzeltmesi kolay. Ek olarak kod:
- Döngünün iş yükü bilgisini döngünün kendisinden ayırır.
- Kodu koruyan birinin işlevselliği kolayca genişletmesine izin verir.
- Tek bir yerde birden çok sonlandırma koşulunun atanmasına izin verir.
- Yürütülecek koddan sonlandırma cümlesini ayırır.
- Nükleer Santraller için daha güvenlidir. ;-)
İkinci nokta önemlidir. Kodun nasıl çalıştığını bilmeden, birisi benden ana döngüyü yapmamı isterse, diğer iş parçacıklarının (veya işlemlerin) biraz CPU zamanı olmasına izin vermesi durumunda, akla iki çözüm gelir:
Seçenek 1
Duraklamayı kolayca ekleyin:
while( isValidState() ) {
execute();
sleep();
}
Seçenek 2
Yürütmeyi geçersiz kıl:
void execute() {
super->execute();
sleep();
}
Bu kod, gömülü bir döngüden daha basittir (dolayısıyla okunması daha kolaydır) switch
. isValidState
Döngü sürdürmesi konusunda yöntem yalnızca belirlemelidir. Yöntemin iş gücü, execute
alt sınıfların varsayılan davranışı geçersiz kılmasına izin veren yönteme soyutlanmalıdır (gömülü switch
ve kullanan zor bir görev goto
).
Python Örneği
StackOverflow'da yayınlanan aşağıdaki yanıtı (bir Python sorusuyla) karşılaştırın:
- Sonsuza kadar döngü.
- Kullanıcıdan seçimini girmesini isteyin.
- Kullanıcının girdisi 'yeniden başlat' ise sonsuza kadar döngüye devam edin.
- Aksi takdirde, döngüyü sonsuza kadar durdurun.
- Son.
kod
while True:
choice = raw_input('What do you want? ')
if choice == 'restart':
continue
else:
break
print 'Break!'
Karşı:
- Kullanıcının seçimini başlatın.
- Kullanıcının seçimi 'yeniden başlatma' iken döngü.
- Kullanıcıdan seçimini girmesini isteyin.
- Son.
kod
choice = 'restart';
while choice == 'restart':
choice = raw_input('What do you want? ')
print 'Break!'
Burada while True
yanıltıcı ve aşırı karmaşık kodlar ortaya çıkar.