2 Hinunter in den Kaninchenbau – CoffeeScript im Detail
Als Alice im Wunderland sich hinunter in den Kaninchenbau wagte, fand sie eine ihr völlig fremde und faszinierende Welt vor. Das nun folgende Kapitel soll helfen, dass CoffeeScript nicht mehr fremd für Sie ist und Sie die vielen faszinierenden Aspekte dieser Sprache kennenlernen.
Im nun folgenden Kapitel möchte ich Ihnen die Sprache CoffeeScript detailliert beschreiben, damit Sie einen Überblick über die Funktionalität der Sprache erhalten, einschätzen können, ob CoffeeScript für Ihre Projekte eine Bereicherung sein könnte, und um Sie von der Einfachheit und Eleganz dieser Sprache zu überzeugen.
Sie können das Kapitel von Anfang bis Ende lesen. Sie können allerdings auch nur die für Sie jeweils interessanten Unterkapitel lesen, um eventuell schnell mit einem eigenen Projekt beginnen zu können, und die fehlenden Passagen zu einem späteren Zeitpunkt nachholen.
In den einzelnen Kapiteln wird es viele Beispiele geben, sodass Sie gleich sehen können, wie gewisse Dinge in CoffeeScript gemacht werden (oder auch, wie man sie besser nicht macht). Nicht alle dieser Beispiele sind auch wirklich lauffähige »fertige« Skripte, sie dienen manchmal auch »nur« zur Veranschauung. In diesem Sinne: viel Spaß!
2.1 Alles neu? – Ein paar Basics zu Beginn
Wenn wir uns mit einer neuen Programmiersprache beschäftigen, dann benötigen wir für die ersten Beispiele eigentlich immer die gleichen Grundlagen. Im folgenden Abschnitt 2.2 beschäftigen wir uns mit den Kontrollstrukturen in Coffee-Script, in diesem Abschnitt soll es um ein paar grundlegende syntaktische Charakteristiken gehen.
Fangen wir mit ein paar Unterschieden und Gemeinsamkeiten zu JavaScript an:
CoffeeScript kennt keine Strichpunkte am Ende der Zeile.
alert("Hello World")
Klammern bei Funktionsaufrufen können weggelassen werden.
alert "Hello World"
Variablen werden ohne das Schlüsselwort var definiert.
name = "Max Mustermann"
i = 10
Arrays und Objekte werden (ähnlich) wie in JavaScript definiert.
a = [0, 1, 2, 3, 4]
person = { name: "Mustermann", vorname: "Max" }
Werden Arrays und Objekte über mehrere Zeilen definiert und stehen die Properties bei Objekten jeweils in einer Zeile, dann können die Kommas am Ende der Zeile weggelassen werden.
a = [
0, 1
2, 3
4
]
person = {
name: "Mustermann"
vorname: "Max"
}
Objekte können in einer YAML1-ähnlichen Syntax definiert werden
ehepaar =
mann:
name: "Mustermann"
vorname: "Max"
frau:
name: "Mustermann"
vorname: "Anna"
Nach diesem Kurzüberblick über syntaktische Unterschiede zwischen Coffee-Script und JavaScript kommen wir zum ersten großen Thema: Kontrollstrukturen.
2.2 Alles unter Kontrolle – Kontrollstrukturen in CoffeeScript
Jede Programmiersprache hat sie und ohne wären wir Entwickler auch ziemlich unglücklich: Kontrollstrukturen. Neben den bekannteren wie if/else
und while
bietet CoffeeScript noch eine Reihe weiterer Möglichkeiten, den Programmablauf zu steuern.
All dies wird in den folgenden Abschnitten Thema sein. Beginnen wir also gleich mit etwas Grundlegendem.
2.2.1 Am Anfang die Basics – If /Else
If
und else
gibt es vermutlich in nahezu jeder Programmiersprache, also auch in CoffeeScript.
Schauen wir uns die Verwendung am besten gleich in einigen Beispielen an, sodass die Unterschiede zu JavaScript am schnellsten deutlich werden.
if kosten < 50
console.log "Bei einem Betrag unter 50,- EUR"
console.log "benötigen wir bei der Bestellung keine weiteren"
console.log "Details."
else
console.log "Bei einem Betrag ab 50,- EUR"
console.log "benötigen wir bei der Bestellung bitte eine"
console.log "gültige Kreditkarte."
Listing 2–1 If und Else in CoffeeScript
Bei der Betrachtung des Listings 2–1 fallen ein paar Dinge im Vergleich zu JavaScript auf:
Der letzte Punkt ist besonders wichtig und womöglich aus einer Sprache wie Python2 bekannt: Logische Blöcke werden in CoffeeScript durch Einrücken gebildet. Das bedeutet, dass CoffeeScript zu den Sprachen zählt, die Whitespace als syntaktisches Element verwenden.
Dieses Konzept soll Entwickler dazu bringen, »schönen« Code zu schreiben. Allerdings birgt es auch einen gravierenden Nachteil: Sie sollten nie die Art der Einrückung innerhalb einer Datei mischen; also entweder Tabulator oder Leerzeichen. Und bei Leerzeichen natürlich immer die gleiche Anzahl für die gleiche Ebene. Wenn Sie das berücksichtigen, sind Sie vor ungewollten Fehlermeldungen sicher.
Wie bereits im ersten Kapitel gezeigt, kennt CoffeeScript auch die nachgestellte Variante des if
. Diese Version ist besonders praktisch, wenn es sich um kurze Codestücke handelt, und sie erhöhen die Lesbarkeit3:
console.log "DEBUG: eine Meldung!" if debug
Nicht so negativ – unless
Wenn Sie in JavaScript eine negative Überprüfung implementieren wollen, dann verwenden Sie normalerweise etwas in dieser Art:
if (!coffeescript) { ... }
Der Operator ! negiert den booleschen Ausdruck. Das können wir natürlich ebenso in CoffeeScript schreiben:
if !coffeescript
...
Allerdings gibt es auch noch die elegantere bzw. gerade für Programmieranfänger verständlichere Variante unless:
unless coffeescript
...
Alles gleich – der ==-Operator in CoffeeScript
In JavaScript gibt es den Operator ==, um zwei Werte auf Gleichheit zu überprüfen. Dieser Operator sorgt für so manchen WTF4-Moment beim Programmieren, vor allem, wenn Sie nicht so firm in JavaScript sind.
Die folgende Tabelle gibt einen kleinen Überblick5 über Ausdrücke und das nicht immer einleuchtende Ergebnis:
Ausdruck | Ergebnis (boolescher Wert) |
Tab. 2–1 Logische Ausdrücke und deren Ergebnisse (nach Douglas Crockford)
Was ist das Problem? Der Operator == und auch der negative != werden in vielen Programmiersprachen verwendet, so auch in JavaScript. Solange die Datentypen, die verglichen werden, identisch sind, funktionieren diese beiden Operatoren auch so, wie wir es erwarten würden. Problematisch sind jedoch die Fälle, in denen es um ungleiche Datentypen geht.
JavaScript wird in diesem Fall eine Umwandlung in gleiche Datentypen vornehmen und dann vergleichen. Die Regeln für diese Umwandlung sind kompliziert und man kann sie sich nur schwer merken. Als ein weiteres Beispiel: true == 1
ist wahr, da das true in eine 1 umgewandelt wird.
JavaScript bietet einen Ausweg aus diesem Dilemma, die Operatoren === und !==, die eigentlich immer verwendet werden sollten, da sie typsicher vergleichen. Nur wenn beide Datentypen identisch sind, liefert === ein true zurück.
Und CoffeeScript? Hier wird immer aus == ein === in JavaScript erzeugt (und aus != ein !==), sodass in CoffeeScript immer typsicher verglichen wird.
Alles is === – Aliase in CoffeeScript
Da CoffeeScript beim Übersetzen die Vergleichsoperatoren ersetzt, haben die Entwickler noch einige Aliase für diverse Operatoren hinzugefügt, die ich Ihnen nicht vorenthalten...