ルール
してはいけない 使用しないでください 改行 を ループ内 ループ内では
break break 内側の 深く 深く ループ は
制御 制御フロー 制御フローを を 追うのが難しい なしでは 明確な ドキュメントがなければ
対応言語: 45以上はじめに
ネストされたループ内のbreakステートメントは、どのループがどのような条件で終了するかについて曖昧さを生じさせます。When a break 複数のループの奥深くに出現するため、読者は、どのループを終了させるのか、また外側のループが実行を継続するのかを慎重に遡って特定する必要があります。この認知的オーバーヘッドは、ネストレベルが深くなるごとに増加し、コードの理解と保守を困難にします。
なぜ重要なのか
コードの保守性: ネストされたループ内のbreak文は、制御フローを不明瞭にします。将来の保守担当者は、どのループがbreakし、外側のループに何が起こるかを頭の中で追跡しなければなりません。これは、ループロジックを変更したり、新しい条件を追加したりする際にエラーが発生しやすくなります。
デバッグの複雑さ: breakを含むネストされたループをデバッグする場合、ブレークポイントを設定してコードをステップ実行するには、複雑な終了パスを理解する必要があります。内部ループでのbreakは、外部ループの重要なクリーンアップまたは検証ロジックの実行を妨げる可能性があります。
コード例
❌ 非準拠:
function findUser(users, id) {
let found = null;
for (let i = 0; i < users.length; i++) {
if (users[i].id === id) {
found = users[i];
break; // break is okay, but this pattern is verbose
}
}
return found;
}誤っている理由: 会社情報 break このステートメントでは、一時変数(発見しました)で結果を保持し、ループ後にそれを返します。この冗長なパターンは、直接リターンや配列メソッドと比較して、不要な複雑さを追加し、コードを追跡しにくくします。
✅ 準拠済み:
function findUser(users, id) {
return users.find(user => user.id === id);
}
OR
function findUser(users, id) {
for (let i = 0; i < users.length; i++) {
if (users[i].id === id) {
return users[i];
}
}
return null;
}これが重要である理由: オプション1では .find() 簡潔で意図を明確に表現しています。オプション2は~を使用します return ユーザーが見つかった場合に即座に終了し、一時変数の必要性を排除します。 break ステートメントです。どちらのアプローチも、breakパターンよりも明確で保守性が高くなります。
まとめ
ネストされたループロジックを関数に抽出します return すべてのループを明確に終了します。配列メソッドを使用します(例:) find(), some()、または every() 可能な限り内部ループを置き換えます。ネストされたループが避けられない場合は、ラベル付きbreak文やフラグを使用して、終了条件を明示的にします。

