Maison > interface Web > js tutoriel > Qu'est-ce que la programmation fonctionnelle et comment pouvez-vous la faire en JavaScript ?

Qu'est-ce que la programmation fonctionnelle et comment pouvez-vous la faire en JavaScript ?

Linda Hamilton
Libérer: 2024-12-18 14:05:11
original
905 Les gens l'ont consulté

What is Functional Programming, and How Can You Do It in JavaScript?

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.


? Quelle est la différence entre fonctionnel et impératif ?

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.


?️ Exemple 1 : Ajouter un utilisateur

Voie Impérative

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);
Copier après la connexion
Copier après la connexion

Problèmes :

  1. Mutation : La méthode push() modifie le tableau d'origine.
  2. Effets secondaires : Si d'autres parties du code dépendent des utilisateurs, elles peuvent être affectées de manière inattendue.

Manière fonctionnelle

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);
Copier après la connexion
Copier après la connexion

Avantages :

  1. Aucune mutation : le tableau des utilisateurs d'origine reste intact.
  2. Prévisible : les fonctions pures facilitent la compréhension du comportement.

?️ Exemple 2 : Mise à jour d'un utilisateur

Voie Impérative

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);
Copier après la connexion

Problèmes :

  1. Mutation : L'objet à l'intérieur du tableau est directement mis à jour.
  2. Verbosité : La boucle for indique explicitement à l'ordinateur comment mettre à jour l'utilisateur.

Manière fonctionnelle

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);
Copier après la connexion

Avantages :

  1. Pas de mutation : nous renvoyons un nouveau tableau et laissons l'original intact.
  2. Déclaratif : la carte se concentre sur ce que nous voulons – transformer le tableau – sans gérer explicitement les boucles.

?️ Exemple 3 : Supprimer un utilisateur

Voie Impérative

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);
Copier après la connexion
Copier après la connexion

Problèmes :

  1. Mutation : splice() modifie le tableau d'origine.
  2. Complexité : La boucle manuelle rend la lecture plus difficile.

Manière fonctionnelle

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);
Copier après la connexion
Copier après la connexion

Avantages :

  1. Aucune mutation : le filtre crée un nouveau tableau.
  2. Propre et lisible  : le code communique clairement l'intention : conserver les utilisateurs à l'exception de celui avec l'ID donné.

? Tableau récapitulatif : fonctionnel vs impératif

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
Aspect
Impératif

Fonctionnel
ête> Mutation des données
    Mute les données d'origine (par exemple, push, splice) Évite la mutation ; crée de nouvelles structures de données
  • Lisibilité
  • Pas à pas, plus détaillé Déclaratif et concis Effets secondaires Plus sujet aux effets secondaires inattendus Les fonctions pures éliminent les effets secondaires
  • Concentration
  • Comment réaliser une tâche (bouclage manuel)
  • Quoi réaliser (utiliser des fonctions d'ordre supérieur) Outils utilisés Boucles, conditions opérateur mapper, filtrer, réduire, répartir

    ? 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

    et

    déclaratif, réduisant ainsi la charge mentale.

    Vous : « Compris ! La programmation fonctionnelle se concentre sur l’écriture de code prévisible et propre sans mutation des données. Et c’est plus facile à lire ! » Moi : Exactement ! En passant de impératif à fonctionnel, vous débloquerez la véritable puissance de JavaScript. Commencez petit : utilisez la cartographie, le filtre et la réduction - et bientôt vous coderez fonctionnellement comme un pro. Prêt à essayer ? Votre futur moi vous remerciera ! ?

    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!

    source:dev.to
    Déclaration de ce site Web
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
    Derniers articles par auteur
    Tutoriels populaires
    Plus>
    Derniers téléchargements
    Plus>
    effets Web
    Code source du site Web
    Matériel du site Web
    Modèle frontal