Maison interface Web js tutoriel JavaScript – Quel est le problème avec la programmation fonctionnelle ?

JavaScript – Quel est le problème avec la programmation fonctionnelle ?

Aug 05, 2024 pm 10:57 PM

JavaScript est un langage polyvalent qui prend en charge plusieurs paradigmes de programmation. Comprendre ces paradigmes peut aider les développeurs à choisir la meilleure approche pour résoudre différents problèmes. Les principaux paradigmes de programmation comprennent :

  1. Impératif : se concentre sur la façon d'effectuer les tâches (étape par étape).
  2. Procédural : Comme impératif, mais avec des procédures réutilisables.
  3. Orienté objet : organisation du code en objets réutilisables.
  4. Déclaratif : se concentre sur ce que le programme doit accomplir.
  5. Fonctionnel : Traiter le calcul comme des fonctions mathématiques (notre star du spectacle aujourd'hui !).

Dans cet article, nous explorerons la programmation fonctionnelle en JavaScript, un paradigme puissant qui met l'accent sur les fonctions pures, les fonctions d'ordre supérieur et l'immuabilité.

1. Fonctions pures

Une fonction pure est une fonction où la valeur de sortie est déterminée uniquement par ses valeurs d'entrée, sans effets secondaires observables.

Déterministe : Pour la même entrée, la fonction produit toujours la même sortie.
Aucun effet secondaire : La fonction ne modifie aucun état externe (par exemple, variables globales, paramètres d'entrée).

Exemple :

// Pure function
function add(a, b) {
  return a + b;
}

// Impure function
let count = 0;
function increment() {
  count += 1;
  return count;
}
Copier après la connexion

Dans l'exemple ci-dessus, add est une fonction pure car elle renvoie toujours le même résultat pour les mêmes entrées et ne modifie aucun état externe. En revanche, l'incrément est une fonction impure car elle modifie le nombre de variables externes.

2. Fonctions d'ordre supérieur

Une fonction d'ordre supérieur est une fonction qui peut prendre d'autres fonctions comme arguments et/ou renvoyer des fonctions comme résultat.

Fonction comme arguments : peut accepter des fonctions comme paramètres d'entrée.
Fonction comme valeurs de retour : peut renvoyer une fonction en tant que sortie.

Exemple :

// Higher-order function
function applyOperation(a, b, operation) {
  return operation(a, b);
}

// Function to be used as an argument
function multiply(x, y) {
  return x * y;
}

// Using the higher-order function
const result = applyOperation(5, 3, multiply); // Output: 15
Copier après la connexion

Dans cet exemple, applyOperation est une fonction d'ordre supérieur car elle prend une fonction (opération) comme argument.

3. Immuabilité

L'immuabilité fait référence au concept selon lequel les données ne peuvent pas être modifiées une fois créées. Au lieu de modifier les structures de données existantes, de nouvelles sont créées.

Aucune mutation : Les structures de données ne sont pas modifiées après la création.
Copier et modifier : les opérations créent de nouvelles structures de données avec les modifications souhaitées.

Exemple :

// Mutable object
let user = { name: 'Alice', age: 25 };
user.age = 26; // Mutation

// Immutable object using Object.assign
const newUser = Object.assign({}, user, { age: 26 });
console.log(newUser); // Output: { name: 'Alice', age: 26 }
Copier après la connexion

Dans cet exemple, au lieu de modifier directement l'objet utilisateur, un nouvel objet newUser est créé avec l'âge mis à jour.

Quel est le problème avec la programmation fonctionnelle ?

JavaScript - What

Maintenant, imaginez que vous concoctez du code (supportez-moi, nous allons ici dans une métaphore complète). La programmation impérative, c'est comme préparer un repas en donnant des instructions étape par étape : "Hachez les oignons, puis faites-les revenir, puis ajoutez l'ail..." La programmation fonctionnelle, en revanche, c'est comme avoir une équipe de chefs spécialisés, chacun perfectionnant une partie du plat. Dites-leur simplement ce que vous voulez, et voilà ! La magie culinaire opère.

Avez-vous déjà eu l'impression que votre code était un enchevêtrement de boucles for et d'instructions if ? Eh bien, attachez votre ceinture, car nous sommes sur le point de nous lancer dans un voyage magique dans le monde de la programmation fonctionnelle (FP) en JavaScript. C'est comme transformer votre code spaghetti en un repas gastronomique ! ?➡️?

Voyons cette magie de la cuisine en action avec quelques exemples de code savoureux !

Pour comprendre les avantages de la programmation fonctionnelle, comparons-la avec le style impératif plus traditionnel :

Transformation de tableau : apéritif

Style impératif (La cuisine à l'ancienne) :

const veggies = ['carrot', 'broccoli', 'cauliflower'];
const cookedVeggies = [];
for (let i = 0; i < veggies.length; i++) {
    cookedVeggies.push(`cooked ${veggies[i]}`);
}
Copier après la connexion

Style fonctionnel (La cuisine moderne) :

const veggies = ['carrot', 'broccoli', 'cauliflower'];
const cookedVeggies = veggies.map(veggie => `cooked ${veggie}`);
Copier après la connexion

Vous voyez comment nous avons transformé cette boucle for maladroite en un one-liner élégant ? C'est la beauté de FP : c'est comme si un sous-chef (carte) faisait tout le travail répétitif à votre place !

Inversion de la pile de crêpes : renverser la tour du petit-déjeuner

Imaginez que vous êtes un artiste de crêpes et que vous venez de créer une imposante pile de crêpes avec des lettres écrites sur chacune d'elles. Vous souhaitez maintenant retourner toute la pile pour lire le message de bas en haut. Voyons comment nous pouvons faire cela avec du code !

Style impératif (le flipper à crêpes à l'ancienne) :

function flipPancakeStack(stack) {
    let flippedStack = '';
    for (let i = stack.length - 1; i >= 0; i--) {
        flippedStack += stack[i];
    }
    return flippedStack;
}

const originalStack = "PANCAKE";
const flippedStack = flipPancakeStack(originalStack);
console.log(flippedStack); // "EKACNAP"
Copier après la connexion

Dans cette approche, nous retournons manuellement chaque crêpe une par une, du haut de la pile vers le bas. Cela fonctionne, mais cela demande un peu de travail, n'est-ce pas ? Imaginez retourner une grande pile de cette façon !

Style fonctionnel (la machine à retourner les crêpes en douceur) :

const flipPancakeStack = str => 
    str.split('').reduce((reversed, char) => char + reversed, '');

const originalStack = "PANCAKE";
const flippedStack = flipPancakeStack(originalStack);
console.log(flippedStack); // "EKACNAP"
Copier après la connexion

Wow! Look at that smooth operator! ? We've turned our string into an array of characters, then used the reduce function to flip our pancake in one sweeping motion. Here's what's happening:

  1. split('') turns our string into an array of characters.
  2. reduce goes through each character, adding it to the front of our accumulating result.
  3. We start with an empty string '' and build it up, character by character.

It's like having a fancy pancake-flipping robot that assembles the pancake in reverse as it goes along. No manual flipping required!

The Beauty of Functional Flipping

Notice how our functional approach doesn't use any loops or temporary variables. It's a single expression that flows from left to right. This makes it:

  1. More readable: Once you're used to reduce, this reads almost like English.
  2. Immutable: We're not changing any existing data, just creating new strings.
  3. Shorter: We've reduced our function to a single, powerful line.

Remember, in the kitchen of code, it's not just about getting the job done – it's about style, efficiency, and leaving a clean workspace. Our functional pancake flipper does all three!

Main Course: Curry Transformation Feast

Now, let's spice things up with some Indian cuisine! Imagine we're running a bustling Indian restaurant, and we need to transform our thali menu. We want to adjust spice levels, filter out dishes based on dietary preferences, and format the names for our trendy menu board.

Imperative Style (The frazzled curry chef):

const thaliMenu = [
    { name: 'Butter Chicken', spiceLevel: 2, vegetarian: false, available: true },
    { name: 'Palak Paneer', spiceLevel: 1, vegetarian: true, available: true },
    { name: 'Lamb Vindaloo', spiceLevel: 4, vegetarian: false, available: false },
    { name: 'Dal Makhani', spiceLevel: 1, vegetarian: true, available: true },
    { name: 'Chicken Tikka Masala', spiceLevel: 3, vegetarian: false, available: true }
];

const veggieSpicyMenu = [];
for (let i = 0; i < thaliMenu.length; i++) {
    if (thaliMenu[i].vegetarian && thaliMenu[i].available) {
        let dish = {
            name: thaliMenu[i].name.toUpperCase().replace(/ /g, '_'),
            spiceLevel: thaliMenu[i].spiceLevel + 1
        };
        if (dish.spiceLevel > 5) dish.spiceLevel = 5;
        veggieSpicyMenu.push(dish);
    }
}
Copier après la connexion

Functional Style (The Michelin-star tandoor master):

const thaliMenu = [
    { name: 'Butter Chicken', spiceLevel: 2, vegetarian: false, available: true },
    { name: 'Palak Paneer', spiceLevel: 1, vegetarian: true, available: true },
    { name: 'Lamb Vindaloo', spiceLevel: 4, vegetarian: false, available: false },
    { name: 'Dal Makhani', spiceLevel: 1, vegetarian: true, available: true },
    { name: 'Chicken Tikka Masala', spiceLevel: 3, vegetarian: false, available: true }
];

const veggieSpicyMenu = thaliMenu
    .filter(dish => dish.vegetarian && dish.available)
    .map(dish => ({
        name: dish.name.toUpperCase().replace(/ /g, '_'),
        spiceLevel: Math.min(dish.spiceLevel + 1, 5)
    }));
Copier après la connexion

?✨ We've just transformed our thali menu with the grace of a yoga master. The functional approach reads like a recipe from a classic Indian cookbook: "Filter the vegetarian and available dishes, then map them to new objects with formatted names and increased spice levels." It's a recipe for code that's as aromatic and delightful as the dishes it describes!

Dessert: Async Chai Brewing Symphony

For our final course, let's steep ourselves in the art of asynchronous chai brewing. Imagine we're creating a smart chai maker that needs to check tea leaves, heat water, and blend spices, all in perfect harmony.

Imperative Style (The flustered chai wallah):

function brewChai(teaType, callback) {
    checkTeaLeaves(teaType)
        .then(leaves => {
            if (leaves.quality === 'good') {
                heatWater(leaves.requiredTemperature)
                    .then(water => {
                        blendSpices(teaType)
                            .then(spices => {
                                const chai = mixChaiIngredients(leaves, water, spices);
                                callback(null, chai);
                            })
                            .catch(error => callback(error));
                    })
                    .catch(error => callback(error));
            } else {
                callback(new Error('Tea leaves are not of good quality'));
            }
        })
        .catch(error => callback(error));
}
Copier après la connexion

Functional Style (The serene chai master):

const brewChai = teaType =>
    checkTeaLeaves(teaType)
        .then(leaves => 
            leaves.quality === 'good'
                ? Promise.all([
                    Promise.resolve(leaves),
                    heatWater(leaves.requiredTemperature),
                    blendSpices(teaType)
                  ])
                : Promise.reject(new Error('Tea leaves are not of good quality'))
        )
        .then(([leaves, water, spices]) => mixChaiIngredients(leaves, water, spices));
Copier après la connexion

Wah, what a beautiful symphony! ?? We've just orchestrated a complex chai brewing process into a smooth, promise-based operation. It's like watching a graceful kathak dance – each step flows seamlessly into the next, creating a perfect blend of flavors and aromas.

The Secret Masala: Why FP is the Chef's Kiss ?‍??

  • Readability: FP code often reads like a story. "Filter this, map that, reduce those." It's like writing a recipe for your future self (or your poor colleague who has to maintain your code).
  • Predictability: Pure functions always return the same output for a given input. No surprises, no "it worked on my machine" mysteries.
  • Testability: Since FP emphasizes pure functions, testing becomes a breeze. It's like being able to taste each ingredient separately before combining them.
  • Conciseness: As we've seen, FP can often express complex operations in just a few lines. Less code means fewer bugs and easier maintenance.
  • Composition: You can combine simple functions to create complex behaviors, like stacking Lego bricks to build a castle. ?

Wrapping Up Our Functional Feast

There you have it, folks! We've transformed our code from a fast-food joint to a Michelin-star restaurant. Functional programming in JavaScript isn't just about writing less code; it's about writing code that's easier to understand, test, and maintain.

Remember, you don't have to go full Gordon Ramsay and remake your entire codebase overnight. Start small – try using map instead of a for-loop, or break a complex function into smaller, pure functions. Before you know it, you'll be whipping up functional programming delicacies that would make any code chef proud!

Now, go forth and func-tionalize! May your code be pure, your functions be high-order, and your bugs be few.

Happy coding, and may the func be with you! ??
JavaScript - What

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!

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Que dois-je faire si je rencontre l'impression de code brouillé pour les reçus en papier thermique frontal? Que dois-je faire si je rencontre l'impression de code brouillé pour les reçus en papier thermique frontal? Apr 04, 2025 pm 02:42 PM

Des questions et des solutions fréquemment posées pour l'impression de billets thermiques frontaux pour le développement frontal, l'impression de billets est une exigence commune. Cependant, de nombreux développeurs mettent en œuvre ...

Démystifier javascript: ce qu'il fait et pourquoi c'est important Démystifier javascript: ce qu'il fait et pourquoi c'est important Apr 09, 2025 am 12:07 AM

JavaScript est la pierre angulaire du développement Web moderne, et ses principales fonctions incluent la programmation axée sur les événements, la génération de contenu dynamique et la programmation asynchrone. 1) La programmation axée sur les événements permet aux pages Web de changer dynamiquement en fonction des opérations utilisateur. 2) La génération de contenu dynamique permet d'ajuster le contenu de la page en fonction des conditions. 3) La programmation asynchrone garantit que l'interface utilisateur n'est pas bloquée. JavaScript est largement utilisé dans l'interaction Web, les applications à une page et le développement côté serveur, améliorant considérablement la flexibilité de l'expérience utilisateur et du développement multiplateforme.

Qui est payé plus de python ou de javascript? Qui est payé plus de python ou de javascript? Apr 04, 2025 am 12:09 AM

Il n'y a pas de salaire absolu pour les développeurs Python et JavaScript, selon les compétences et les besoins de l'industrie. 1. Python peut être davantage payé en science des données et en apprentissage automatique. 2. JavaScript a une grande demande dans le développement frontal et complet, et son salaire est également considérable. 3. Les facteurs d'influence comprennent l'expérience, la localisation géographique, la taille de l'entreprise et les compétences spécifiques.

Comment réaliser des effets de défilement de parallaxe et d'animation des éléments, comme le site officiel de Shiseido?
ou:
Comment pouvons-nous réaliser l'effet d'animation accompagné d'un défilement de page comme le site officiel de Shiseido? Comment réaliser des effets de défilement de parallaxe et d'animation des éléments, comme le site officiel de Shiseido? ou: Comment pouvons-nous réaliser l'effet d'animation accompagné d'un défilement de page comme le site officiel de Shiseido? Apr 04, 2025 pm 05:36 PM

La discussion sur la réalisation des effets de défilement de parallaxe et d'animation des éléments dans cet article explorera comment réaliser le site officiel de Shiseido (https://www.shiseido.co.jp/sb/wonderland/) ...

JavaScript est-il difficile à apprendre? JavaScript est-il difficile à apprendre? Apr 03, 2025 am 12:20 AM

Apprendre JavaScript n'est pas difficile, mais c'est difficile. 1) Comprendre les concepts de base tels que les variables, les types de données, les fonctions, etc. 2) Master la programmation asynchrone et les implémenter via des boucles d'événements. 3) Utilisez les opérations DOM et promettez de gérer les demandes asynchrones. 4) Évitez les erreurs courantes et utilisez des techniques de débogage. 5) Optimiser les performances et suivre les meilleures pratiques.

L'évolution de JavaScript: tendances actuelles et perspectives d'avenir L'évolution de JavaScript: tendances actuelles et perspectives d'avenir Apr 10, 2025 am 09:33 AM

Les dernières tendances de JavaScript incluent la montée en puissance de TypeScript, la popularité des frameworks et bibliothèques modernes et l'application de WebAssembly. Les prospects futurs couvrent des systèmes de type plus puissants, le développement du JavaScript côté serveur, l'expansion de l'intelligence artificielle et de l'apprentissage automatique, et le potentiel de l'informatique IoT et Edge.

Comment fusionner les éléments du tableau avec le même ID dans un seul objet en utilisant JavaScript? Comment fusionner les éléments du tableau avec le même ID dans un seul objet en utilisant JavaScript? Apr 04, 2025 pm 05:09 PM

Comment fusionner les éléments du tableau avec le même ID dans un seul objet en JavaScript? Lors du traitement des données, nous rencontrons souvent la nécessité d'avoir le même ID ...

Zustand Asynchronous Operation: Comment assurer le dernier État obtenu par Usestore? Zustand Asynchronous Operation: Comment assurer le dernier État obtenu par Usestore? Apr 04, 2025 pm 02:09 PM

Problèmes de mise à jour des données dans les opérations asynchrones de Zustand. Lorsque vous utilisez la bibliothèque de gestion de l'État de Zustand, vous rencontrez souvent le problème des mises à jour de données qui entraînent des opérations asynchrones prématurées. � ...

See all articles