Aikido

Pourquoi ne pas remplacer les arguments d'une 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 d'une fonction modifie la valeur des arguments au sein de la fonction, ce qui rend incertaine la valeur du paramètre à un moment donné. Lors du débogage, vous ne pouvez pas vous fier au fait qu'un paramètre contient toujours la valeur transmise par l'appelant. Cela crée de la confusion pour toute personne lisant le code et rend la recherche de bogues plus difficile car la valeur du paramètre change au cours 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 mal : Le utilisateur est réaffecté plusieurs fois, ce qui fait qu'il est impossible de savoir ce que l'appelant original a passé sans lire la fonction entière. Le débogage montre les valeurs modifiées, et non l'entrée réelle, ce qui rend difficile la remontée des problèmes à la 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 cela est-il important ? Nouvelles variables (utilisateur actuel, utilisateur traité) conservent des valeurs intermédiaires, tandis que les utilisateur reste inchangé. Les débogueurs affichent la valeur réelle de l'entrée, et le code suit clairement les transformations par le biais de variables nommées.

Conclusion

Utiliser 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 l'amélioration de la lisibilité et du débogage.

FAQ

Vous avez des questions ?

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

Les paramètres par défaut (fonction process(user = {})) sont différents de la réaffectation. Ils ne fournissent des valeurs que lorsque les arguments sont indéfinis, et ne réaffectent pas les paramètres existants. Utilisez les paramètres par défaut pour les arguments facultatifs, mais ne les réaffectez pas dans le corps de la fonction.

Cela s'applique-t-il aux paramètres primitifs et aux paramètres d'objet ?

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 modification des propriétés des objets (user.name = 'x') soit une question distincte concernant l'immutabilité.

Que faire si j'ai besoin de normaliser ou de nettoyer l'entrée ?

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

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

La modification des propriétés (user.name = 'x') est différente de la réaffectation du paramètre lui-même. Cependant, la modification des paramètres est également problématique car elle crée des effets de bord. Il est préférable de traiter les paramètres comme immuables et de renvoyer de nouveaux objets avec les modifications.

Obtenir la sécurité gratuitement

Sécurisez votre code, votre cloud et votre environnement d'exécution dans un système central.
Trouvez et corrigez rapidement et automatiquement les vulnérabilités.

Aucune carte de crédit n'est requise | Scanner les résultats en 32sec.