Warum wird so viel über Schließungen geredet? [geschlossen]


9

Warum wird bei Entwicklern so viel über Schließungen geredet? In meiner Karriere habe ich sie nie absichtlich benutzt, obwohl ich nicht klar verstehe, was sie sind.

UPD: Nur zur Klarstellung. Die Frage ist, warum das Schließungskonzept heutzutage so gesprächig wurde.


3
Wie könnten Sie absichtlich etwas verwenden, von dem Sie nicht wissen, was es ist? Grundsätzlich sollten Sie also zuerst fragen (oder eher suchen), was Verschlüsse sind.
Steven Jeuris

1
Hast du den Wikipedia-Artikel gelesen? Was hast du nicht verstanden?
Kevin Cline

2
Worauf basiert Ihre Karriere?

4
Was ist das für eine Frage? Was für ein "Summen"? Was verstehst du nicht? Warum hast du diese Frage nicht stattdessen gestellt?
Aaronaught

4
Zur Verteidigung des OP sind Schließungen ein altes Konzept, aber erst vor kurzem waren sie sozusagen das Stadtgespräch. Und das Konzept ist in der Tat sehr einfach für jeden, der ein bisschen mehr Mathematik gelernt hat. Ich kann auch nicht verstehen, warum die Leute über sie sprechen, als wären sie etwas sehr schwer zu verstehen. Vielleicht ist das nur eine Möglichkeit, sich schlauer aussehen zu lassen: "Schau, ich grok Verschlüsse, die so schwer zu grok sind, also rocke ich".
quant_dev

Antworten:


22

Ein Abschluss ist ein Code, der sich an die Welt erinnert, aus der er stammt, während er dort verwendet werden kann, wo er hingebracht wurde.

Ein Beispiel ist die Definition einer anonymen Funktion in Java, die weiß, dass sie sich in YourObject befindet und deren Methoden und Funktionen manipulieren kann. Diese Funktion wird dann z. B. Swing übertragen, wo sie tief in das Innere eines z. B. eines Listeners eindringt, aber immer noch eine Lebensader zurück zu seinen Wurzeln hat.

Dies ist ein sehr leistungsfähiges Konzept, da Sie damit Code bereitstellen können, der - ohne dass der Code, der ihn verwendet, bekannt ist - in andere Teile des Codes zurückgreifen kann.


1
Ja. Auf diese Weise können Sie nicht nur Prozeduren, sondern auch Zustände in anderen Code einfügen. Dies ermöglicht ein sehr hohes Maß an Flexibilität beim Entwerfen von Algorithmen. Sie können Vorlagenmethoden entwerfen, die von statusbehafteten Unterroutinen abhängen, über die sie zur Kompilierungszeit möglicherweise noch nicht einmal Bescheid wissen. Der Nachteil ist, dass die Verknüpfung zur ursprünglichen Quelle und damit zum Status dieser Methode unterbrochen werden kann, ohne dass die konsumierende Methode davon erfährt. In diesem Fall werden schwer zu findende Laufzeitfehler angezeigt.
KeithS

1
Ha ha, anonyme Funktion in Java ... Lustig.
Konfigurator

1
@ Konfigurator, nicht lustig, eine Tatsache.


Java 7 hat keine Verschlüsse.

6

Verschlüsse sind nur etwas, um eine Vielzahl von Problemen auf elegante Weise zu lösen. Tatsächlich werden in Programmiersprachen, in denen keine Abschlüsse vorhanden sind, Techniken erstellt, um ähnliche Funktionen zu implementieren.

Denken Sie nur an Funktoren in C ++ oder Runnables in Java. Sie sind nur Techniken, die ähnliche Funktionen wie Verschlüsse ermöglichen. Eine Art «manuelle Verschlüsse».

Closures werden immer beliebter, weil sie in gängige Sprachen integriert sind: Javascript wächst aufgrund von Online-Anwendungen (wie z. B. Google Doc), C # implementiert es, PHP implementiert es seit 5.3 und so weiter.

Jetzt, da Verschlüsse in immer mehr Technologien verfügbar sind, wird es ganz einfach, dass sich immer mehr Menschen für sie interessieren.

Was sind nun Schließungen? Das ist ganz einfach. Ein Abschluss ist eine Funktion und ein Kontext, in dem er ausgeführt werden kann. Dies wird als Objekt manipuliert. Warum ist das nützlich? Dies ist nützlich, um Ihren eigenen Code in vorhandenen Code einzubinden.

Hier sind zwei häufige Situationen, die Folgendes erfordern: Wenn Aktionen von einem anderen Code verwaltet werden, z. B. beim Multithreading mit einem Thread-Pool, oder wenn eine Aktion für ein ausgewähltes Ereignis ausgeführt werden muss (häufig in Javascript für die Benutzeroberfläche verwendet).


Habe ich dich klar verstanden? Es gibt einige "manuelle Verschlüsse" (nicht wirklich ein Verschluss, aber etwas, das ihrem Verhalten ähnelt) und es gibt einige "WAHRE Verschlüsse"?

Abschluss ist eine Sprachfähigkeit. Einige Sprachen verfügen nicht über diese Funktion. Sie müssen sie daher manuell mit Tools schließen, die Ihnen die Sprache zur Verfügung stellt. Zu sagen, dass sie WAHR sind oder nicht, ist meiner Meinung nach keine sehr interessante Debatte.
Deadalnix

2
@gasan, Sie können die Baugruppe jederzeit auspeitschen und mit einem Eimer voller GOTO-Anweisungen jedes gewünschte Muster manuell ausführen. Ebenso können Sie manuell eine "for" -Schleife mit einer "while" -Schleife ausführen (in C ++). Die fortgeschritteneren, höheren Ebenen bieten eine standardisierte Möglichkeit, gemeinsame Dinge zu tun.
Philip

6

Ich habe neulich ein amüsantes Zitat gesehen, das lautete: "Klassen sind Daten mit Funktionen. Verschlüsse sind Funktionen mit Daten".

Ja, es ist eine übermäßige Vereinfachung, aber es hilft, den Punkt zu vermitteln.


+1 Schöne Möglichkeit zu sehen, was eine Schließung ist: D
deadalnix
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.