Developer und Speaker Tobi Timm, Senior Product Engineer bei SinnerSchrader, Koorganisator bei Nodeschool MUX/AUX und React Munich, erzählte Stefan, Schepp und Vanessa über funktionale Programmierung und endliche Zustandsmaschinen in JavaScript.
Schaunotizen
- [00:00:29] Funktionale Programmierung en Vogue
- Durch die immer höhere Popularität von progressiven Frontend-Frameworks wie React.js und Vue.js, die jeweils Ansätze der Funktionalen Programmierung (FP) aufweisen, erlaubt die FP an sich einen Aufschwung in der Web Entwicklung. Neben Elm, ein von Haskell inspiriertes Framework, gibt es für JavaScript-Entwickler und -Entwicklerinnen die Bibliothek Ramda.js. Für ESLint steht das Plugin eslint-plugin-functional zur Verfügung. Das wohl wichtigste Paradigma der Funktionalen Programmierung besteht daraus, das ausschließlich Funktionen geschrieben werden. Die Konzepte kommen von Haskell, LISP, OCaml oder auch Scheme, einem Vorgänger von Javascript. Funktionen gelten als „First Class Citizen“ und werden dabei auch „Pure Functions“ genannt. Diese generieren bei gleichem Input immer den gleichen Output und verwenden keine Variablen außerhalb ihres Scopes. Ein Vorteil von Funktionaler Programmierung ist dadurch, dass Nebenläufigkeiten verhindert werden und der Code weniger fehleranfällig ist. Getestet werden müssen dann Werte von außerhalb, wie z.B. Nutzereingaben oder Antworten von APIs. Für den Einstieg in die FP in einer bestehenden Codebase, empfiehlt Tobi z.B. For-Schleifen durch Funktionen wie .map(), .filter() und .reduce() zu ersetzen. Zum Lernen empfehlen wir die Videos von Dr. Boolean.
- Finite State Machines
- Etwas, das ähnliche Effekte wie die FP erzeugt, sind State Machines und State Charts. XState von David Khourshid ist hier das Framework für pure Javascript Entwicklung. Wie auch bei der FP ist die Lernkurve allerdings etwas höher, doch es scheint sich zu lohnen, sich mit diesem Thema zu befassen.
Kommentare
Markus Schlegel #
Geschrieben am 29.12.2020 um 14:30
Zum Thema ‚Optimierung mehrerer map/filter/reduce auf derselben
Kollektion‘:
Im allgemeinen wird JavaScript da nicht viel optimieren können, da ja
in jeder Funktion, die diesen Kombinatoren gegeben wird, potenziell
ein Seiteneffekt passieren könnte. Wenn der Compiler da jetzt die
Ausführungsreihenfolge ändert — und das ist es, was eine solche
Optimierung wesentlich tut — kämen die Effekte durcheinander.
Dahingegen werden in Sprachen, in denen Seiteneffekte ausgeschlossen
werden können, solche Optimierungen durchaus vorgenommen. Das
Zusammenfalten von Listenoperationen läuft dann unter dem Namen
‚Fusion‘: https://wiki.haskell.org/GHC_optimisations#Fusion
Im Podcast kamen die Wörter Transduce und Reduce durcheinander. Reduce
ist eine Funktion höherer Ordnung. Transducer sind ein Konzept, was in
dynamischen Sprachen wie Clojure(Script) Optimierungen ähnlich zu oben
genannter Fusion erlaubt: https://clojure.org/reference/transducers
Peter #
Geschrieben am 29.12.2020 um 14:49
Würden solche Optimierungen in modernen Engines nicht auf einem viel niedrigeren Level, d.h. in der Machine-Code-Repräsentation vorgenommen werden? Wo das kein unüberwindbares Problem mehr ist?
Markus Schlegel #
Geschrieben am 1.01.2021 um 11:40
Die Ausführungsreihenfolge der Effekte ist davon nicht betroffen.
„`
const array1 = [1, 3];
let f = (x => { console.log(x); return 2 * x; });
let f2 = (x => { return f(f(x)); })
const map1 = array1.map(f).map(f);
console.log(map1);
console.log(„—„);
const map2 = array1.map(f2);
console.log(map2);
„`
Die Funktion `f2` ist die Komposition von `f` mit`f`. Fusion würde dann bedeuten, dass `array1.map(f).map(f) == array1.map(f2)`. Das zurückgegebene Ergebnis links und rechts des == ist dasselbe. Die Ausführungsreihenfolge des console.log, was da noch mit drin steckt, ist aber eine andere. Links wird `1 3 2 6` geloggt, rechts wird `1 2 3 6` geloggt.
RSS-Feed zu diesem Beitrag
Kommentare sind für diesen Beitrag geschlossen.