前提
次のコードは、言語や目的の機能に関係なく、不適切な形式と見なす必要があります。
while( true ) {
}
引数のサポート
while( true )
ループは次の理由で貧弱な形式です。
- whileループの暗黙のコントラクトを解除します。
- whileループ宣言は、唯一の終了条件を明示的に示す必要があります。
- 永久にループすることを意味します。
- 終了句を理解するには、ループ内のコードを読み取る必要があります。
- 永久に繰り返されるループは、ユーザーがプログラム内からプログラムを終了することを防ぎます。
- 非効率的です。
- 「true」のチェックを含む、複数のループ終了条件があります。
- バグが発生しやすいです。
- 反復ごとに常に実行されるコードをどこに配置するかを簡単に決定することはできません。
- 不必要に複雑なコードにつながります。
- 自動ソースコード分析。
- バグの発見、プログラムの複雑さの分析、セキュリティチェック、またはコードを実行せずに他のソースコードの動作を自動的に導き出すために、初期の破壊条件を指定すると、アルゴリズムが有用な不変条件を決定できるため、自動ソースコード分析メトリックが向上します。
- 無限ループ。
- 誰もが常に
while(true)
無限ではないループを使用する場合、ループに終了条件が実際にない場合、簡潔に通信する機能が失われます。(おそらく、これはすでに起こっているので、要点は議論の余地があります。)
「GoTo」の代替
次のコードの方が適切です。
while( isValidState() ) {
execute();
}
bool isValidState() {
return msg->state != DONE;
}
利点
フラグなし。いいえgoto
。例外なし。簡単に交換できます。読みやすい。簡単に修正できます。さらに、コード:
- ループ自体からループのワークロードの知識を分離します。
- コードを管理している人が機能を簡単に拡張できるようにします。
- 複数の終了条件を1か所に割り当てることができます。
- 終了句を実行するコードから分離します。
- 原子力発電所にとってより安全です。;-)
2番目のポイントは重要です。コードがどのように機能するかを知らなくても、誰かがメインループに他のスレッド(またはプロセス)にCPU時間を持たせるように依頼された場合、2つの解決策が思い浮かびます。
オプション1
一時停止をすぐに挿入します。
while( isValidState() ) {
execute();
sleep();
}
オプション#2
オーバーライド実行:
void execute() {
super->execute();
sleep();
}
このコードは、が埋め込まれたループよりも単純です(したがって読みやすくなります)switch
。isValidState
メソッドは、ループを続行するかどうかのみを決定する必要があります。メソッドの主力はメソッドに抽象化する必要があります。これにより、サブクラスがデフォルトの動作(埋め込みとexecute
を使用する難しいタスク)をオーバーライドできるようになります。switch
goto
Pythonの例
StackOverflowに投稿された次の回答(Pythonの質問に対する)を比較してください:
- 永遠にループします。
- ユーザーに選択内容を入力してもらいます。
- ユーザーの入力が「restart」の場合は、ループを永久に継続します。
- それ以外の場合は、ループを永久に停止します。
- 終わり。
コード
while True:
choice = raw_input('What do you want? ')
if choice == 'restart':
continue
else:
break
print 'Break!'
対:
- ユーザーの選択を初期化します。
- ユーザーの選択が「restart」という単語である間にループします。
- ユーザーに選択内容を入力してもらいます。
- 終わり。
コード
choice = 'restart';
while choice == 'restart':
choice = raw_input('What do you want? ')
print 'Break!'
ここではwhile True
、誤解を招き、過度に複雑なコードになります。