Pourquoi tant de buzz autour des fermetures? [fermé]

9

Pourquoi tant de buzz autour des fermetures chez les développeurs? Dans ma carrière, je ne les ai jamais utilisés intentionnellement, bien que je ne comprenne pas clairement ce qu'ils sont.

UPD: juste pour clarifier. La question est de savoir pourquoi le concept de fermeture est devenu si bavard ces jours-ci.


la source
3
Comment pourriez-vous utiliser intentionnellement quelque chose dont vous ne savez pas ce que c'est? Donc, fondamentalement, vous devriez d'abord demander (ou chercher plutôt) ce que sont les fermetures.
Steven Jeuris
1
Avez-vous lu l'article wikipedia? Qu'avez-vous échoué à comprendre à ce sujet?
Kevin Cline
2
Sur quoi est basée votre carrière?
4
Quel genre de question est-ce? Quel "buzz"? Qu'est-ce que tu ne comprends pas? Pourquoi n'avez-vous pas posé cette question à la place?
Aaronaught
4
Pour défendre le PO, les fermetures sont un vieux concept mais ce n'est que récemment qu'elles ont fait parler de la ville, pour ainsi dire. Et le concept est en effet très simple pour quiconque a appris un peu plus les mathématiques, je ne comprends pas non plus pourquoi les gens en parlent comme s'ils étaient quelque chose de très difficile à comprendre. Peut-être que c'est juste un moyen de se faire paraître plus intelligent: "regarde, je ferme les fermetures qui sont si difficiles à bouder, donc je bascule".
quant_dev

Réponses:

22

Une fermeture est un code qui rappelle le monde d'où il vient tout en étant utilisable là où il a été amené.

Un exemple est la définition d'une fonction anonyme en Java qui sait qu'elle est à l'intérieur de YourObject et peut manipuler ses méthodes et fonctions. Cette fonction est ensuite fournie par exemple à Swing où elle va profondément à l'intérieur, par exemple un écouteur, mais a toujours une bouée de sauvetage à ses racines.

Il s'agit d'un concept très puissant car il vous permet de fournir du code qui, à l'insu du code qui l'utilise, peut revenir dans d'autres parties du code.


la source
1
Oui. C'est un moyen d'injecter non seulement la procédure, mais l'état, dans un autre code. Cela permet une très grande flexibilité dans la conception d'algorithmes; vous pouvez concevoir des méthodes basées sur des modèles qui dépendent de sous-programmes avec état, dont il peut même ne pas avoir connaissance au moment de la compilation. L'inconvénient est que le lien vers la source d'origine de cette méthode, et donc son état, peut être rompu sans que la méthode consommatrice le sache; lorsque cela se produit, vous obtenez des erreurs d'exécution difficiles à trouver.
KeithS
1
Ha ha, fonction anonyme en Java ... Drôle.
configurateur
1
@configurator, pas drôle, un fait.
stackoverflow.com/questions/2755445/… Java 7 n'est pas encore sorti, non?
BlueRaja - Danny Pflughoeft
java 7 n'a pas de fermetures.
6

Les fermetures sont juste quelque chose pour résoudre une variété de problèmes d'une manière élégante. En fait, dans les langages de programmation où aucune fermeture n'existe, des techniques sont créées pour implémenter des fonctions similaires.

Pensez simplement aux foncteurs en C ++ ou Runnables en Java. Ce ne sont que des techniques qui permettent des fonctionnalités similaires aux fermetures. Une sorte de «fermetures manuelles».

Les fermetures deviennent de plus en plus populaires car elles sont intégrées dans des langages populaires: Javascript se développe grâce aux applications en ligne (comme google doc par exemple), C # l'a implémenté, PHP l'a implémenté depuis 5.3, etc.

Maintenant que les fermetures sont disponibles dans de plus en plus de technologies, il devient assez simple que de plus en plus de personnes s'y intéressent.

Alors maintenant, quelles sont les fermetures? C'est assez simple. Une fermeture est une fonction et un contexte pour l'exécuter. Ceci est manipulé comme un objet. Pourquoi est-ce utile? Ceci est utile pour connecter votre propre code au code existant.

Voici deux situations courantes qui exigent que: lorsque les actions sont gérées par un autre morceau de code, comme dans le multithreading avec un pool de threads, ou lorsqu'une action doit être exécutée sur un événement choisi (utilisé souvent en javascript pour l'interface utilisateur).

deadalnix
la source
Vous ai-je bien compris? Il y a des "fermetures manuelles" (pas vraiment des fermetures, mais quelque chose qui ressemble à leur comportement) et il y a des "VRAIES fermetures"?
La fermeture est une capacité linguistique. Certaines langues n'ont pas cette capacité, vous devez donc fermer manuellement en utilisant les outils que la langue vous fournit. Dire qu'ils sont VRAIS ou non n'est pas un débat très intéressant à mon humble avis.
deadalnix
2
@gasan, vous pouvez toujours extraire l'assemblage et effectuer manuellement le modèle de votre choix avec un ensemble d'instructions GOTO. De même, vous pouvez effectuer manuellement une boucle "for" avec une boucle "while" (en C ++). Les niveaux plus avancés et plus élevés offrent une façon standardisée de faire des choses courantes.
Philip
6

J'ai vu une citation amusante l'autre jour, c'était dans le sens de "les classes sont des données avec des fonctions. Les fermetures sont des fonctions avec des données".

Oui, c'est une simplification excessive, mais cela aide à faire passer le message.

geoffjentry
la source
+1 Belle façon de voir ce qu'est une fermeture: D
deadalnix