Einführung in Node.js, Folge 26: Let's code (comparejs)

the next big thing  –  0 Kommentare

JavaScript verfügt – wie auch andere Programmiersprachen – über Operatoren zum Vergleichen von Werten. Leider läuft ihre Funktionsweise häufig der Intuition zuwider. Warum also nicht die Vergleichsoperatoren in Form eines Moduls neu schreiben und dabei auf vorhersagbares Verhalten achten?

Werte zu vergleichen, ist in JavaScript eine mit Stolperfallen gespickte Aufgabe. Allein schon der Unterschied zwischen den Operatoren === und == ist fehleranfällig und führt zumindest bei Einsteigern zunächst zu unerwarteten Problemen.

Wächst die Erfahrung mit der Sprache, lernt man nach und nach, mit den Eigenheiten der Sprache umzugehen. Dennoch bleiben ausreichend viele Hürden, die den Einsatz der von Haus aus verfügbaren Operatoren zumindest umständlich machen. Praktisch wäre außerdem, Referenztypen nicht nur anhand der Referenz, sondern auch anhand ihrer Werte vergleichen zu können – beispielsweise in Unit-Tests.

Das alles ist mit Bordmitteln nicht möglich, doch gibt es bereits seit dem Jahr 2012 das npm-Modul comparejs, das diese Lücke verlässlich schließt. Es funktioniert tadellos und leistet seit vielen Jahren gute Dienste, allerdings ist der Code in die Jahre gekommen: Es war eines der ersten Module, die ich für Node.js geschrieben habe, und das merkt man.

Nachdem ich mit den Modulen typedescriptor und is-subset-of die Grundlagen dafür gelegt habe, war nun das Überarbeiten des Codes von comparejs an der Reihe: Das Modul enthält nun lediglich eine Reihe von Funktionen, verzichtet aber auf umständliche (und nur schwer nachvollziehbare) Wrapper-Funktionen wie die bisherigen Versionen.

Ausgesprochen praktisch während der Überarbeitung war die Tatsache, dass die Abdeckung des bestehenden Codes durch Unit-Tests sehr gut ist: Über 1000 Tests stellen das korrekte Verhalten der sechs Operatoren sicher. Das ermöglicht den gefahrlosen Umbau und das Einführen von neuem Code.

Das Modul ermöglicht nun den Vergleich bestehender Werte mit den folgenden sechs Funktionen, die jeweils einen logischen Wert zurückgeben:

const compare = require('comparejs');

// === und !==
console.log(compare.equal(23, 42)); // => false
console.log(compare.notEqual(23, 42)); // => true

// < und <=
console.log(compare.lessThan(23, 42)); // => true
console.log(compare.lessThanOrEqual(23, 42)); // => true

// > und >=
console.log(compare.greaterThan(23, 42)); // => false
console.log(compare.greaterThanOrEqual(23, 42)) // => false

Darüber hinaus steht außerdem die Funktion identity zur Verfügung, die tatsächlich auf Identität der übergebenen Werte prüft. Zu guter Letzt ist es außerdem möglich, Objekte an Hand ihrer Struktur zu vergleichen, um beispielsweise zu prüfen, ob ein Objekt ein gegebenes Interface implementiert (so gut das auf Basis des dynamischen Typsystems von JavaScript möglich ist).

Wie das Modul entstanden ist, zeige ich in der 26. Folge meiner Einführung in Node.js.

Einführung in Node.js, Folge 26: Let's code (comparejs)

tl;dr: Das npm-Modul comparejs implementiert die sechs Vergleichsoperatoren von JavaScript derart, dass ihr Verhalten der intuitiven Erwartung entspricht. Außerdem ermöglicht es den Wertevergleich von Referenztypen und den Strukturvergleich von Objekten.