Aikido

Warum Sie Funktionsargumente nicht überschreiben sollten: um Verwirrung und Debugging-Probleme zu vermeiden

Lesbarkeit

Regel

darf nicht überschreiben Funktion Argumente.
Neuzuweisung von Funktion Parameter kann verwirren
Aufrufer verwirren und machen. Fehlersuche schwierig.

Unterstützte Sprachen: 45+

Einleitung

Das Neuzuweisen von Funktionsparametern ändert den Wert von Argumenten innerhalb der Funktion, wodurch unklar wird, welchen Wert der Parameter zu einem bestimmten Zeitpunkt hat. Beim Debugging können Sie nicht darauf vertrauen, dass ein Parameter immer noch den vom Aufrufer übergebenen Wert enthält. Dies führt zu Verwirrung für jeden, der den Code liest, und erschwert die Fehlersuche, da sich der Wert des Parameters während der Ausführung ändert.

Code-Beispiele

❌ Nicht konform:

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

Warum es falsch ist: Der Benutzer Parameter wird mehrfach neu zugewiesen, wodurch es unmöglich wird, zu wissen, was der ursprüngliche Aufrufer übergeben hat, ohne die gesamte Funktion zu lesen. Das Debugging zeigt modifizierte Werte, nicht die tatsächliche Eingabe, was es schwierig macht, Probleme bis zur Quelle zurückzuverfolgen.

✅ Konform:

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

Warum dies wichtig ist: Neue Variablen (currentUser, processedUser) Zwischenwerte speichern, während das Original Benutzer Parameter bleibt unverändert. Debugger zeigen den tatsächlichen Eingabewert, und der Code verfolgt Transformationen klar durch benannte Variablen.

Fazit

Verwenden Sie neue Variablen für Transformationen, anstatt Parameter neu zuzuweisen. Dies macht den Datenfluss explizit und bewahrt die ursprüngliche Eingabe für das Debugging. Die leichte Ausführlichkeit zusätzlicher Variablendeklarationen wird durch verbesserte Lesbarkeit und Debugging-Fähigkeit aufgewogen.

FAQs

Haben Sie Fragen?

Was ist mit Standardparameterwerten?

Standardparameter (function process(user = {})) unterscheiden sich von einer Neuzuweisung. Sie stellen Werte nur dann bereit, wenn Argumente undefiniert sind, und weisen bestehenden Parametern keine neuen Werte zu. Verwenden Sie Standardparameter für optionale Argumente, aber weisen Sie sie nicht innerhalb des Funktionskörpers neu zu.

Gilt dies für primitive vs. Objektparameter?

Ja, beides. Das Neuzuweisen von Primitiven (Zahlen, Strings) ändert die lokale Referenz und führt zu Verwirrung. Das Neuzuweisen von Objekten ersetzt die Referenz vollständig, obwohl das Mutieren von Objekteigenschaften (user.name = 'x') ein separates Thema bezüglich der Immutabilität ist.

Was, wenn ich die Eingabe normalisieren oder bereinigen muss?

Erstellen Sie eine neue Variable für den normalisierten Wert: const cleanedInput = normalizeInput(input). Dies macht deutlich, dass die Funktion die Eingabe transformiert und sowohl die ursprünglichen als auch die bereinigten Werte während des Debuggings anzeigt.

Was ist mit dem Modifizieren von Parameter-Eigenschaften?

Das Ändern von Eigenschaften (user.name = 'x') unterscheidet sich von der Neuzuweisung des Parameters selbst. Das Mutieren von Parametern ist jedoch ebenfalls problematisch, da es Nebenwirkungen erzeugt. Ziehen Sie es vor, Parameter als unveränderlich zu behandeln und neue Objekte mit den Änderungen zurückzugeben.

Werden Sie jetzt sicher.

Sichern Sie Ihren Code, Ihre Cloud und Ihre Laufzeit in einem zentralen System.
Finden und beheben Sie Schwachstellen schnell und automatisch.

Keine Kreditkarte erforderlich | Scan-Ergebnisse in 32 Sek.