Was ist der Unterschied zwischen Schließungen und traditionellen Klassen?

8

Was sind die Vor- und Nachteile von Schließungen gegen Klassen und umgekehrt?

Bearbeiten: Wie Benutzer Faisal es ausdrückte, können sowohl Closures als auch Klassen verwendet werden, um "eine Entität zu beschreiben, die den Zustand aufrechterhält und manipuliert", so dass Closures eine Möglichkeit bieten, objektorientiert mit funktionalen Sprachen zu programmieren. Wie die meisten Programmierer, bin ich eher mit Klassen vertraut.

Die Absicht dieser Frage ist nicht, einen weiteren Flammenkrieg zu eröffnen, in dem es darum geht, ob das Programmierparadigma besser ist oder ob die Schließungen und Klassen vollständig äquivalent sind oder ob der arme Mensch ein anderer ist.

Was ich gerne wissen würde, ist, wenn jemand ein Szenario findet, in dem ein Ansatz den anderen schlägt und warum.

    
Sebastián Grignoli 30.07.2010, 04:31
quelle

3 Antworten

9

Funktional sind Verschlüsse und Objekte gleichwertig. Eine Schließung kann ein Objekt emulieren und umgekehrt. Welches Sie verwenden, ist eine Frage der syntaktischen Bequemlichkeit, oder welche Ihrer Programmiersprache kann am besten umgehen.

In C ++ - Closures sind syntaktisch nicht verfügbar, daher müssen Sie mit "functors" gehen, die operator() überschreiben und so aufgerufen werden können, dass sie wie Funktionsaufrufe aussehen.

In Java haben Sie nicht einmal Funktoren, also erhalten Sie Dinge wie das Besuchermuster, das nur eine Funktion höherer Ordnung in einer Sprache wäre, die Schließungen unterstützt.

Im Standard Scheme haben Sie keine Objekte, daher implementieren Sie sie manchmal, indem Sie eine Closure mit einer Dispatch-Funktion schreiben, die abhängig von den eingehenden Parametern unterschiedliche Sub-Closures ausführt.

In einer Sprache wie Python, deren Syntax sowohl Funktoren als auch Closures hat, ist es im Grunde eine Frage des Geschmacks und was Sie fühlen, ist der bessere Weg, um auszudrücken, was Sie tun.

Persönlich würde ich sagen, dass in jeder Sprache, die eine Syntax für beide hat, Verschlüsse eine viel klarere und sauberere Methode sind, Objekte mit einer einzigen Methode auszudrücken. Umgekehrt sollten Sie, wenn Ihre Sperrung beginnt, Dispatch zu Sub-Closures basierend auf den eingehenden Parametern zu verarbeiten, stattdessen ein Objekt verwenden.

    
clacke 30.07.2010, 04:56
quelle
4

Persönlich denke ich, dass es darum geht, das richtige Werkzeug für den Job zu verwenden ... genauer gesagt, um Ihre Absicht richtig zu kommunizieren.

Wenn Sie explizit zeigen möchten, dass alle Ihre Objekte eine gemeinsame Definition haben und eine starke Typüberprüfung wünschen, möchten Sie wahrscheinlich eine Klasse verwenden. Der Nachteil, die Struktur Ihrer Klasse zur Laufzeit nicht verändern zu können, ist in diesem Fall eine Stärke, da Sie genau wissen, womit Sie es zu tun haben.

Wenn Sie stattdessen eine heterogene Sammlung von "Objekten" erstellen möchten (d. h. Status als Variablen dargestellt, die unter einer Funktion mit inneren Funktionen geschlossen sind, um diese Daten zu bearbeiten), ist es möglicherweise besser, eine Schließung zu erstellen. In diesem Fall gibt es keine wirkliche Garantie für die Struktur des Objekts, mit dem Sie enden, aber Sie haben die Flexibilität, es zur Laufzeit genau so zu definieren, wie Sie es möchten.

Danke, dass du fragst, eigentlich; Ich hatte mit einer Art Knieschmerz geantwortet: "Klassen und Schließungen sind total verschieden!" Attitude auf den ersten, aber mit etwas Forschung merke ich, dass das Problem nicht annähernd so geschnitten und trocken ist, wie ich gedacht hatte.

    
Faisal 30.07.2010 05:01
quelle
2

Closures sind sehr leicht auf Klassen bezogen. Mit Klassen können Sie Felder und Methoden definieren, und mit Schließungen werden Informationen zu lokalen Variablen aus einem Funktionsaufruf gespeichert. Es gibt keinen möglichen Vergleich der beiden auf sprachunabhängige Art und Weise: Sie erfüllen nicht den gleichen Zweck. Schließungen sind außerdem viel mehr mit funktionaler Programmierung als mit objektorientierter Programmierung verbunden.

Betrachten Sie zum Beispiel den folgenden C # -Code:

%Vor%

Dies ergibt "4" und dann "5". myDelegate , ein Delegat, ist eine Schließung und kennt alle Variablen, die derzeit von der Funktion verwendet werden. Daher, wenn ich es anrufe, ist es erlaubt, den Wert von i innerhalb der "Eltern" -Funktion zu ändern. Dies wäre für eine normale Funktion nicht erlaubt.

Klassen, wenn Sie wissen, was sie sind, sind völlig anders.

Ein möglicher Grund für Ihre Verwirrung ist, dass, wenn eine Sprache keine Sprachunterstützung für Schließungen hat, es möglich ist, sie mit Klassen zu simulieren, die jede Variable enthalten, die wir behalten müssen. Zum Beispiel könnten wir den obigen Code wie folgt umschreiben:

%Vor%

Wir haben delegate in eine Klasse umgewandelt, die wir MainClosure genannt haben. Anstatt die Variable i innerhalb der Main -Funktion zu erstellen, haben wir ein MainClosure -Objekt erstellt, das ein i -Feld hat. Dies ist die eine, die wir verwenden werden. Außerdem haben wir den Code erstellt, den die Funktion in einer Instanzmethode anstatt in der Methode ausführt.

Wie Sie sehen, ist dies, obwohl es ein einfaches Beispiel war (nur eine Variable), wesentlich mehr Arbeit. In einem Kontext, in dem Sie Schließungen wünschen, ist die Verwendung von Objekten eine schlechte Lösung. Klassen eignen sich jedoch nicht nur zum Erstellen von Schließungen, und ihr üblicher Zweck ist normalerweise sehr unterschiedlich.

    
zneak 30.07.2010 04:47
quelle