Vous : « Hé, j'entends constamment parler de programmation fonctionnelle. Cela a l'air cool, mais qu'est-ce que c'est vraiment et en quoi est-ce différent de ce que je fais déjà en JavaScript ? »
Moi : Excellente question ! Décomposons-le étape par étape et comparons la programmation fonctionnelle (FP) avec la méthode impérative traditionnelle de codage.
En programmation impérative, vous écrivez des instructions étape par étape sur comment faire quelque chose. Tout dépend de la séquence de tâches : mise à jour des variables, utilisation de boucles et modification directe de l'état.
Dans la programmation fonctionnelle, vous vous concentrez sur ce que vous voulez faire. Vous utilisez des fonctions pures, évitez les mutations directes et exploitez des outils déclaratifs tels que mapper, filtrer et réduire.
Voyons cela avec des exemples côte à côte utilisant un scénario CRUD (Créer, Lire, Mettre à jour, Supprimer) pour gérer une liste d'utilisateurs.
Voici un exemple impératif où nous modifions le tableau d'origine :
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);
Problèmes :
Voici l'approche fonctionnelle, où nous renvoyons un nouveau tableau au lieu de le muter :
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);
Avantages :
Voici un exemple où nous modifions directement un objet à l'intérieur du tableau :
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);
Problèmes :
Voici comment nous procédons fonctionnellement en utilisant la carte et l'immuabilité :
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);
Avantages :
Voici la version impérative utilisant une boucle et des modifications directes :
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);
Problèmes :
En utilisant le filtre, nous pouvons exprimer l'intention de manière déclarative :
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);
Avantages :
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 |
? Pourquoi choisir la programmation fonctionnelle ?
Votre code devient plus facile àraisonner et à tester. Éviter les effets secondaires rend les bugs moins probables. C'est plus concis
etdéclaratif, réduisant ainsi la charge mentale.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!