Sie: „Hey, ich höre immer wieder von funktionaler Programmierung. Es klingt cool, aber was ist es wirklich und wie unterscheidet es sich von dem, was ich bereits in JavaScript mache?“
Ich: Tolle Frage! Lassen Sie uns es Schritt für Schritt aufschlüsseln und die funktionale Programmierung (FP) mit der traditionellen imperativen Methode des Codierens vergleichen.
Bei der imperativen Programmierung schreiben Sie Schritt-für-Schritt-Anleitungen, wie etwas zu tun ist. Es geht um die Abfolge der Aufgaben – Variablen aktualisieren, Schleifen verwenden und Status direkt ändern.
Bei der funktionalen Programmierung konzentrieren Sie sich auf was Sie tun möchten. Sie verwenden reine Funktionen, vermeiden direkte Mutationen und nutzen deklarative Tools wie Zuordnen, Filtern und Reduzieren.
Sehen wir uns dies anhand von Beispielen nebeneinander anhand eines CRUD-Szenarios (Erstellen, Lesen, Aktualisieren, Löschen) zum Verwalten einer Benutzerliste an.
Hier ist ein zwingendes Beispiel, bei dem wir das ursprüngliche Array mutieren:
let users = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' } ]; function addUser(users, newUser) { users.push(newUser); // Directly modifies the array } addUser(users, { id: 3, name: 'Charlie' }); console.log(users);
Probleme:
Hier ist der funktionale Ansatz, bei dem wir ein neues Array zurückgeben, anstatt es zu mutieren:
const users = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' } ]; const addUser = (users, newUser) => [...users, newUser]; // Returns a new array const newUsers = addUser(users, { id: 3, name: 'Charlie' }); console.log('Original:', users); console.log('New:', newUsers);
Vorteile:
Hier ist ein Beispiel, bei dem wir ein Objekt innerhalb des Arrays direkt ändern:
let users = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' } ]; function updateUser(users, id, newName) { for (let i = 0; i < users.length; i++) { if (users[i].id === id) { users[i].name = newName; // Directly mutates the object break; } } } updateUser(users, 1, 'Alicia'); console.log(users);
Probleme:
So machen wir es funktional mit Karte und Unveränderlichkeit:
const users = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' } ]; const updateUser = (users, id, newName) => users.map(user => user.id === id ? { ...user, name: newName } : user ); const updatedUsers = updateUser(users, 1, 'Alicia'); console.log('Original:', users); console.log('Updated:', updatedUsers);
Vorteile:
Hier ist die zwingende Version mit einer Schleife und direkten Modifikationen:
let users = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' } ]; function addUser(users, newUser) { users.push(newUser); // Directly modifies the array } addUser(users, { id: 3, name: 'Charlie' }); console.log(users);
Probleme:
Mithilfe des Filters können wir die Absicht deklarativ ausdrücken:
const users = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' } ]; const addUser = (users, newUser) => [...users, newUser]; // Returns a new array const newUsers = addUser(users, { id: 3, name: 'Charlie' }); console.log('Original:', users); console.log('New:', newUsers);
Vorteile:
Aspect | Imperative | Functional |
---|---|---|
Data Mutation | Mutates the original data (e.g., push, splice) | Avoids mutation; creates new data structures |
Readability | Step-by-step, more verbose | Declarative and concise |
Side Effects | More prone to unexpected side effects | Pure functions eliminate side effects |
Focus | How to achieve a task (manual looping) | What to achieve (use higher-order functions) |
Tools Used | Loops, conditionals | map, filter, reduce, spread operator |
? Warum funktionale Programmierung wählen?
Ihr Code lässt sich einfacherüberlegen und testen. Durch die Vermeidung von Nebenwirkungen wird die Wahrscheinlichkeit von Fehlern verringert. Es ist prägnanter
undaussagekräftiger und reduziert die mentale Belastung.
Das obige ist der detaillierte Inhalt vonWas ist funktionale Programmierung und wie kann man sie in JavaScript umsetzen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!