Webmasters Akademie
  • Warenkorb
  • Blog
  • Kontakt
  • Impressum
  • AGB
  • Datenschutz
  • Seminare
  • Lehrgänge
  • Inhouse-Trainings
    • Firmenseminare
    • Individualtraining
  • Consulting
  • Zertifizierung
    • Zertifizierungen
    • Adobe
    • Webmasters Europe
  • Fragen & Antworten
    • Häufige Fragen
    • Lehr- & Lernmethodik
    • Pluspunkte & Service
    • Rabatte
    • Fördermöglichkeiten
    • Kundenstimmen
  • Akademie
    • Grußwort
    • Team & Dozenten
    • Räume & Campus
    • Profil & Leitbild
    • Qualitätssicherung
    • Nürnberg
    • Anfahrt
    • Wohnen
    • Referenzen
Suche
Blogbeiträge abonnieren
Kategorien
  • Schräg, wie?
  • Papiertiger
  • Programmierung
  • Aktuelles
  • Der abenteuerliche Ximplicissimus
  • Grafithek
  • Administration
  • Internetzugang und Internet Service Provider (ISP)
  • SEO & SEM
Autoren
  • Thorsten Schneider
  • Frank Schad
  • Marc Remolt
  • Ulrike Walter
  • Monika Beck
  • Dorian Karnbaum
  • Christian Eichhorn
  • Marco Emrich
Neue Kommentare
XAMPP Tutorial und HowTo für MAC OS X
  • nina:

    vielen dank! du hast mir das leben gerettet :)

  • Seofem:

    Danke für das Tutorial. Und der Kommentarbereich mit den "Zettel" sieht auch wirklich gelungen aus.…

Was ist Behavior Driven Development?
  • Marco Emrich:

    Hallo Stephan,…

  • Stephan:

    Tolle Einführung in die Thematik BDD! Bei den Empfehlungen würde ich aber definitiv noch Cucumber…

Feed-Abo
  • Kommentare als RSS
Blog
  • Blog-Info
  • Blog-Regeln
Startseite Webmasters AkademieBlog Funktionale Programmierung in der Praxis: List-At-Once & Higher-order functions

Funktionale Programmierung in der Praxis: List-At-Once & Higher-order functions Marco Emrich

von Marco Emrich in Programmierung
am Freitag, 28. Mai 2010 um 14:04
Tags: Functional Programming , Ruby , JavaScript

Für viele Entwickler, die mit Ruby oder mit JavaScript Frameworks wie Prototype oder JQuery arbeiten, gehört es längst zum Programmieralltag. Die Rede ist hier von Funktionen höherer Ordnung wie map, inject oder each. Dennoch denke ich, ist es das richtige Thema für den Auftakt meiner Blogreihe über die Anwendung von FP in der Praxis.

Higher-Order Functions sind Funktionen, die andere Funktionen als Parameter entgegennehmen oder zurück liefern. Ein sinnvoller Anwendungszweck ist dabei das verarbeiten von Listen bzw. Arrays.

Die map-Methode

Hier ein Beispiel in JavaScript: Gesetzt den Fall, Sie haben ein Array mit Datumsangaben. Für beispielsweise eine spätere Ausgabe, benötigen Sie aber nur die Jahreszahlen. Die Aufgabe besteht also darin z.B das Array [new Date(1999, 5, 8), new Date(2003, 5, 8), new Date(2010, 3, 27)] in das Array [1999, 2003, 2010] zu überführen.

Die klassische prozedurale Lösung könnte so aussehen:

    var jahreszahlen = [];
    for (var i = 0; i < datumsangaben.length; ++i) {
        jahreszahlen[i] = datumsangaben.getFullYear[i];
    }

Im Grunde ist das kein schwieriger Code, dennoch gibt es einige Stellen die Fehlerpotential bieten - z.B. <= statt < oder i = 1 statt 0. Außerdem erschließt sich der Sinn des Codes auch nicht mit einem Blick. Stattdessen muss der Leser kurz darüber nachdenken.

Besser ist folgende Variante, die sich mit Hilfe des Frameworks Prototype realisieren lässt.

var jahreszahlen = datumsangaben.map(function(d){return d.getFullYear()});

Abgesehen davon, das Sie ganz offensichtlich kürzer ist, als die klassische Variante, bietet diese funktionale Variante eine Reihe von Vorteilen. Zunächst einmal gibt es weniger Angriffsflächen für Fehler, da hier keine Zählvariable, kein Vergleich und kein Arrayzugriff notwendig sind. Am wichtigsten ist aber die Tatsache, dass ein geübter (!) Programmierer die Intention des Codes mit einen kurzen Blick erfassen kann: Die Datumsangaben werden abgebildet auf ihr FullYear.

Wie funktioniert das den nun? Die Funktion map ist eine higher-order Funktion, die ein Array auf ein anderes Array abbildet (mäppt auf gut denglisch). Dabei übernimmt sie als Parameter eine Funktion, die die Abbildung pro Element beschreibt. In unserem Fall ist das die Funktion: function(d){return d.getFullYear()}. Eine Datumsangabe wird jeweils auf Ihr FullYear abgebildet ... und das wars. Um das Ausführen der Schleife und das Einsammeln der Ergebnisse kümmert sich map.

Map in anderen Sprachen

Die Ruby-Variante benötigt kein Framework und ist sogar noch einfacher:

jahreszahlen = datumsangaben.map(&:year)

Auch Actionscript 3 benötigt kein Framework. map ist für Arrays bereits definiert (seltsamerweise aber nicht für ArrayCollections). In PHP heißt die Funktion array_map und ist leider nicht objekt-orientiert, aber zumindest auch funktional (also im Sinne von FP).

map ist außerdem nicht nur eine higher-order Funktion, sondern zählt auch zur Gruppe der List-At-Once-Funktionen. Das sind Funktionen, die ein ganzes Array (bzw. Liste) auf einmal bearbeiten. Von diesen gibt es noch viele weitere, deren Einsatz ebenfalls dramatische Codeverbesserungen zur Folge hat: z.B. each, filter / find_all, inject / reduce, all?, some?, any?

Natürlich heißen Sie je nach Sprache meist ein wenig anders. Es lohnt aber definitiv sie nachzuschlagen.

In Ruby und Prototype arbeite ich jetzt schon seit mehr als 5 Jahren mit solchen Funktionen und kann behaupten, dass sich Ihr Einsatz mehr als lohnt. Klassische Schleifen benötige ich nur noch in ganz seltenen Fällen.

2006 habe ich übrigens selbst eine Bibliothek geschrieben, die die wichtigsten dieser Methoden von Ruby auf JavaScript überträgt: rubystylejs. Allerdings muss ich gestehen, dass Prototype und jQuery die wichtigsten Aufgaben mittlerweile erfüllen. Damit ist für mich die Notwendigkeit entfallen, das Projekt weiterzuentwickeln. In ActionScript sehe ich da jedoch noch größeren Bedarf. Mal sehen, ob ich je Zeit für ein solches Projekt finde ...

Kommentare (0)

Kommentar schreiben

*

(notwendig)

*

(notwendig, wird nicht angezeigt)



(falls vorhanden, Spam und Werbe-Links werden gelöscht!)
Beispiel: http://wwww.webmasters.de

*

*

Ich stimme den Blog-Regeln zu. *