Callbacks et foncteurs en javascript
Callback
Définition
Une callback est une fonction passée en paramètre d'une autre fonction.Avantage
Une callback sert à factoriser du code.Par exemple, "trier une liste du plus petit au plus grand élément" et "trier une liste du plus grand au plus petit élément", sont deux problèmes similaires : on change juste la relation d'ordre
<par
>. Il suffit donc d'implémenter une seule fonction de tri prenant en paramètre cette relation d'ordre pour traiter les deux problèmes avec le même code.
Exemple
Dans l'exemple qui suit,computeattend une callback
fet deux valeurs
aet
b.
function add(a, b) { return a + b; } function mult(a, b) { return a * b; } function compute(f, a, b) { r = f(a, b); document.write(r); } compute(add, 3, 5); // Displays 8 compute(mult, 4, 7); // Displays 28
Foncteur
Définition
Un foncteur est un objet qui possède un constructeur et une fonction permettant de l'appeler au même titre qu'une fonction. C'est donc une généralisation directe de la callback (qui n'a pas de notion de constructeur). En mathématiques, cela correspond à la notion de fonction paramétrée :- Le paramètre de la fonction correspond à ce qui est passé à la construction du foncteur (cela correspond à la méthode
__init__
en python). - Le foncteur est ensuite passé en argument à l'algorithme au même titre qu'une callback ordinaire (cela correspond à la méthode
__call__
en python).
Avantage
Contrairement à une callback, le foncteur est paramétrable lors de son initialisation.Principe
En javascript :- un objet se déclare comme une fonction. Les paramètres de la fonctions correspondent au paramètres du constructeur en C++ ou de
__init__
en python ; - un foncteur se réalise en s'appuyant sur la notion de closure.
Exemple
Dans cet exemple, la fonctioncomputeprend en paramètre une fonction à deux arguments
aet
b.
function compute(f, a, b) { y = f(a, b); document.write(y); }
On souhaite à présent qu'au moment d'écrire
y, celui-ci soit précédé par
let suivi par
rsans modifier le code de
compute.
Pour cela, on définit un foncteur
Adddont le constructeur prendra en argument
l(valant
"<") et
r(valant
">").On nomme
addl'instance du foncteur que l'on crée.
function Add(l, r) { /* Like __init__ */ return function(a, b) { /* Like __call__ */ return l + (a + b) + r; } } add = Add("<", ">");
On peut désormais appeler
computeet lui passer
adden paramètre. Les valeurs de
aet
bsont reçues en argument par
computequi lui-même appelle le foncteur
add. Le foncteur exécute à son tour la fonction qu'il enveloppe.
compute(add, 3, 5); // Displays <8> compute(add, 4, 7); // Displays <28>
Foncteurs et autres langages
En C++ ou python, un foncteur se réalise en déclarant un objet.- En C++, cet objet implémente
operator()
. - En python, il implémente la méthode
__call__
.