|
| 1 | +L’application partielle vous permet de créer de nouvelles fonctions à partir de fonctions existantes, en pré-remplissant tout ou partie de leurs arguments. Une fois les arguments pré-remplis définis, vous obtenez une nouvelle fonction qui n’attend plus que les éventuels arguments restants pour exécuter la fonction d’origine. |
| 2 | + |
| 3 | +Plus formellement : l’application partielle désigne le pré-remplissage d’arguments d’une fonction pour produire une fonction de moindre arité. |
| 4 | + |
| 5 | +À titre d’exemple, imaginons que nous avons une fonction `add()` qui accepte deux arguments et renvoie leur somme : |
| 6 | + |
| 7 | +```js |
| 8 | +function add(x, y) { |
| 9 | + return x + y |
| 10 | +} |
| 11 | + |
| 12 | +add(10, 20) // => 30 |
| 13 | +``` |
| 14 | + |
| 15 | +À présent, imaginons que nous disposons d’une fonction `partiallyApply()`. Celle-ci reçoit une fonction et quelques arguments qu’elle « applique partiellement » (qu’elle pré-remplit, en somme). |
| 16 | + |
| 17 | +Dans le code qui suit, nous pré-remplissons le premier argument de notre fonction `add()`, à savoir `x` : |
| 18 | + |
| 19 | +```js |
| 20 | +var addTen = partiallyApply(add, 10) // pré-remplit `x` à 10 |
| 21 | +``` |
| 22 | + |
| 23 | +`addTen()` est une nouvelle fonction, qui n’a plus besoin que du paramètre `y` de `add()`. `add()` n’a pas encore été appelée ! |
| 24 | + |
| 25 | +Une fois que nous passons l’argument pour `y`, la fonction `add()` originale peut être appelée : |
| 26 | + |
| 27 | +```js |
| 28 | +addTen(20) // => 30 |
| 29 | +addTen(100) // => 110 |
| 30 | +addTen(0) // => 10 |
| 31 | +// etc. |
| 32 | +``` |
| 33 | + |
| 34 | +Tous les exemples ci-dessus reviennent à appeler `add(10, y)`, ou `y` serait fourni dans l’appel à la bien-nommée `addTen()`. |
| 35 | + |
| 36 | +# Défi |
| 37 | + |
| 38 | +Utilisez l’application partielle pour créer une fonction qui pré-remplit un premier argument pour `console.log()`. En somme, implémentez une fonction de log qui préfixe son message. |
| 39 | + |
| 40 | +Votre implémentation doit accepter une `String` de préfixe, et renvoyer une fonction qui affichera les contenus qu’on lui passe sur la console, préfixée par cette `String`. |
| 41 | + |
| 42 | +Vous aurez besoin de `Function#apply()` pour implémenter l’application partielle. |
| 43 | + |
| 44 | +Assurez-vous que **tous** les arguments passés à la fonction de log (celle renvoyée par la fonction que vous allez écrire) sont bien affichés. |
| 45 | + |
| 46 | +**Affichez le résultat directement sur la console.** |
| 47 | + |
| 48 | +## Arguments |
| 49 | + |
| 50 | +* `namespace` : une `String` qui préfixe les messages passés à la fonction qui sera retournée. |
| 51 | + |
| 52 | +## Exemple |
| 53 | + |
| 54 | +```js |
| 55 | +var info = logger('INFO :') |
| 56 | +info('ceci est un message d’information') |
| 57 | +// INFO : ceci est un message d’information |
| 58 | + |
| 59 | +var warn = logger('WARN :') |
| 60 | +warn('ceci est un avertissement', 'avec du rab') |
| 61 | +// WARN : ceci est un avertissement avec du rab |
| 62 | +``` |
| 63 | + |
| 64 | +## Conditions |
| 65 | + |
| 66 | +* N’utilisez pas `Function#bind()` |
| 67 | +* Utilisez `Function#apply()` |
| 68 | + |
| 69 | +## Base de travail |
| 70 | + |
| 71 | +```js |
| 72 | +var slice = Array.prototype.slice |
| 73 | + |
| 74 | +function logger(namespace) { |
| 75 | + // VOTRE SOLUTION ICI |
| 76 | +} |
| 77 | + |
| 78 | +module.exports = logger |
| 79 | +``` |
| 80 | + |
| 81 | +## Ressources |
| 82 | + |
| 83 | +* https://en.wikipedia.org/wiki/Partial_application |
| 84 | +* https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Function/apply |
| 85 | + |
| 86 | +## Conseils |
| 87 | + |
| 88 | +Gardez à l’esprit que `console.log()` accepte un nombre quelconque d’arguments et les affiche, séparés par des espaces : |
| 89 | + |
| 90 | +```js |
| 91 | +console.log('bonjour', 'monde') // => 'bonjour monde' |
| 92 | +console.log(1, 2, 3) // => 1 2 3 |
| 93 | +``` |
| 94 | + |
| 95 | +Nous voulons simplement pré-remplir le premier argument de `console.log()`. |
| 96 | + |
| 97 | +`Function#apply()` nous permet d’exécuter une fonction, en fournissant une valeur spécifique pour `this` (ce qu’on peut royalement ignorer sur ce coup), puis un **tableau d’arguments à passer à la fonction** : |
| 98 | + |
| 99 | +```js |
| 100 | +add(10, 20) // => 30 |
| 101 | +add.apply(null, [10, 20]) // => 30 |
| 102 | +``` |
| 103 | + |
| 104 | +Faites bien la différence entre `apply()` et `call()` : |
| 105 | + |
| 106 | +```js |
| 107 | +add.apply(null, [10, 20]) // => 30 |
| 108 | +add.call(null, 10, 20) // => 30 |
| 109 | +``` |
0 commit comments