ルール
禁止事項 配置 割り当て 代入を 条件式の中に代入してはいけない。
混合 代入 と 条件 ロジック を作る コード エラーを起こしやすい
そして 難しくする 理解しにくくなる。 理解しにくくなる。 別々の 課題 と 論理的 チェックを分離する。
対応言語 言語 JavaScript、 TypeScript、 Python、 PHPはじめに
条件文の中の代入演算子は、コンパイラーやリンターが見逃しがちなバグの原因です。典型的な間違いは、if文の中で==や===(比較)の代わりに==(代入)を使ってしまうことですが、問題はもっと深いところにあります。条件文の中の意図的な代入でさえ、読みにくく、レビューしにくく、デバッグしにくいコードを作ります。代入と評価が同じ行で行われる場合、読者はどちらの処理が優先されるのか、また実際にテストされるのはどの値なのかを頭の中で解析しなければなりません。
なぜそれが重要なのか
なぜそれが重要なのか
バグの紹介: タイプミスによる変更 === への = を指定しても構文エラーにはなりません。条件は比較結果ではなく、代入された値(真偽値)に対して評価されます。
コードの可読性:読者は、条件文が値を変更するのではなく、値をテストすることを期待している。この両方が同時に起こった場合、メンテナはどの変数がいつ変更されたかを追跡しなければならない。
コード例
非準拠:
function processUser(userData) {
if (user = userData.user) {
console.log(`Processing user: ${user.name}`);
return user.id;
}
return null;
}
function validateInput(value) {
if (result = value.match(/^\d{3}-\d{2}-\d{4}$/)) {
return result[0];
}
return false;
}
なぜ間違っているのか:条件式の中に代入があるため、意図的なのかタイプミスなのかが不明確になっている。最初の例は====を意図したバグかもしれないし、2番目の例は正規表現マッチングと代入が混在しているため、コードの流れがわかりにくくなっている。
✅ 準拠:
function processUser(userData) {
const user = userData.user;
if (user) {
console.log(`Processing user: ${user.name}`);
return user.id;
}
return null;
}
function validateInput(value) {
const result = value.match(/^\d{3}-\d{2}-\d{4}$/);
if (result) {
return result[0];
}
return false;
}
なぜこれが重要なのか: 代入を条件から切り離すことで、意図が明確になる。読者はすぐに ユーザー が最初に抽出され、次にテストされる。正規表現にマッチした結果はキャプチャされ、その後評価される。曖昧さがなく、認知的なオーバーヘッドもない。 = 対 === が明らかになった。
結論
代入を条件式から分離しておくことは、単純なルールであり、バグの一群を防ぐことができる。結合された操作を解析することによる認知的なオーバーヘッドは、認識される簡潔さの利点を上回ります。代入と評価が別個の操作である明確で明示的なコードは、可読性を向上させ、バグを減らし、コード・レビューをより効果的にします。
.avif)
