Ajaxer

In Javascript we trust

17. Januar 2014
von Oliver Ochs
Keine Kommentare

JavaScript als funktionale Programmiersprache – Teil 12 – Currying

Der Begriff Currying hat nichts mit der Gewürzmischung zu tun, sondern geht zurück auf den Mathematiker Haskell Curry, nach dem die Programmiersprache Haskell benannt ist.

Durch Currying lassen sich Parameter einer Funktion vorbefüllen. Die this- Variable bleibt vom Currying unberührt. Currying funktioniert, indem man eine neue Funktion aus einer bestehenden Funktion und einem vorzubefüllenden Parameter zusammensetzt. Dazu muss eine Curry-Methode üblicherweise im Prototyp des Funktionsobjekts implementiert werden.

An dieser Stelle folgt die Implementierung Douglas Crockford, da diese sicherlich die verbreitetste Currying-Implementierung ist. Allerdings musste sie angepasst werden, da die ursprüngliche Beispielimplementierung nicht in allen Umgebungen lauffähig ist.


Function.prototype.curry = function() {
  // get the slice method
  var slice = Array.prototype.slice, 
    // preserve ags array for closure 
    args = slice.apply(arguments), 
    // preserve this for closure
    that = this; 
  return function() {
    return that.apply(null, args.concat(slice.apply(arguments))); 
  };
};

Diese Currying-Funktion lässt sich nun einsetzen. Wir verwenden die plus-Funktion, die eigentlich zwei Parameter erwartet, und gehen davon aus, dass in unserem Anwendungsfall stets zu einem Basiswert hinzuaddiert werden soll.


var addToBase = plus.curry(100); print(addToBase(5)); // 105

In den letzten Blog-Posts haben Sie JavaScript als funktionale Programmiersprache kennengelernt. Sowohl die Deklaration als auch die Verwendung von Funktionen sollten bekannt sein. Scopes sollten verstanden worden sein, denn Scopes sind im Zusammenhang mit Closures wichtig. JavaScript ist jedoch nicht nur eine funktionale, sondern auch eine prototypische Programmiersprache. Daher wird im folgenden Kapitel im Buch (s.u.!) JavaScript als prototypische Programmiersprache behandelt.

Cover-klein in JavaScript als funktionale Programmiersprache - Teil 12 - Currying - AjaxerDies ist eine autorisierte Leseprobe aus dem Buch Oliver Ochs – JavaScript für Enterprise-Entwickler: Professionell programmieren im Browser und auf dem Server – dpunkt.verlag GmbH 2012.

9. Januar 2014
von Oliver Ochs
Keine Kommentare

JavaScript als funktionale Programmiersprache – Teil 11 – Funktionscaching

Angenommen, eine Funktion führt eine komplexe Berechnung aus. Diese Berechnung ist nur abhängig von den übergebenen Parametern und nicht vom Kontext, in dem diese Funktion ausgeführt wird. Dann lässt sich der Rückgabewert der Funktion cachen. Dieses Entwurfsmuster wird »Memorization« genannt.

Memorization wird hier wieder an der Fakultätsfunktion dargestellt, da diese sich besonders für das Caching anbietet.


function cachedFactorial(n) {
  if (n < = 1) {
    return 1;
  } else if (!cachedFactorial.cache[n]) {
    var result = n * cachedFactorial(n-1);
    cachedFactorial.cache[n] = result; 
  }
  return cachedFactorial.cache[n]; 
}
// leeren Cache erstellen
cachedFactorial.cache = {};
// 5 Rekursionen und befüllen des Cache
console.log(cachedFactorial(5)); //120
// nur eine Rekursion da 2..5 bereits im Cache sind
console.log(cachedFactorial(6)); // 720

Cover-klein in JavaScript als funktionale Programmiersprache - Teil 11 - Funktionscaching - AjaxerDies ist eine autorisierte Leseprobe aus dem Buch Oliver Ochs – JavaScript für Enterprise-Entwickler: Professionell programmieren im Browser und auf dem Server – dpunkt.verlag GmbH 2012.