Aikido

Warum Sie Funktionsargumente nicht überschreiben sollten: Vermeidung von Verwirrung und Fehlersuchproblemen

Lesbarkeit

Regel

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

Unterstützte Sprachen: 45+

Einführung

Durch die Neuzuweisung von Funktionsparametern ändert sich der Wert der Argumente innerhalb der Funktion, so dass nicht klar ist, welchen Wert der Parameter zu einem bestimmten Zeitpunkt hat. Beim Debuggen kann man sich nicht darauf verlassen, dass ein Parameter immer noch den vom Aufrufer übergebenen Wert enthält. Dies schafft 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 das falsch ist: Die Benutzer Parameter wird mehrfach neu zugewiesen, so dass es unmöglich ist, zu erfahren, was der ursprüngliche Aufrufer übergeben hat, ohne die gesamte Funktion zu lesen. Bei der Fehlersuche werden geänderte Werte und nicht die tatsächliche Eingabe angezeigt, so dass es schwierig ist, 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 das wichtig ist: Neue Variablen (currentUser, bearbeitetBenutzer) halten Zwischenwerte, während die ursprüngliche Benutzer Parameter bleibt unverändert. Debugger zeigen den tatsächlichen Eingabewert an, und der Code verfolgt eindeutig die Transformationen durch benannte Variablen.

Schlussfolgerung

Verwenden Sie neue Variablen für Transformationen, anstatt Parameter neu zuzuweisen. Dadurch wird der Datenfluss eindeutig und die ursprüngliche Eingabe bleibt für die Fehlersuche erhalten. Die geringe Ausführlichkeit der zusätzlichen Variablendeklarationen wird durch die verbesserte Lesbarkeit und Debugging-Möglichkeiten aufgewogen.

FAQs

Haben Sie Fragen?

Was ist mit den Standard-Parameterwerten?

Standardparameter (Funktion process(user = {})) unterscheiden sich von der Neuzuweisung. Sie liefern nur Werte, wenn Argumente undefiniert sind, und weisen vorhandene Parameter nicht neu zu. Verwenden Sie Standardparameter für optionale Argumente, aber weisen Sie sie nicht innerhalb des Funktionskörpers neu zu.

Gilt dies für primitive und für Objektparameter?

Ja, beides. Die Neuzuweisung von Primitiven (Zahlen, Strings) ändert die lokale Referenz und sorgt für Verwirrung. Die Neuzuweisung von Objekten ersetzt den Verweis vollständig, obwohl die Änderung von Objekteigenschaften (user.name = 'x') ein separates Problem der Unveränderlichkeit darstellt.

Was ist, wenn ich die Eingabe normalisieren oder bereinigen muss?

Erstellen Sie eine neue Variable für den normalisierten Wert: const cleanedInput = normalizeInput(input). Dadurch wird deutlich, dass die Funktion die Eingabe umwandelt und bei der Fehlersuche sowohl die ursprünglichen als auch die bereinigten Werte anzeigt.

Was ist mit der Änderung von Parametereigenschaften?

Die Änderung von Eigenschaften (user.name = 'x') ist etwas anderes als die Neuzuweisung des Parameters selbst. Das Ändern von Parametern ist jedoch ebenfalls problematisch, da es zu Seiteneffekten führt. Ziehen Sie es vor, Parameter als unveränderlich zu behandeln und neue Objekte mit Änderungen zurückzugeben.

Starten Sie kostenlos

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

Keine Kreditkarte erforderlich | Scanergebnisse in 32 Sekunden.