Searching...
Français
English
Español
简体中文
Français
Deutsch
日本語
Português
Italiano
한국어
Русский
Nederlands
العربية
Polski
हिन्दी
Tiếng Việt
Svenska
Ελληνικά
Türkçe
ไทย
Čeština
Română
Magyar
Українська
Bahasa Indonesia
Dansk
Suomi
Български
עברית
Norsk
Hrvatski
Català
Slovenčina
Lietuvių
Slovenščina
Српски
Eesti
Latviešu
فارسی
മലയാളം
தமிழ்
اردو
Functional JavaScript

Functional JavaScript

Introducing Functional Programming with Underscore.js
by Michael Fogus 2013 258 pages
Programming
Technology
Computer Science
Écouter

Points clés

1. JavaScript prend en charge la programmation fonctionnelle grâce aux fonctions de première classe

Une fonction de première classe est une fonction qui peut être utilisée partout où n'importe quelle autre valeur peut être utilisée—il y a peu ou pas de restrictions.

Les fonctions comme valeurs. En JavaScript, les fonctions peuvent être assignées à des variables, passées en arguments à d'autres fonctions, retournées par des fonctions et stockées dans des structures de données. Cette flexibilité permet des techniques de programmation fonctionnelle. Par exemple :

  • Assigner une fonction à une variable : var square = function(x) { return x * x; }
  • Passer une fonction en argument : [1, 2, 3].map(function(x) { return x * 2; })
  • Retourner une fonction : function makeAdder(x) { return function(y) { return x + y; }; }

Cette nature de première classe des fonctions est la base de nombreux modèles de programmation fonctionnelle en JavaScript.

2. Les fonctions d'ordre supérieur sont essentielles à la programmation fonctionnelle en JavaScript

Les fonctions d'ordre supérieur qui capturent d'autres fonctions sont une technique très puissante pour construire des abstractions.

Abstractions puissantes. Les fonctions d'ordre supérieur prennent soit des fonctions en arguments, soit retournent des fonctions en résultats. Elles permettent des abstractions puissantes et la réutilisation du code. Des exemples courants incluent :

  • map : Transformer chaque élément d'une collection
  • reduce : Combiner les éléments d'une collection en une seule valeur
  • filter : Sélectionner des éléments d'une collection en fonction d'un prédicat

Ces fonctions vous permettent d'exprimer des opérations complexes de manière succincte et de composer des comportements. Par exemple :

const numbers = [1, 2, 3, 4, 5];
const evenSquares = numbers
  .filter(x => x % 2 === 0)
  .map(x => x * x);

Ce code exprime clairement l'intention de sélectionner les nombres pairs et de les élever au carré, sans gérer explicitement les boucles ou les tableaux intermédiaires.

3. Les fermetures permettent des techniques fonctionnelles puissantes en JavaScript

Une fermeture est une fonction qui capture les liaisons externes (c'est-à-dire, pas ses propres arguments) contenues dans la portée dans laquelle elle a été définie pour une utilisation ultérieure (même après que cette portée soit terminée).

Encapsulation et état. Les fermetures permettent aux fonctions de "se souvenir" et d'accéder aux variables de leur portée externe, même après que cette portée ait fini d'exécuter. Cela permet :

  • État privé : Créer des variables accessibles uniquement par des fonctions spécifiques
  • Usines de fonctions : Générer des fonctions spécialisées basées sur des paramètres
  • Application partielle : Créer de nouvelles fonctions en fixant certains arguments de fonctions existantes

Exemple d'une fermeture maintenant un état privé :

function counter() {
  let count = 0;
  return function() {
    return ++count;
  };
}

const increment = counter();
increment(); // 1
increment(); // 2

La variable count n'est pas directement accessible, mais la fonction retournée peut y accéder et la modifier.

4. La composition de fonctions permet de construire des comportements complexes à partir de parties simples

La programmation fonctionnelle consiste à démonter les programmes et à les réassembler à partir des mêmes parties, abstraites derrière des frontières de fonctions.

Construire la complexité. La composition de fonctions est le processus de combinaison de deux ou plusieurs fonctions pour créer une nouvelle fonction. Cela vous permet de :

  • Créer des comportements complexes à partir de parties simples et réutilisables
  • Améliorer la lisibilité du code en décomposant des opérations complexes
  • Améliorer la maintenabilité en isolant et en testant des unités de fonctionnalité plus petites

La composition peut être réalisée de différentes manières :

  • Composition manuelle : const f = x => h(g(x))
  • Fonctions utilitaires : const compose = (f, g) => x => f(g(x))
  • Bibliothèques comme Ramda ou Lodash/FP

Exemple de construction d'un pipeline de traitement de données par composition :

const processData = compose(
  summarize,
  filterOutliers,
  normalize,
  parseInput
);

Cela exprime clairement les étapes du traitement des données sans encombrer le code avec des détails d'implémentation.

5. Les fonctions pures et l'immutabilité conduisent à un code plus prévisible

Programmer avec des fonctions pures peut sembler incroyablement limitant. [...] Cependant, lorsque vous adoptez une vision libertaire de la mutation d'état, vous limitez en fait vos possibilités de composition, compliquez votre capacité à raisonner sur les effets de toute déclaration donnée et rendez plus difficile le test de votre code.

Prédictibilité et testabilité. Les fonctions pures produisent toujours la même sortie pour des entrées données et n'ont pas d'effets secondaires. Cela, combiné avec des données immuables :

  • Simplifie le raisonnement sur le comportement du code
  • Facilite les tests et le débogage
  • Permet une parallélisation et une mémoïsation sûres

Stratégies pour maintenir la pureté et l'immutabilité :

  • Utiliser const pour les variables qui ne doivent pas changer
  • Créer de nouveaux objets/tableaux au lieu de modifier ceux existants
  • Utiliser des bibliothèques comme Immutable.js pour des structures de données immuables efficaces

Exemple d'une fonction pure :

function addToCart(cart, item) {
  return [...cart, item];
}

Cette fonction ne modifie pas le panier original, ce qui facilite le suivi des changements et la prédiction du comportement.

6. La récursion offre une alternative aux boucles en programmation fonctionnelle

En utilisant la récursion, l'état est géré via les arguments de la fonction, et le changement est modélisé via les arguments d'un appel récursif à l'autre.

Solutions élégantes. La récursion conduit souvent à des solutions plus élégantes et concises pour les problèmes impliquant des structures hiérarchiques ou répétitives. Les avantages incluent :

  • Expression naturelle de certains algorithmes (par exemple, parcours d'arbre)
  • Évitement de l'état mutable souvent associé aux boucles
  • Potentiel pour des optimisations par le compilateur (optimisation des appels en queue)

Cependant, soyez conscient des risques de débordement de pile en JavaScript, qui manque d'optimisation des appels en queue dans la plupart des environnements. Les techniques pour atténuer cela incluent :

  • Trampolining : Envelopper les appels récursifs dans des thunks
  • Style de passage de continuation : Gérer explicitement la pile d'appels

Exemple d'une fonction récursive pour aplatir un tableau imbriqué :

function flatten(arr) {
  return arr.reduce((flat, next) => 
    flat.concat(Array.isArray(next) ? flatten(next) : next), 
  []);
}

7. La programmation fonctionnelle facilite les flux de données et les pipelines de transformation

Les pipelines sont censés être purs—aucune donnée n'a été endommagée en les traversant.

Transformations de données claires. La programmation fonctionnelle encourage à penser en termes de données circulant à travers une série de transformations. Cette approche :

  • Améliore la lisibilité du code en montrant clairement les étapes du traitement des données
  • Améliore la maintenabilité en séparant les préoccupations
  • Facilite la parallélisation et l'optimisation

Techniques pour construire des pipelines :

  • Chaînage de méthodes (par exemple, avec lodash)
  • Composition de fonctions pures
  • Bibliothèques spécialisées comme RxJS pour les flux de données asynchrones

Exemple d'un pipeline de traitement de commandes :

const processOrders = pipe(
  fetchOrders,
  filterValidOrders,
  calculateTotals,
  generateReport
);

Cela montre clairement les étapes impliquées dans le traitement des commandes sans s'enliser dans les détails d'implémentation.

8. La conception basée sur les mixins offre une approche fonctionnelle de la composition d'objets

Les données simples sont les meilleures. Les types de données spécialisés devraient être, eh bien, spéciaux.

Composition flexible. Les mixins fournissent un moyen de composer le comportement des objets sans s'appuyer sur l'héritage classique. Cette approche :

  • Permet une conception de code plus flexible et modulaire
  • Évite les problèmes associés aux hiérarchies d'héritage profondes
  • Facilite un style de programmation orienté objet plus fonctionnel

Implémentation des mixins en JavaScript :

  • Utiliser Object.assign() pour copier des méthodes sur les prototypes d'objets
  • Employer des fonctions d'ordre supérieur pour créer des fonctions usines qui appliquent des mixins

Exemple de création d'un objet avec des mixins :

const withLogging = (obj) => ({
  ...obj,
  log: (msg) => console.log(`[${obj.name}]: ${msg}`)
});

const withValidator = (obj) => ({
  ...obj,
  validate: () => { /* logique de validation */ }
});

const createUser = (name) => 
  withValidator(withLogging({ name, data: {} }));

Cette approche permet une composition flexible du comportement des objets sans hiérarchies de classes rigides.

Last updated:

Avis

4.07 out of 5
Average of 100+ ratings from Goodreads and Amazon.

Functional JavaScript reçoit majoritairement des avis positifs, avec une note moyenne de 4,07 sur 5. Les lecteurs apprécient sa clarté dans l'explication des concepts de programmation fonctionnelle en JavaScript, louant son approche directe et ses exemples pratiques. Beaucoup le trouvent révélateur et précieux pour améliorer leurs compétences en codage. Certains critiques soulignent sa densité et le recommandent aux programmeurs de niveau intermédiaire à avancé. Bien que quelques-uns critiquent sa dépendance à Underscore.js et remettent en question son applicabilité dans le monde réel, la plupart s'accordent à dire que c'est une introduction solide aux techniques de programmation fonctionnelle en JavaScript.

À propos de l'auteur

Michael Fogus est un développeur logiciel expérimenté et auteur reconnu pour son expertise en programmation fonctionnelle. Il a écrit plusieurs livres sur la programmation, dont "The Joy of Clojure" et "Functional JavaScript". Fogus est respecté pour sa capacité à expliquer des concepts complexes de manière claire et concise. Son travail se concentre souvent sur l'application des principes de la programmation fonctionnelle à divers langages, en particulier JavaScript. Fogus est également connu pour ses contributions à la communauté Clojure et son implication dans le développement de langages de programmation. Son style d'écriture est loué pour sa simplicité et son caractère éclairant, rendant des sujets difficiles accessibles aux lecteurs de différents niveaux d'expérience.

0:00
-0:00
1x
Create a free account to unlock:
Bookmarks – save your favorite books
History – revisit books later
Ratings – rate books & see your ratings
Listening – audio summariesListen to the first takeaway of every book for free, upgrade to Pro for unlimited listening.
Unlock unlimited listening
Your first week's on us!
Today: Get Instant Access
Listen to full summaries of 73,530 books. That's 12,000+ hours of audio!
Day 5: Trial Reminder
We'll send you a notification that your trial is ending soon.
Day 7: Your subscription begins
You'll be charged on Sep 29,
cancel anytime before.
Compare Features Free Pro
Read full text summaries
Summaries are free to read for everyone
Listen to full summaries
Free users can listen to the first takeaway only
Unlimited Bookmarks
Free users are limited to 10
Unlimited History
Free users are limited to 10
What our users say
15,000+ readers
“...I can 10x the number of books I can read...”
“...exceptionally accurate, engaging, and beautifully presented...”
“...better than any amazon review when I'm making a book-buying decision...”
Save 62%
Yearly
$119.88 $44.99/yr
$3.75/mo
Monthly
$9.99/mo
Try Free & Unlock
7 days free, then $44.99/year. Cancel anytime.