要するに、最も読みやすく保守しやすいバージョンを使用する必要があります。
少し古い時代には、ループから抜け出すことは (goto ステートメントと同等に) ノーノーと見なされていたことを知っています。ループは、ループ条件でブレークし、それ以外の場所ではブレークしないはずでした。したがって、while ループが最適な方法でした。
(これはおそらくアセンブリからの持ち越しであり、ループは基本的に、最後に真の場合は最初にジャンプするステートメントを持つコードのブロックです。ブロック内の複数の条件付きジャンプ ステートメントにより、デバッグが非常に難しくなります。 ; したがって、それらは回避され、最後に 1 つにまとめられることになっていました。)
特に foreach ループと管理された世界では、この考え方が今日少し変化しているように感じます。今は本当にスタイルの問題です。ブレーク オン ファウンド for ループは、おそらく一部の純粋主義者を除いて、おそらく多くの人に受け入れられるようになっています。ただし、これはループ条件を混乱させ、混乱を招く可能性があるため、while ループで break を使用することは避けます。
foreach ループの使用を許可していただければ、以下のコードはwhile ループの兄弟よりもはるかに読みやすいと思います。
bool isBaxterInMilwaukee;
foreach (var item in myArray)
{
if (item.name == "baxter" && item.location == "milwaukee")
{
isBaxterInMilwaukee = true;
barkTwice();
break;
}
}
ただし、ロジックが複雑になるにつれて、break
埋もれて見つけにくくならないように、ステートメントの近くに目立つコメントを配置することを検討することをお勧めします。
ほぼ間違いなく、この全体を独自の関数にリファクタリングする必要があります。この関数は見つかりませんbreak
が、実際にreturn
は結果になります (代わりに for ループ バージョンを自由に使用してください)。
bool isBaxterInMilwaukee(Array myArray)
{
foreach (var item in myArray)
{
if (item.name == "baxter" && item.location == "milwaukee")
{
barkTwice();
return true;
}
}
return false;
}
Esko Luontola が指摘したように、barkTwice()
副作用は関数の名前から明らかではなく、すべてのケースで Baxter を見つけることにも関連していないため、呼び出しをこの関数の外に移動するのがおそらく最善でしょう。(または、ブール値のパラメーターを追加しBarkTwiceIfFound
、行を読み取りに変更しif(BarkTwiceIfFound) barkTwice();
て、副作用を明確にします。)
記録のために、休憩なしで for ループでフラグ チェックを実行することもできますが、for ループ定義で追加の条件を想定していないため、これは実際には読みやすさを損なうと感じています。
var i:int;
var isBaxterInMilwaukee:Boolean;
for (i = 0; !isBaxterInMilwaukee && i < arrayLen; i++)
{
if (myArray[i]["name"] == "baxter"
&& myArray[i]["location"] == "milwaukee")
{
isBaxterInMilwaukee = true;
barkTwice();
}
}
while ループを使用して自動インクリメント メカニズムをシミュレートすることもできます。私はいくつかの理由でこれが好きではありません -i
実際の開始値よりも 1 小さい値に初期化する必要があり、コンパイラがループ条件ロジックをどのように短絡するかによって、i
ループ終了時の値が異なる場合があります。それにもかかわらず、それは可能であり、一部の人々にとっては、これにより可読性が向上します。
var i:int = -1;
var isBaxterInMilwaukee:Boolean;
while (!isBaxterInMilwaukee && ++i < arrayLen)
{
if (myArray[i]["name"] == "baxter"
&& myArray[i]["location"] == "milwaukee")
{
isBaxterInMilwaukee = true;
barkTwice();
}
}