Aikido

Pourquoi ne pas surcharger les arguments de fonction : éviter la confusion et les problèmes de débogage

Lisibilité

Règle

Ne pas remplacer fonction de la fonction.
La réaffectation des arguments d'une paramètres paramètres peut confondre
appelants et et rendre débogage difficile.

Langues prises en charge : 45+

Introduction

La réaffectation des paramètres de fonction modifie la valeur des arguments au sein de la fonction, rendant incertaine la valeur du paramètre à tout moment donné. Lors du débogage, vous ne pouvez pas être certain qu'un paramètre contient toujours la valeur transmise par l'appelant. Cela crée de la confusion pour quiconque lit le code et rend la recherche de bugs plus difficile, car la valeur du paramètre change tout au long de l'exécution.

Exemples de code

❌ Non conforme :

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;
}

Pourquoi c'est incorrect : Le utilisateur le paramètre est réaffecté plusieurs fois, ce qui rend impossible de savoir ce que l'appelant d'origine a transmis sans lire l'intégralité de la fonction. Le débogage affiche des valeurs modifiées, et non l'entrée réelle, ce qui rend difficile de retracer les problèmes jusqu'à leur source.

✅ Conforme :

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;
}

Pourquoi c'est important : Nouvelles variables (utilisateur actuel, processedUser) conservent des valeurs intermédiaires tandis que l'original utilisateur le paramètre reste inchangé. Les débogueurs affichent la valeur d'entrée réelle, et le code suit clairement les transformations via des variables nommées.

Conclusion

Utilisez de nouvelles variables pour les transformations au lieu de réaffecter les paramètres. Cela rend le flux de données explicite et préserve l'entrée originale pour le débogage. La légère verbosité des déclarations de variables supplémentaires est compensée par une meilleure lisibilité et débogabilité.

FAQ

Des questions ?

Qu'en est-il des valeurs de paramètres par défaut ?

Les paramètres par défaut (par exemple, `function process(user = {})`) sont différents de la réaffectation. Ils ne fournissent des valeurs que lorsque les arguments sont `undefined`, et non pour réaffecter des paramètres existants. Utilisez les paramètres par défaut pour les arguments optionnels, mais ne les réaffectez pas à l'intérieur du corps de la fonction.

Cela s'applique-t-il aux paramètres primitifs vs objets ?

Oui, les deux. La réaffectation de primitives (nombres, chaînes de caractères) modifie la référence locale et crée de la confusion. La réaffectation d'objets remplace complètement la référence, bien que la mutation des propriétés d'objet (user.name = 'x') soit une question distincte concernant l'immutabilité.

Que se passe-t-il si je dois normaliser ou nettoyer une entrée ?

Créez une nouvelle variable pour la valeur normalisée : const cleanedInput = normalizeInput(input). Cela indique clairement que la fonction transforme l'entrée et affiche à la fois les valeurs originales et nettoyées pendant le débogage.

Qu'en est-il de la modification des propriétés de paramètres ?

Modifier les propriétés (user.name = 'x') est différent de réaffecter le paramètre lui-même. Cependant, la mutation de paramètres est également problématique car elle crée des effets de bord. Préférez traiter les paramètres comme immuables et retourner de nouveaux objets avec les modifications.

Sécurisez-vous maintenant.

Sécuriser votre code, votre cloud et votre runtime dans un système centralisé unique.
Détectez et corrigez les vulnérabilités rapidement et automatiquement.

Pas de carte de crédit requise | Résultats du scan en 32 secondes.