Prolafex, Nr. 1: Der Dart'sche Doppel-Punkt

Babel-Bulletin  –  22 Kommentare

Liefert eine Methode void – also nichts –, dann kann man dieses natürlich nicht direkt weiterverarbeiten. Außer man heißt Dart – und hat einen Doppel-Punkt.

Pro·la·fex, das; -, -e <engl.-lat.> [Abk. für : programming language feature extra ordinem]: Element einer Programmiersprache, das aus verschiedensten Gründen besondere Beachtung verdient – ohne jedermann gefallen zu müssen.

Unabhängig davon, was man von JavaScript hält, muss man doch eingestehen, dass es browserseitig keinen Weg daran vorbei gibt. Dementsprechend vielfältig sind die Bemühungen, JavaScript – mit unterschiedlichster Motivation – etwas handhabbarer zu machen, was zu einer unüberschaubaren Menge von Möglichkeiten führt.

Eines der Highlights aus dieser Liste ist Dart, eine konsequent objektorientierte Sprache, die deutlich konsistenter, strukturierter und aufgeräumter als JavaScript ist und gute Möglichkeiten bietet, auch große Projekte meistern zu können. Dart-Programme werden mithilfe eines Compilers nach JavaScript übersetzt und können so sowohl in einem JavaScript-fähigen Browser als auch auf der Dart VM laufen.

Typisierung

Der bemerkenswerteste Unterschied zwischen Dart und JavaScript ist die Typisierung. In Dart können nämlich Variablen, Parameter und alles, was einen Typ verdient, optional mit einem Typ versehen werden. Dabei versteht sich diese Typisierung als Annotation, die es dem Compiler erlaubt, viele der typischen JavaScript-Fehler schon zur Übersetzungszeit zu tilgen – ohne semantische Änderungen hervorzurufen.

Dart hat ein Feature, von dem vielleicht viele Entwickler träumen: den "Doppel-Punkt". Wie in vielen Programmiersprachen üblich, wird ein Zugriff auf ein Feld oder eine Methode mit einem Punkt geschrieben:

object.feld
object.methode()

Das Ergebnis lässt sich dann direkt weiterverarbeiten, solange es der durch die Methode vorgegebene Typ zulässt. So gibt die folgende Anweisung

"Hallo".length.toString() 

die Zeichenkette "5" aus, da String den Getter length hat und toString diese Zahl in ihre String-Repräsentation umwandelt.

Verwendet man nun die Doppel-Punkt-Notation "..", wird nicht etwa das Ergebnis der Methode oder des Feldes geliefert, sondern der Empfänger selbst. In dem folgenden – zugegebenermaßen nicht besonders sinnvollen, aber nicht weniger instruktiven – Beispiel

"Hallo"..length.toString() 

wird also nicht "5" geliefert, sondern "Hallo".

Mithilfe des Doppel-Punkts lassen sich also Methodenkaskaden aufrufen, mit denen sich beispielsweise ein Objekt initialisieren lässt. Hat etwa ein veränderbares Person-Objekt person die zwei Methoden setFirstName und setLastName, dann müsste eigentlich

person.setFirstName("Peter");
person.setLastName("Pan");

geschrieben werden. Stattdessen ist nun aber auch möglich:

person
..setFirstName("Peter")
..setLastName("Pan");

Wofür ist das gut?

Damit lassen sich also auch die sogenannte "fluent interfaces" – also quasi-natürlichsprachliche Schnittstellen definieren – ohne dies von vornherein planen zu müssen. Üblicherweise würden in diesem Fall nämlich die beiden Setter wohl kein Ergebnis (void) liefern; sie können aber trotzdem in der Kaskade verwendet werden, weil der Doppel-Punkt ja den ursprünglichen Empfänger liefert.

Das lässt sich auch dazu benutzen, um Ausdrücke zu vereinfachen. Beispielsweise lassen sich Listen sortieren, aber die Dart'sche sort-Funktion liefert kein Ergebnis. Deshalb ist das Folgende auch tatsächlich in zwei Zeilen zu schreiben:

var numbers = [17, 23, 11, 31, 73].sublist(1, 3);
var sortedNumbers = numbers.sort();

wenn man für sortedNumbers die sortierte Teilliste haben will. Würde man das als Einzeiler schreiben wollen

var sortedNumbers = [17, 23, 11, 31, 73].sublist(1, 3).sort()

so enthielte sortedNumbers den Wert null, weil ja sort gar kein Ergebnis hat. Der Doppel-Punkt-Operator aber schafft Abhilfe:

var sortedNumbers = [17, 23, 11, 31, 73].sublist(1, 3)..sort()

Denn nun wird doch das Ergebnis von sublist geliefert, das allerdings zwischenzeitlich sortiert wurde.

Ob der Unterschied zwischen "." und ".." groß genug ist, sei mal dahingestellt, aber der Doppel-Punkt löst auf interessante Weise, nicht ohne eine gewisse Eleganz ein bekanntes Problem.