前提
次のコードは、言語や目的の機能に関係なく、不適切な形式と見なされます。
while( true ) {
}
サポートする引数
次のwhile( true )
理由により、ループは不適切な形式です。
- whileループの暗黙のコントラクトを解除します。
- whileループ宣言では、唯一の終了条件を明示的に記述する必要があります。
- それは永遠にループすることを意味します。
- ループ内のコードは、終了句を理解するために読み取る必要があります。
- 永久に繰り返されるループは、ユーザーがプログラム内からプログラムを終了できないようにします。
- 非効率的です。
- 「true」のチェックを含む、複数のループ終了条件があります。
- バグが発生しやすい。
- 各反復で常に実行されるコードを配置する場所を簡単に決定できません。
- 不必要に複雑なコードにつながります。
- 自動ソースコード分析。
- バグの発見、プログラムの複雑さの分析、セキュリティチェック、またはコードを実行せずに他のソースコードの動作を自動的に導出するには、初期破壊条件を指定することで、アルゴリズムが有用な不変条件を特定できるようになり、自動ソースコード分析の指標が向上します。
- 無限ループ。
- 誰
while(true)
もが無限ではないforループを常に使用する場合、ループに実際に終了条件がないときに簡潔に通信する能力を失います。(おそらく、これはすでに起こっているので、要点は議論の余地があります。)
「移動」の代わり
次のコードはより良い形式です:
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の質問に対する)と比較してください。
- 永久にループします。
- 選択肢を入力するようユーザーに依頼します。
- ユーザーの入力が「再開」の場合は、ループを永久に継続します。
- それ以外の場合は、ループを永久に停止します。
- 終わり。
コード
while True:
choice = raw_input('What do you want? ')
if choice == 'restart':
continue
else:
break
print 'Break!'
対:
- ユーザーの選択を初期化します。
- ユーザーの選択が「再起動」という単語である間ループします。
- 選択肢を入力するようユーザーに依頼します。
- 終わり。
コード
choice = 'restart';
while choice == 'restart':
choice = raw_input('What do you want? ')
print 'Break!'
ここではwhile True
、誤解を招く複雑なコードになります。