Konzepte statt Hypes

Keine neuen Konzepte

Nimmt man das alles zusammen, stellt man fest, dass die genannten Konzepte nicht neu sind. Funktionale Programmierung, die map-Funktion, Funktionen als Bürger erster Klasse, Abstraktion, Unveränderlichkeit – das alles gibt es seit Jahrzehnten. Selbst die 1958 erschienene Sprache Lisp enthält all diese Konzepte. So lautet das Pendant zur JavaScript-Funktion

const getSquares = function (numbers) {
return numbers.map(n => n ** 2);
};

in Lisp

(defun get-squares (numbers)
(mapcar
(lambda (number) (expt number 2))
numbers))

wobei mapcar der Funktion map und expt dem **-Operator entspricht. Der Rest dürfte selbsterklärend sein.

Auch das Verwenden unveränderlicher Typen ist in Lisp vorgesehen. So gibt es beispielsweise zwei Funktionen zum Verknüpfen von Listen, append und nconc. Während Ersteres eine neue Liste zurückgibt und die ursprünglichen nicht verändert, modifiziert Letzteres diese. Die Dokumentation der nconc-Funktion weist darauf explizit hin, und das sogar unter dem Stichwort "Side Effects":

**Side Effects:**
The *lists* are modified rather than copied.

Bewertet man die eingangs erwähnten Module vor diesem Hintergrund, verlieren sie viel von ihrer vermeintlichen Magie. Es handelt sich bei Lodash, Immutable.js und React nämlich gerade nicht um kurzlebige Hypes, sondern um vernünftige Implementierungen uralter Konzepte. Das beantwortet zugleich die Frage, wie langlebig die Module sind und ob sie tatsächlich benötigt werden. Es mag sein, dass die konkrete Implementierung über kurz oder lang durch eine andere ersetzt wird, aber die Essenz der Module gehört zu den Grundlagen der Informatik.

Vergleicht man mit dem Wissen nun beispielsweise React und AngularJS, erkennt man bei React rasch nicht nur die technische, sondern auch die konzeptionelle Raffinesse. Es setzt nicht nur weitaus stärker auf den JavaScript-Standard und erfordert deshalb weitaus weniger Einarbeitungszeit in proprietäre, Framework-spezifische Aspekte, sondern nutzt auch die Möglichkeiten der funktionalen Programmierung viel besser aus.

An die Stelle nicht standardisierter Eigenschaften wie ng-repeat und *ng-for tritt die map-Funktion aus JavaScript. Der Ansatz ist weitaus eleganter als die Definition eigener Konstrukte, die letztlich doch nur dem Versuch entspringen, das Gleiche auszudrücken wie die map-Funktion.

Ein weiterer wichtiger Aspekt, der in allen drei Modulen eine Rolle spielt, ist die Frage nach der Identität beziehungsweise der Gleichheit von Objekten. Ob zwei Objekte identisch sind, lässt sich in JavaScript sehr leicht feststellen, da Objekte Referenztypen sind. Stimmen die beiden Referenzen überein, das heißt, verweisen sie auf dieselbe Adresse im Speicher, sind die Objekte identisch. Das ist das Standardverhalten von JavaScript, sodass ein Vergleich á la

if (user === customer) {
// ...
}

vollkommen genügt. Schwieriger sieht es bei der Gleichheit aus: Es liegt auf der Hand, dass identische Objekte automatisch auch gleich sind, doch umgekehrt gilt das nicht unbedingt. Einen Hinweis liefert der weiter oben gezeigte Code zum Implementieren von Wahrscheinlichkeiten. Er setzt explizit eine equals-Funktion um, die sogar bei einer Abweichung von 0.01 zwei Wahrscheinlichkeiten noch als gleich ansieht.

Ähnlich verhalten sich die drei genannten Module. Gibt es keine anderslautenden Angaben, geht Lodash zunächst davon aus, dass ausschließlich die Identität relevant ist. Möchten Entwickler beispielsweise mit der Funktion _.find das erste Element einer Arrays oder eines Objekts ermitteln, für das eine bestimmte Bedingung gilt, ist die standardmäßig verwendete Prädikatsfunktion die Identität. Gibt man eine eigene Funktion an, muss sie entscheiden, wann zwei Elemente als gleich gelten.

Die Datentypen von Immutable.js verfügen ebenfalls über eine equals-Funktion, mit der sich die Wertegleichheit von zwei Objekten feststellen lässt. Unter der Haube rufen alle entsprechenden Ansätze die zentrale Funktion Immutable.is auf.

Für React spielt insbesondere die Identität eine gravierende Rolle, wird sie doch verwendet, um zu entscheiden, welche Bereiche des DOM neu zu rendern sind. React führt die erwähnten Konzepte darüber hinaus auch auf der Ebene von Komponenten weiter. Funktionen, die keine Seiteneffekt aufweisen, sind in der funktionalen Programmierung als "Pure Functions" bekannt. In React spricht man bei zustandslosen Komponenten von "Pure Components". Auch die sogenannten Higher-order Components greifen die Terminologie und die Denkart der funktionalen Programmierung geschickt auf.