Warum umhüllt CoffeScript Klassendefinitionen in einem Abschluss?

8

In CoffeeScript dies :

%Vor%

Kompiliert zu:

%Vor%

Was etwas übertrieben erscheint. Folgendes sollte funktional identisch sein :

%Vor%

Was ist die Motivation für den zusätzlichen "Schließ" -Wrapper?

Das ist nicht nur eine leere Frage des Stils; Dies hat Auswirkungen auf die Gesamtgröße des Codes.

Die Coffee-Version wird auf 84 Bytes verkleinert:

%Vor%

Meine Version verkleinert sich auf nur 61 Bytes:

%Vor%

23 Bytes sind dumme Arten von irrelevant, aber in einem Projekt mit vielen vielen Klassen beginnt der Overhead zu summieren.

Ok, ich habe unten eine Antwort geschrieben, die die Byte-Size-Theorie widerlegt ... für jede vernünftige Klasse wird die Coffee-Methode kleiner sein.

Es gibt wahrscheinlich auch andere Gründe. Hilf mir, an sie zu denken.

    
Dave Dopson 18.08.2012, 01:34
quelle

4 Antworten

2

Jeremy antwortet in einer ähnlichen Frage - es sieht so aus, als ob die primäre Absicht darin besteht, einen IE-Fehler nicht auszulösen.

    
Nevir 18.08.2012, 18:20
quelle
8

Ein weiterer Grund dafür, die Klassendefinition mit einer Closure zu umhüllen, besteht darin, diesem Code einen neuen lexikalischen Rahmen zu geben, um Variablen und Dinge zu deklarieren, die nur innerhalb der Klasse sichtbar sind:

%Vor%

In diesem Code sind die Variablen doSomethingAwesome und i lokal für die Klassendefinition und somit für externe Benutzer "privat".

Der CoffeeScript-Compiler könnte das zusätzliche Wrapping entfernen, wenn IMO keine lokalen Variablen benötigt. Aber das Wrapping der Klassendefinition ist aus Implementierungssicht wahrscheinlich einfacher:)

    
epidemian 18.08.2012 02:15
quelle
3

Ich weiß nicht wirklich, wie CS funktioniert, abgesehen von der Tatsache, dass es nur in JS konvertiert wird, aber so, wie ich es sehe, Modul Pattern unterstützt private Mitglieder leicht , was das Prototyp-Muster nicht (oder würde normalerweise schwer tun). Ich glaube, dass dies der Hauptgrund dafür ist, warum das Modulmuster das verwendete Muster ist.

    
Joseph 18.08.2012 01:48
quelle
2

Okay, ich glaube, ich habe gerade meine eigene Frage beantwortet.

Für die meisten sinnvollen Klassen generiert die von CoffeeScript generierte Schließung kleinere verkleinerte Ausgaben.

Der Closure-Wrapper besteht aus 25 Bytes minimiertem Overhead, aber erspart Ihnen die Wiederholung des Klassennamens und speichert k * N bytes (k = letters-in-name, N = num-of-refs). Wenn beispielsweise eine Klasse wie BoilerPlateThingyFactory 2+ Methoden hat, generiert der Abschluss-Wrapper kleineren minimierten Code.


genauer ...

Der von Coffee generierte Code, der einen Abschluss verwendet, verkleinert sich zu:

%Vor%

Die alternative Implementierung minimiert dies:

%Vor%

Beachten Sie, dass der Name "Animal" in der Coffee Form genau einmal und in der alternativen Implementierung N = 2 mal existiert. Jetzt ist "Animal" nur 6-Buchstaben, und es gibt nur eine Methode, also sollte Kaffee hier um 25-6 = 19 Bytes verlieren. Wenn ich meinen verfälschten Code konsultiere, sind es 138 Bytes bis 119 Bytes, für ein Delta von ... 19 Bytes. Fügen Sie 4 weitere Methoden hinzu, und der Vorteil wird zu Kaffee wechseln. Und es sind nicht nur Methoden; Klassenkonstanten und andere ref-Typen zählen ebenfalls.

    
Dave Dopson 18.08.2012 01:34
quelle

Tags und Links