Un objet, dans sa forme la plus simple, est juste une collection d'états et de fonctions qui opèrent sur ces états. Une fermeture est également une collection d'états et une fonction qui opère sur ces états.
Disons que j'appelle une fonction qui prend un callback. Dans ce callback, j'ai besoin d'opérer sur un état connu avant l'appel de la fonction. Je peux créer un objet qui incarne cet état ("fields") et contient une fonction membre ("method") qui fait office de callback. Ou bien, je peux prendre la voie rapide et facile (celle du pauvre) et créer une fermeture.
En tant qu'objet :
class CallbackState{
object state;
public CallbackState(object state){this.state = state;}
public void Callback(){
// do something with state
}
}
void Foo(){
object state = GenerateState();
CallbackState callback = new CallbackState(state);
PerformOperation(callback.Callback);
}
Il s'agit d'un pseudo-C#, mais son concept est similaire à celui d'autres langages OO. Comme vous pouvez le voir, il y a une bonne quantité de texte passe-partout impliqué dans la classe de rappel pour gérer l'état. Ce serait beaucoup plus simple en utilisant une fermeture :
void Foo(){
object state = GenerateState();
PerformOperation(()=>{/*do something with state*/});
}
Il s'agit d'un lambda (encore une fois, dans la syntaxe C#, mais le concept est similaire dans d'autres langages qui supportent les fermetures) qui nous donne toutes les capacités de la classe, sans avoir à écrire, utiliser et maintenir une classe séparée.
Vous entendrez aussi le corollaire : "les objets sont la fermeture du pauvre". Si je ne peux pas ou ne veux pas tirer parti des fermetures, je suis obligé de faire leur travail en utilisant des objets, comme dans mon premier exemple. Bien que les objets offrent plus de fonctionnalités, les fermetures sont souvent un meilleur choix lorsqu'une fermeture fonctionne, pour les raisons déjà mentionnées.
Par conséquent, un homme pauvre sans objets peut souvent faire le travail avec des fermetures, et un homme pauvre sans fermetures peut faire le travail en utilisant des objets. Un homme riche possède les deux et utilise la bonne solution pour chaque tâche.