Aikido

関数引数をオーバーライドすべきではない理由:混乱とデバッグの問題を防ぐ

可読性

ルール

~してはならない 上書き 関数 引数。
再割り当て 関数 パラメータ ~する可能性がある 混乱させる
呼び出し元 そして ~にする デバッグ 困難です。

対応言語: 45+

はじめに

関数パラメータを再割り当てすると、関数内の引数の値が変更され、特定の時点でのパラメータの値が不明確になります。デバッグ時、パラメータが呼び出し元によって渡された値を保持しているとは限りません。これはコードを読む人にとって混乱を招き、パラメータの値が実行中に変化するため、バグの特定をより困難にします。

コード例

❌ 非準拠:

function processUser(user) {
    if (!user) {
        user = { id: null, name: 'Guest' };
    }

    user = { ...user, processedAt: Date.now() };

    if (user.age < 18) {
        user = { ...user, restricted: true };
    }

    return user;
}

誤っている理由: 会社情報 ユーザー パラメーターが複数回再割り当てされるため、関数全体を読まなければ元の呼び出し元が何を渡したかを知ることは不可能です。デバッグでは変更された値が表示され、実際の入力ではないため、問題をソースまで遡って追跡するのが困難になります。

✅ 準拠済み:

function processUser(user) {
    const currentUser = user || { id: null, name: 'Guest' };

    const processedUser = {
        ...currentUser,
        processedAt: Date.now()
    };

    if (currentUser.age < 18) {
        return { ...processedUser, restricted: true };
    }

    return processedUser;
}

これが重要である理由: 新しい変数(currentUser, processedUser)は中間値を保持し、元の~は ユーザー パラメーターは変更されません。デバッガーは実際の入力値を表示し、コードは名前付き変数を通じて変換を明確に追跡します。

まとめ

パラメータを再割り当てする代わりに、変換には新しい変数を使用してください。これにより、データフローが明示的になり、デバッグのために元の入力が保持されます。追加の変数宣言によるわずかな冗長性は、可読性とデバッグ性の向上によって補われます。

よくある質問

ご質問がありますか?

デフォルト引数値についてはどうでしょうか?

デフォルトパラメータ(`function process(user = {})`など)は、再割り当てとは異なります。これらは、引数が未定義の場合にのみ値を提供し、既存のパラメータを再割り当てすることはありません。オプションの引数にはデフォルトパラメータを使用しますが、関数本体内でそれらを再割り当てしないでください。

これはプリミティブ型とオブジェクト型のパラメーターに適用されますか?

はい、両方です。プリミティブ(数値、文字列)の再割り当てはローカル参照を変更し、混乱を招きます。オブジェクトの再割り当ては参照を完全に置き換えますが、オブジェクトプロパティの変更(user.name = 'x')は不変性に関する別の問題です。

入力を正規化またはクリーンアップする必要がある場合はどうなりますか?

正規化された値のために新しい変数 `const cleanedInput = normalizeInput(input)` を作成します。これにより、関数が入力値を変換していることが明確になり、デバッグ中に元の値とクリーンアップされた値の両方を確認できます。

パラメータのプロパティを変更することについてはどうですか?

プロパティの変更(user.name = 'x')は、パラメータ自体の再割り当てとは異なります。しかし、パラメータをミューテーションすることも、副作用を生み出すため問題があります。パラメータを不変として扱い、変更を伴う新しいオブジェクトを返すことを推奨します。

今すぐ、安全な環境へ。

コード、クラウド、ランタイムを1つの中央システムでセキュアに。
脆弱性を迅速に発見し、自動的に修正。

クレジットカードは不要です | スキャン結果は32秒で表示されます。