Was sind die Vor- und Nachteile von Coffeescript? [geschlossen]


48

Ein großer Vorteil ist natürlich die Menge an syntaktischem Zucker, die in vielen Fällen zu kürzerem Code führt. Auf http://jashkenas.github.com/coffee-script/ gibt es beeindruckende Beispiele. Andererseits habe ich Zweifel, dass diese Beispiele den Code komplexer realer Anwendungen darstellen. In meinem Code füge ich zum Beispiel niemals Funktionen zu nackten Objekten hinzu, sondern zu ihren Prototypen. Darüber hinaus ist die Prototyp-Funktion für den Benutzer nicht sichtbar, was eher auf klassische OOP als auf idiomatisches Javascript hindeutet.

Das Array-Verständnis Beispiel würde in meinem Code wahrscheinlich so aussehen:

cubes = $.map(list, math.cube); // which is 8 characters less using jQuery...

7
Das ist kein Array-Verständnis. Das ist JQuery.map ().
Rein Henrichs

1
Klar, deshalb beziehe ich mich nicht auf "Array-Verständnis" selbst, sondern auf das "Array-Verständnis-Beispiel [auf der Website]".
Philip

Fair genug. Mein Punkt war nur, dass foldl (map) in gewisser Weise ein entarteter Fall des Listenverständnisses ist (was typischerweise mächtiger ist).
Rein Henrichs

Grundsätzlich stelle ich diese Frage, weil ich mich frage, ob es eine blöde Entscheidung ist, Javascript anstelle von Coffeescript zu verwenden. Ich bin damit einverstanden, dass das Array-Verständnis viel leistungsfähiger ist. Andererseits würde niemand behaupten, dass Python aufgrund des Array-Verständnisses und der Markierung von Blöcken durch Einrückung leistungsfähiger ist als durch Anfang / Ende.
Philip

Rails machte das Kaffeeskript zu einem Standardjuwel. Es provozierte "Diskussion" github.com/rails/rails/commit/…
Generalhenry

Antworten:


53

Ich bin der Autor eines bevorstehenden Buches über CoffeeScript:
http://pragprog.com/titles/tbcoffee/coffeescript

Ich war überzeugt, dass es sich lohnt, CoffeeScript nach etwa einer Woche zu verwenden, obwohl die Sprache zu diesem Zeitpunkt nur ein paar Monate alt war und viel rauere Kanten hatte als jetzt. Auf der offiziellen Website sind die (meisten) Funktionen der Sprache hervorragend aufgelistet, daher werde ich diese hier nicht wiederholen. Vielmehr sage ich nur, dass die Profis der Sprache sind:

  1. Ermutigt die Verwendung guter JavaScript-Muster
  2. Entmutigt JavaScript-Anti-Patterns
  3. Verkürzt und verbessert die Lesbarkeit von selbst gutem JavaScript-Code

Nr. 3 bekommt viel mehr Aufmerksamkeit als die ersten beiden (sogar in meinem Buch), aber je mehr ich darüber nachdenke, desto mehr wird mir klar, dass ich den Sprung nicht nur wegen der hübschen Syntax gemacht habe; Ich habe den Sprung gemacht, weil mich die Sprache in Richtung eines besseren, weniger fehleranfälligen JavaScript getrieben hat. Um ein paar kurze Beispiele zu nennen:

  • Da Variablen einen automatischen Gültigkeitsbereich haben, können Sie Globale nicht versehentlich überschreiben, indem Sie sie weglassen var, eine Variable mit demselben Namen spiegeln (außer mit benannten Argumenten) oder Variablen in verschiedenen Dateien haben, die interagieren (siehe https://stackoverflow.com/questions) / 5211638 / pattern-for-coffeescript-modules / 5212449 ).
  • Da ->das Schreiben sehr viel einfacher ist als function(){}das Verwenden von Rückrufen. Semantische Einrückung macht deutlich, wann Callbacks verschachtelt sind. Und =>erleichtert die Aufbewahrung thisbei Bedarf.
  • Da unless xeinfacher für englischen Muttersprachler ist als zu analysieren if (!x), und if x?ist einfacher als if (x != null), um nur zwei Beispiele zu geben, können Sie weniger Gehirn Zyklen auf Logik - Syntax und mehr auf der Logik selbst zu verbringen.

Eine großartige Bibliothek wie Underscore.js kann einige dieser Probleme lösen, aber nicht alle.

Nun zu den Nachteilen:

  1. Zusammenstellung kann ein Schmerz sein. Die Syntaxfehler, die der CoffeeScript-Compiler ausgibt, sind oft vage. Ich gehe davon aus, dass auf diesem Weg in Zukunft Fortschritte erzielt werden. (In der Verteidigung des Compilers werden häufig Dinge aufgefangen, die - wenn Sie sie in JavaScript geschrieben haben - erst dann als Fehler erkannt wurden, wenn diese Codezeile ausgeführt wurde. Es ist besser, diese Fehler früher als später aufzufangen.)
  2. Dementsprechend kann das Debuggen schmerzhaft sein. Es gibt noch keine Möglichkeit, kompilierte JS-Zeilen mit dem ursprünglichen CoffeeScript abzugleichen (obwohl die Firefox-Leute versprochen haben, dass dies kommen wird).
  3. Es ist anfällig für Veränderungen. Ihr Code wird möglicherweise in einer zukünftigen Version von CoffeeScript anders oder gar nicht mehr ausgeführt. Dies ist natürlich bei den meisten Sprachen der Fall - das Wechseln zu einer neuen Version von Ruby oder Python ist ähnlich -, aber bei JavaScript ist dies nicht der Fall, da Sie davon ausgehen können, dass Code, der heute in den gängigsten Browsern einwandfrei funktioniert, auch in den gängigsten Sprachen einwandfrei funktioniert Browser, solange das Web existiert, wie wir es kennen.
  4. Es ist nicht so bekannt. JavaScript ist eine Verkehrssprache . CoffeeScript ist in kurzer Zeit sehr populär geworden, aber es ist unwahrscheinlich, dass es jemals eine so große Community wie JavaScript haben wird.

Natürlich denke ich, dass die Vor- und Nachteile für mich persönlich überwiegen, aber das wird nicht für jede Person, jedes Team oder jedes Projekt der Fall sein. (Auch Jeremy Ashkenas schreibt viel JavaScript.) CoffeeScript wird am besten als eine gute Ergänzung zu JavaScript angesehen, nicht als Ersatz.


2
Whoa whoa whoa, wie um alles in der Welt habe ich =>in der Dokumentation vermisst ? Das ist großartig . (Die anderen Punkte waren auch gut - sehr gute unvoreingenommene Antwort mit einer ehrlichen Liste der Nachteile. :)
Michelle Tilley

Vielen Dank für Ihre detaillierte Antwort. Obwohl ich ein bisschen warten werde, um es zu akzeptieren, wäre es interessant, Vor-und Nachteile zu haben, wenn man die verschiedenen OOP-Ansätze bedenkt.
Philip

2
Ich würde sagen, das Klassenmodell von CoffeeScript ist für Neulinge zugänglicher als das JavaScript-Prototypmodell und unterstützt bewährte Vorgehensweisen (insbesondere das Definieren Ihrer Prototypen an einem Ort, anstatt Foo.prototype.bar = ...alle Linien zu zerstreuen , was Wahnsinn ist!). Es ist eine großartige Möglichkeit, Code sauber zu organisieren. Andererseits kann es dazu führen, dass Benutzer OOP verwenden, auch wenn ein funktionaler Ansatz viel eleganter ist.
Trevor Burnham

Einige der Einrückungslogiken verhalten sich nicht ganz wie erwartet. Sie müssen sich die zugrunde liegende JS ansehen, um zu sehen, dass dies etwas völlig Seltsames ist. Es könnte Teil des Regelsatzes tbh sein, aber es ist nicht immer offensichtlich im Vergleich zu anderen senstitiven Einrückungssprachen wie Py, und ich habe festgestellt, dass dies subtilere Fehler erzeugen kann als die, die es verhindern soll. Ich benutze immer noch CoffeeScript
sa93

1
Die Punkte 1 und 2 bedürfen der Einzelheit. Ich denke, Andrews Antwort liefert ein gutes Beispiel für # 3 als gemischte Tasche. Ich bin mit den Aufzählungszeichen nicht einverstanden: Das Vergessen von var ist albern und man sollte nicht viele globale Variablen haben, mit denen man überhaupt kollidieren kann. 'Function' ist nicht schwer - vordefinierte benannte Methoden noch weniger, 'if (! X ) "ist kurz und bündig und" es sei denn "macht es ausführlicher (siehe Ihren eigenen vorherigen Aufzählungspunkt und Punkt 3), und Ähnlichkeit mit der menschlichen Sprache ist eigentlich kein Designziel, das in der Vergangenheit in Programmiersprachen viel Erfolg hatte. Wir müssen mit Mensch und Maschine in Kontakt sein.
Erik Reppen

30

Wir haben eine ziemlich große JavaScript-Codebasis und vor ungefähr einem Monat beschlossen wir, CoffeeScript auszuprobieren. Einer unserer Entwickler begann mit der Migration eines unserer Module von JS zu CS unter http://js2coffee.org/ . Dieses Tool war ziemlich praktisch und es dauerte ungefähr zwei oder drei Stunden, um 1000-Zeilen-JavaScript zu portieren. Einige Beobachtungen, die wir an diesem Punkt bemerkt haben:

  1. Der resultierende CoffeeScript-Code war gut lesbar.

  2. Wir haben es wieder in JavaScript kompiliert und es war ziemlich einfach zu navigieren und zu debuggen. Während wir dieses Modul portierten, entdeckte ein anderer Entwickler aus unserem Team einen Fehler darin. Diese beiden Entwickler haben den Fehler in unserem alten JavaScript-Code und im neuen JavaScript-Code, der aus dem CS-Compiler stammt, behoben. Sie arbeiteten unabhängig und es dauerte ungefähr die gleiche Zeit (15-20 Minuten).

  3. Aufgrund der Tatsache, dass es sich um einen Port handelte, verwendete der resultierende Code keine für Kaffee geeigneten oder wünschenswerten Funktionen. Wenn wir von Grund auf in CoffeeScript schreiben würden, wäre der Code idiomatischer. Aus diesem Grund haben wir später beschlossen, den vorhandenen Code nicht zu portieren.

  4. Im Allgemeinen ist die Lesbarkeit der kürzeren Funktion und des kleineren Objekts in gewissem Maße erhöht. Bei längeren Methoden war dies jedoch überhaupt nicht der Fall. Die größten Einsparungen beim Aufblähen kamen von ->und explizit return, aber ansonsten war unser Code nicht wesentlich kürzer oder einfacher geworden. Einige Syntaxelemente, insbesondere Objektliterale, schienen ziemlich verwirrend. CS lässt geschweifte Klammern um Elementdefinitionen weg und kombiniert sie mit "Alles-ist-ein-Ausdruck" und implizit return, was das Lesen einiger Codebits ziemlich schwierig machte.

    Hier ist JavaScript:

    var rabbitGenerator = {
        makeRabbit: function(rabbitName, growCarrots) {
            if (growCarrots) {
                carrots.growMore(10);
            } else {
                carrots.ensureSupply();
            }
            return {
                name: rabbitName, 
                height: 0,
                actions: {
                    jump: function (height) {
                        this.height += height;
                    },
                    eatCarrot: function () {
                        // etc
                    }
                }
            };
        },
        // more members
    }
    

    Und so würde der entsprechende CoffeeScript-Code aussehen:

    rabbitGenerator = 
      makeRabbit: (rabbitName, growCarrots) ->
        if growCarrots
          carrots.growMore 10
        else
          carrots.ensureSupply()
        name: rabbitName // (*)
        height: 0
        actions: 
          jump: (height) ->
            @height += height
    
          eatCarrot: ->
    

    Da es jetzt ziemlich schwierig ist, herauszufinden, dass die return-Anweisung in der (*)Zeile beginnt . In unserem Projekt verlassen wir uns stark auf Objektliterale: Wir übergeben sie als Funktionsparameter und geben sie von anderen Funktionen zurück. In vielen Fällen sind diese Objekte recht komplex: mit Elementen unterschiedlichen Typs und mehreren Verschachtelungsebenen. In unserem Fall war das allgemeine Gefühl, dass CoffeeScript-Code tatsächlich schwerer zu lesen war als einfacher JavaScript-Code.

  5. Obwohl sich das Debuggen von CoffeeScript als einfacher herausstellte, als wir erwartet hatten, hat sich die Bearbeitungserfahrung erheblich verschlechtert. Wir konnten keinen guten Editor / IDE für diese Sprache finden. Wir haben Editor / IDE für clientseitigen Code für unser Projekt nicht standardisiert, und tatsächlich verwenden wir alle verschiedene Tools. Tatsächlich sind sich alle in einem Team einig, dass ihr Tool bei einem Wechsel zu CoffeeScript einen eher schlechten Support bietet. IDE- und Editor-Plug-ins sind in einem sehr frühen Stadium und können uns in einigen Fällen nicht einmal eine ordnungsgemäße Syntaxhervorhebung oder Einrückungsunterstützung bieten. Ich spreche nicht von Codeausschnitten oder Refactoring. Wir verwenden WebStorm, Eclipse, NetBeans, VisualStudio, Notepad ++ und SublimeText2.

  6. Apropos Tools Ich sollte erwähnen, dass der CoffeScript-Compiler selbst als Node-JS-Paket geliefert wird. Wir sind in erster Linie ein Java / .NET-Shop, daher entwickeln alle auf Windows-Boxen. Bis vor kurzem gab es in Node kaum Windows-Unterstützung. Der CoffeeScript-Compiler konnte nicht unter Windows ausgeführt werden. Daher entschieden wir uns vorerst, bei <script type="text/coffeescript">Tags und dem browserbasierten On-the-Fly-Compiler zu bleiben .

    Der Compiler ist ziemlich schnell und verlängert die Startzeit nicht wesentlich. Der Nachteil ist, dass das resultierende JavaScript bearbeitet wird evalund es etwas schwierig ist, in den Entwicklertools der Browser (insbesondere in IE8) Haltepunkte zu setzen. Wenn wir Probleme mit dem Debuggen haben, kompilieren wir CoffeeScript-Code mit demselben Migrationstool, das ich oben aufgeführt habe, aber das ist immer noch nicht sehr praktisch.

  7. Andere Versprechungen von CoffeeScript wie automatisches varEinfügen oder halbtransparentes Verwalten thismit dem Operator fat arrow ( =>) haben nicht so viel Gewinn gebracht, wie wir gehofft hatten. Wir verwenden JSLint bereits als Teil unseres Erstellungsprozesses und schreiben Code in einer ES3 x ES5-StrictTeilmenge der Sprache. Wie auch immer, die Tatsache, dass Coffee denselben "sauberen" Code produziert, ist eine gute Sache . Ich wünsche mir, dass jedes serverseitige Framework auch gültige HTML5- und CSS3-Markups erzeugt!

    Das heißt, ich würde nicht sagen, dass CoffeeScript viel Zeit spart, indem es varmir Keywords hinzufügt. Fehlende vars werden leicht von JSLint abgefangen und können leicht behoben werden. Darüber hinaus schreiben Sie nach einer gewissen Korrektur automatisch gutes JavaScript . So würde ich nicht sagen Kaffee wirklich ist , dass in dieser Hinsicht hilfreich.

Wir haben CoffeeScript etwa eine Woche lang getestet. Alle Teammitglieder schrieben Code darin und wir tauschten unsere Erfahrungen miteinander aus. Wir haben damit einen neuen Code geschrieben und einen vorhandenen Code portiert, wenn wir das für richtig hielten. Unsere Gefühle für die Sprache waren gemischt.

Im Allgemeinen würde ich sagen, dass es unsere Entwicklung nicht beschleunigt hat, aber es hat uns auch nicht gebremst. Einige Geschwindigkeitszuwächse aufgrund von weniger Eingabe und weniger Fehlerfläche wurden durch Verlangsamungen in anderen Bereichen ausgeglichen, hauptsächlich durch die Unterstützung von Werkzeugen. Nach einer Woche haben wir beschlossen, die Verwendung von CoffeeScript nicht zu verbieten, aber auch nicht zu verbieten . Bei einer freien Wahl wird sie in der Praxis zumindest vorerst von niemandem verwendet. Von Zeit zu Zeit denke ich darüber nach, ein neues Feature zu prototypisieren und dann den Code in JavaScript zu konvertieren, bevor ich ihn in den Rest des Projekts integriere, um einen schnelleren Start zu erzielen, aber ich habe diesen Ansatz noch nicht ausprobiert.


10

Vorteile

Sehen Sie sich die Antwort von Trevor Burnham an .

Außerdem können Sie sich als einen angesagten Kerl vorstellen, der trendige Sachen macht, anstatt mit dem Dreck von Javascript herumzuspielen.

Nachteile

CoffeeScript ist nichts anderes als syntaktischer Zucker und rosa Gläser.

Für einfache Dinge - CoffeeScript ist überflüssig, da es in jeder Sprache einfach ist, einfache Dinge zu tun. Und jQuery ist wahrscheinlich noch einfacher als CoffeeScript.

Für harte Sachen - Sie müssen Ihr Medium verstehen. Und Ihr Medium ist HTML, DOM und CSS, Javascript ist lediglich ein Werkzeug, um sie miteinander zu verbinden - alle APIs sind speziell für Javascript geschrieben. Die Verwendung einer anderen Sprache, die dann zu einer "echten" kompiliert wird, ist sehr riskant, sei es Java (GWT), Dart oder CoffeeScript.

Anti-Patterns oder banale Unkenntnis der Sprachregeln können durch das Lesen von zwei guten Büchern behoben werden. Und ich bin mir ziemlich sicher, dass Coffeescript seine eigenen Anti-Patterns hat.

Die IDE-Unterstützung für Coffeescript ist noch schlechter als für JS.



JavaScript ist viel mehr als nur ein "Werkzeug, um sie miteinander zu verbinden" in großen, hochdynamischen Web-Apps. Die Menge an JS in Bibliotheken wie React oder Angular, sogar jQuery, ist ein typisches Beispiel.
Andy

6

Der größte Profi ist meiner Meinung nach:

Geradlinig Coffeescript kompiliert in die Javascript Sie sollte geschrieben haben, aber nicht, weil es nicht einfach war.

Es gibt einige unangenehme Ecken von Javascript, die nur mit Wachsamkeit vermieden werden - Beispiele aus der Luft:

  • den Prototyp richtig einstellen
  • mit === anstelle von ==
  • auf null prüfen
  • Deklarieren aller Variablen mit var
  • alles in eine sich selbst ausführende anonyme Funktion packen.

Wenn Sie ein Kaffeeskript schreiben, werden alle diese automatisch für Sie behandelt .

Die Nachteile sind, IMO, meist gering:

  • Debuggen ist ein Schmerz
  • Es gibt weniger Coffeescript-Programmierer
  • Sie müssen die Dokumentation von Javascript in Coffeescript übersetzen.

3

Profis

  1. CoffeeScript hat mir geholfen, mehr über JavaScript zu erfahren
  2. ist ziemlich einfach zu lesen, auch für komplexe verschachtelte Rückrufe
  3. bietet Sicherheit in Bezug auf einige der schwer auffindbaren Sprachprobleme von Javascript

Das obige Beispiel von Andrew fand ich aufschlussreich. Ich glaube, die Lesbarkeit der vorhandenen Objektliteralretouren würde durch einfaches manuelles Identifizieren der Retoure verbessert

Rückkehr

// Objektliteral hier

Die IDE-Tools wurden verbessert. TextMate und Cloud9 unterstützen CoffeeScript. Zugegebenermaßen ist die Windows-Unterstützung zurückgeblieben (gilt das nicht generell für die Webentwicklung?)

Nachteile

Browser-interpretiertes CoffeeScript kann schwierig zu debuggen sein.

Es ist eine zusätzliche Ebene über JavaScript, die einige Kenntnisse und Überlegungen von Entwicklern erfordert.


0

Profis

  1. sie wirklich die häufigsten Fälle syntaktisch optimiert, in der Tat ist ein Coffeescript , wenn nicht die meisten prägnante Sprache , die „häufig“ verwendet wird , ist http://redmonk.com/dberkholz/2013/03/25/programming-languages-ranked- Ausdruckskraft /
  2. verbirgt die schlechten Teile von JavaScript (auto-coercion ==, implizite Globale, traditionelleres Klassensystem macht gemeinsame Dinge einfacher)
  3. Für Python / Ruby-Programmierer extrem einfach zu erlernen
  4. Mehrzeilige anonyme Funktionen + Whitespace-Syntax

Nachteile

  1. Entfernen von var bedeutet, dass Sie eine Variable mit äußerem Gültigkeitsbereich innerhalb eines inneren Gültigkeitsbereichs nicht ändern können, ohne ein Objekt oder var fall_back_to_js; hacks [warum nicht eine andere Zuweisungsanweisung]: = = 5 Tippfehler einfacher zu debuggen]
  2. Sie müssen jedem Tool Bescheid geben, es sei denn, Sie möchten JavaScript debuggen :(; Übrigens: Sie können CoffeeScript von Chrome aus debuggen, indem Sie Unterstützung für Quellkarten hinzufügen; yeoman (npm install yeoman) kann Ihnen dabei helfen, eine gulp- oder grunt-Konfigurationsdatei für zu schreiben CoffeeScript
  3. keine optionale statische Eingabe (muss auf den nächsten EcmaScript-Standard warten)
  4. benötigen noch Bibliotheken von Drittanbietern für ein Modulsystem
  5. Syntax-Traps, auf die Sie achten sollten: Implizite Rückgaben, abgo bedeutet a (b (g (o))) , fp, b: 2, c: 8 bedeutet f (p, {b: 2, c: 8}) und nicht f (p, {b: 2}, {c: 8})
  6. ändert das kaputte JavaScript-Nummern- / Typensystem nicht
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.