SlideShare a Scribd company logo
ZNAKI MOCY
DLA LAIKÓW
Wiktor Toporek
O MNIE
Blog:
Na co dzień PHP i JS
Inspirują mnie inne języki programowania i podejścia
http://wiktortoporek.name/blog
Jak wyobrażam sobie nasze codzienne programowanie?
Znaki mocy dla laików – Programowanie funkcyjne w JavaScript
Znaki mocy dla laików – Programowanie funkcyjne w JavaScript
Jak wyobrażam sobie programowanie funkcyjne?
Znaki mocy dla laików – Programowanie funkcyjne w JavaScript
PURE FUNCTIONS
function f(x) {
return x * 2;
}
IMMUTABILITY
function f(x) {
x[0] = 1;
}
✗
Źródło: http://thecodinglove.com/post/120526844813
FIRST CLASS CITIZEN
FUNCTIONS
function f(x) {
...
}
var g = f;
(λ)
FUNKCJE WYŻSZYCH RZĘDÓW
Znaki mocy dla laików – Programowanie funkcyjne w JavaScript
Znaki mocy dla laików – Programowanie funkcyjne w JavaScript
Znaki mocy dla laików – Programowanie funkcyjne w JavaScript
FOREACH
var doubled = [];
[1, 2, 3].forEach(
function(v) {
doubled.push(v * 2);
}
);
FOREACH
MAP
[1, 2, 3].map(
function(v) {
return v * 2;
}
); //-> [2, 4, 6]
[1,2,3] → [2,4,6]
FILTER
[5, 6, 2, 1].filter(
function(v) {
return v % 2 == 0;
}
); //-> [6, 2]
[5,6,2,1] → [6,2]
REDUCE
var grades = [5, 5, 4, 3, 4, 2];
var sum = 0;
for (var i in grades) {
sum += grades[i];
}
var avg = sum / grades.length;
var grades = [5, 5, 4, 3, 4, 2];
var sum = grades.reduce(
function(currentSum, currentGrade) {
return currentSum + currentGrade;
}
);
var avg = sum / grades.length;
[5,5,4,3,4,2] → 23
[1, 2, 3]
[keyDown, keyDown, keyDown, ...
RxJS
github.com/Reactive-Extensions/RxJS
REAGOWANIE NA KLAWISZ ENTER
var keydown = Rx.Observable.fromEvent(document, 'keydown');
keydown.forEach(
function(event) {
if (event.which === 13) {
// do something
}
}
);
Elastyczniej:
var keydown = Rx.Observable.fromEvent(document, 'keydown');
var enterPresses = keydown.filter(
function(event) {
return event.which === 13;
}
);
enterPresses.forEach(function() {/* do something */});
RXMARBLES.COM
DRAG & DROP
M↓ M↓
M⇝ M⇝ M⇝ M⇝ M⇝ M⇝ M⇝
M↑ M↑
var mousedown = Rx.Observable.fromEvent(dragTarget, 'mousedown');
var mousemove = Rx.Observable.fromEvent(document, 'mousemove');
var mouseup = Rx.Observable.fromEvent(dragTarget, 'mouseup' );
var mousedrag = mousedown.flatMap(
function (md) {
// calculate offsets when mouse down
var startX = md.offsetX, startY = md.offsetY;
// Calculate delta with mousemove until mouseup
return mousemove.map(function (mm) {
mm.preventDefault();
return {
left: mm.clientX - startX,
top: mm.clientY - startY
};
}).takeUntil(mouseup);
}
);
mousedrag.forEach(function(newPosition) {
// change element position
});
(())
KOMPOZYCJA
Przykład startowy
var name = "Doge"
console.log("Hello " + name);
Trochę elastyczniej...
...ale nie do końca
var name = "Doge"
function printIt(name) {
console.log("Hello " + name);
}
printIt(name);
printIt("Bye Doge"); // Hello Bye Doge
Osobna funkcja do witania:
function greeting(name) {
return "Hello " + name;
}
Użycie:
var name = "Doge";
printIt(greeting("Doge")); // Hello Doge
POŁĄCZMY DWIE FUNKCJE W JEDNĄ
Klasyczną drogą:
var name = "Doge";
function greet(name) {
printIt(greeting(name));
}
greet(name);
Drogą FP:
var name = "Doge";
var greet = compose(printIt, greeting);
greet(name);
CO ROBI COMPOSE?
A co z parametrem innego typu?
var user = {
id: 123,
name: "Doge"
};
To:
greet(user); // Hello [object Object]
Dopiszmy kolejną funkcję:
function printIt(name) {
console.log(name);
}
function greeting(name) {
return "Hello " + name;
}
function getName(user) {
return user.name;
}
Skomponujmy nową ze wszystkich trzech:
var greetUser = compose(printIt, greeting, getName);
var user = {
id: 123,
name: "Doge"
};
greetUser(user);
Nie musimy ograniczać się do własnych funkcji:
function getFullname(person) {
return [person.firstName, person.lastName].join(' ');
}
var getFullnameFromJson = compose(getFullname, JSON.parse);
()()()
CURRYING
Przykład startowy
Użycie:
function sendMessage(from, to, message) {
console.log([from, ' -> ', to, ': ', message].join(""));
}
sendMessage('John', 'Alice', 'Hello!'); //John -> Alice: Hello!
Jako John:
sendMessage('John', 'Alice', 'Hello!');
sendMessage('John', 'Alice', 'How are you?');
sendMessage('John', 'Bob', 'Hello!');
Ułatwmy Johnowi:
function sendMessageFromJohn(to, message)
{
sendMessage('John', to, message);
}
sendMessageFromMe('Alice', 'Hello!');
sendMessageFromMe('Alice', 'How are you?');
sendMessageFromMe('Bob', 'Hello!');
Ręczny Currying
function sendMessage(from) {
return function(to) {
return function(message) {
console.log([from, ' -> ', to, ': ', message].join(""));
}
}
}
Użycie:
var sendMessageFromMe = sendMessage(currentUser);
sendMessageFromMe('Alice')('Hey');
Currying z Lodash
var sendMessage = _.curry(
function(from, to, message) {
console.log([from, ' -> ', to, ': ', message].join(""));
}
);
Użycie:
var sendMessageFromMe = sendMessage(currentUser);
sendMessageFromMe('Alice', 'Hey');
v←λ
MONADA
Źródło: https://en.wikipedia.org/wiki/Monad_(category_theory)
Źródło: http://thecodinglove.com/post/119589628797/
Źródło: http://pl.wikipedia.org/wiki/Monada_(programowanie)
Źródło: https://twitter.com/jlouis666/status/569465010759573505
[TASK].[ASSIGNED_COMPANY_LOGO_URL]
[TASK] → [ASIGNEE] → [COMPANY] → [LOGO] → [URL]
function getTaskCompanyLogoUrl(task)
{
return task.asignee.company.logo.url;
}
Problem:
var task = {
'asignee': null
};
getTaskCompanyLogoUrl(task);
Źródło: http://www.practical-programming.org/articles/love_null/love_null.html
Klasycznie:
function getTaskCompanyLogo(task)
{
if (task.asignee !== null) {
if (task.asignee.company !== null) {
if (task.asignee.company.logo !== null) {
return task.asignee.company.logo.url;
}
}
}
return null;
}
task → getAsignee → getCompany → getLogo → getUrl
task → stop if null → getAsignee → stop if null → ... → getUrl
MAYBE
MONADOWY PLAN:
Value - Bieżemy wartość
[ Value ] - Opakowujemy ją
[ Value ].map(f).map(f)... - Dowiązujemy pewne operacje
[ Value ].getValue() - Odpakowujemy nową wartość
Przykład z pomocą Monet.js*:
function getTaskCompanyLogo(task)
{
var maybeCompanyLogoUrl = Maybe.of(task)
.map(getAsignee)
.map(getCompany)
.map(getLogo)
.map(getUrl);
return maybeCompanyLogoUrl.val;
}
* fork vViktorPL/monet.js z drobną zmianą na potrzeby prezentacji
Gettery:
function getCompany(object) {
return object.company;
}
function getLogo(object) {
return object.logo;
}
function getUrl(object) {
return object.url;
}
ES6:
function getTaskCompanyLogo(task)
{
var maybeCompanyLogoUrl = Maybe.of(task)
.map(task => task.asignee)
.map(asignee => asignee.company)
.map(company => company.logo)
.map(logo => logo.url);
return maybeCompanyLogoUrl.val;
}
JAK TO DZIAŁA?
Maybe = Some | None
Some.map(f) => {
var result = f(this.val);
if (result !== null) {
return Some(result);
} else {
return None;
}
}
None.map(f) => None
PROMISE
Angularowe $q
Źródło: https://docs.angularjs.org/api/ng/service/$q
function asyncGreet(name) {
// perform some asynchronous operation, resolve or reject the promise when
return $q(function(resolve, reject) {
setTimeout(function() {
if (okToGreet(name)) {
resolve('Hello, ' + name + '!');
} else {
reject('Greeting ' + name + ' is not allowed.');
}
}, 1000);
});
}
function asyncGreet(name) {
...
}
var promise = asyncGreet('Robin Hood');
promise.then(function(greeting) {
alert('Success: ' + greeting);
}, function(reason) {
alert('Failed: ' + reason);
});
var promise = asyncGreet(name); - Opakowanie wartości
promise.then() - .map()?
greeting - wyłuskana nowa wartość
PODSUMOWANIE
Funkcje wyższych rzędów takie jak map czy filter
ułatwiają przetworzenie serii danych
Kompozycja umożliwia w łatwy sposób składanie kilku
funkcji w jedną
Currying może przydać się do funkcji które przyjmują
wiele argumentów
Monada to warstwa abstrakcji która sama decyduje w jaki
sposób wykona przekazane jej operacje
MOJE WNIOSKI
Wzorce z FP da się odnaleźć w OO
FP rzuca inne światło na niektóre problemy
Programowanie czysto funkcyjne jest szaleństwem dla
aplikacji z życia wziętych (potrzebujemy stanu prędzej czy
później)
FP jest źle "sprzedawane"
FP można łączyć z OO
DZIĘKUJE ZA UWAGĘ
PYTANIA?
KOMENTARZE?

More Related Content

PDF
Wprowadzenie do języka Swift, czyli nowe podejście do programowania aplikacji...
PPT
Podstawy php
PPT
Podstawy php
PPTX
Prezentacja php3
PDF
Analizy Przestrzenne z wykorzystaniem GRASS vol.15
PDF
Budowa elementów GUI za pomocą biblioteki React - szybki start
PDF
Angular Restmod
Wprowadzenie do języka Swift, czyli nowe podejście do programowania aplikacji...
Podstawy php
Podstawy php
Prezentacja php3
Analizy Przestrzenne z wykorzystaniem GRASS vol.15
Budowa elementów GUI za pomocą biblioteki React - szybki start
Angular Restmod

What's hot (20)

PDF
Podstawy AngularJS
PDF
Architektura ngrx w angular 2+
PPTX
ASP.NET MVC - najważniejsze założenia
PDF
Nie wszystko, co ubite, w ziemi zostaje. Wprowadzenie do Event Sourcing
DOCX
Zajecia4 progbiz
PDF
TWIG - niezłe widoki dla PHP
PDF
Kickoff to Node.js
PDF
Modularny JavaScript - meet.js
PDF
Secure Coding w praktyce.
PDF
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
PDF
infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Cl...
PDF
TypeScript as a runtime error terminator
PDF
Technologia Xamarin i wprowadzenie do Windows IoT core
PDF
Wprowadzenie do technologii Big Data
PPTX
Java 8 jest tuż za rogiem
PDF
Objective C
ZIP
JavaScript jako przykład obiektowego języka zorientowanego na prototypy
PDF
NSOperation(Queue)
ODP
ZamCamp #6 - Najczęstsze błędy w PHP
PDF
Lexical scope, function vs. block scope, hoisting, scope closures
Podstawy AngularJS
Architektura ngrx w angular 2+
ASP.NET MVC - najważniejsze założenia
Nie wszystko, co ubite, w ziemi zostaje. Wprowadzenie do Event Sourcing
Zajecia4 progbiz
TWIG - niezłe widoki dla PHP
Kickoff to Node.js
Modularny JavaScript - meet.js
Secure Coding w praktyce.
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Cl...
TypeScript as a runtime error terminator
Technologia Xamarin i wprowadzenie do Windows IoT core
Wprowadzenie do technologii Big Data
Java 8 jest tuż za rogiem
Objective C
JavaScript jako przykład obiektowego języka zorientowanego na prototypy
NSOperation(Queue)
ZamCamp #6 - Najczęstsze błędy w PHP
Lexical scope, function vs. block scope, hoisting, scope closures
Ad

Viewers also liked (20)

PDF
Bestiariusza wpisy wybrane
PDF
Sporządzanie oraz umiejętne wykorzystanie przepisów i schematów. Ansible w pr...
PDF
Deploy appki na iOS, czyli magia publikacji
PDF
Confd - Uszanowanko Programowanko
PDF
Deployment z Ansible
PDF
Praktyczne porady na temat optymalizacji wydajności aplikacji tworzonych z u...
PDF
REvolution, czyli o bardziej obiektowym podejściu w Railsach
PDF
Pierwsza aplikacja na iOS, czyli z czym można się spotkać, co jest trudne i c...
PDF
Developer mode on, czyli słów kilka o rbenv, rvm i ruby-ng
PDF
O wyprawie królika przez maszynkę do gniazdka, czyli EventMachine w praktyce
PDF
Jak ugryźć Ruby, żeby nie połamać zębów?
PDF
Red Green Hotfix – złudne poczucie bezpieczeństwa w testach
PDF
ReactPHP – reaktor jądrowy w PHP
PDF
Pi razy drzwi - o szacowaniu projektów
PDF
O Electronie słów kilka
PDF
Gulp.js - alternatywa do Grunta
PDF
PDF
Wielkie protokoły wielkich ludzi
Bestiariusza wpisy wybrane
Sporządzanie oraz umiejętne wykorzystanie przepisów i schematów. Ansible w pr...
Deploy appki na iOS, czyli magia publikacji
Confd - Uszanowanko Programowanko
Deployment z Ansible
Praktyczne porady na temat optymalizacji wydajności aplikacji tworzonych z u...
REvolution, czyli o bardziej obiektowym podejściu w Railsach
Pierwsza aplikacja na iOS, czyli z czym można się spotkać, co jest trudne i c...
Developer mode on, czyli słów kilka o rbenv, rvm i ruby-ng
O wyprawie królika przez maszynkę do gniazdka, czyli EventMachine w praktyce
Jak ugryźć Ruby, żeby nie połamać zębów?
Red Green Hotfix – złudne poczucie bezpieczeństwa w testach
ReactPHP – reaktor jądrowy w PHP
Pi razy drzwi - o szacowaniu projektów
O Electronie słów kilka
Gulp.js - alternatywa do Grunta
Wielkie protokoły wielkich ludzi
Ad

Similar to Znaki mocy dla laików – Programowanie funkcyjne w JavaScript (10)

PDF
Not-So-Object Oriented Programming
PDF
RxJS okiem doświadczonego inżyniera - Angular Warsaw #13
PDF
Elm jako inspiracja
PPSX
Professional Javascript for Developers
PDF
Podstawy JavaScript | DreamLab Academy #7
PPTX
Intro to JavaScript | Wstęp do programowania w Java Script | DreamLab Academy #4
PDF
4Developers 2018: Unit testing - introduction (Marek Kawczyński)
PPT
Mvc frontend-trug-02-2011
PDF
Refaktoryzacja
PPTX
Reactive programming
Not-So-Object Oriented Programming
RxJS okiem doświadczonego inżyniera - Angular Warsaw #13
Elm jako inspiracja
Professional Javascript for Developers
Podstawy JavaScript | DreamLab Academy #7
Intro to JavaScript | Wstęp do programowania w Java Script | DreamLab Academy #4
4Developers 2018: Unit testing - introduction (Marek Kawczyński)
Mvc frontend-trug-02-2011
Refaktoryzacja
Reactive programming

More from The Software House (20)

PDF
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
PDF
Uszanowanko Podsumowanko
PDF
Jak efektywnie podejść do certyfikacji w AWS?
PDF
O co chodzi z tą dostępnością cyfrową?
PDF
Chat tekstowy z użyciem Amazon Chime
PDF
Migracje danych serverless
PDF
Jak nie zwariować z architekturą Serverless?
PDF
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
PDF
Feature flags na ratunek projektu w JavaScript
PDF
Typowanie nominalne w TypeScript
PDF
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
PDF
Serverless Compose vs hurtownia danych
PDF
Testy API: połączenie z bazą danych czy implementacja w pamięci
PDF
Jak skutecznie read model. Case study
PDF
Firestore czyli ognista baza od giganta z Doliny Krzemowej
PDF
Jak utrzymać stado Lambd w ryzach
PDF
Jak poskromić AWS?
PDF
O łączeniu Storyblok i Next.js
PDF
Amazon Step Functions. Sposób na implementację procesów w chmurze
PDF
Od Figmy do gotowej aplikacji bez linijki kodu
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Uszanowanko Podsumowanko
Jak efektywnie podejść do certyfikacji w AWS?
O co chodzi z tą dostępnością cyfrową?
Chat tekstowy z użyciem Amazon Chime
Migracje danych serverless
Jak nie zwariować z architekturą Serverless?
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Feature flags na ratunek projektu w JavaScript
Typowanie nominalne w TypeScript
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Serverless Compose vs hurtownia danych
Testy API: połączenie z bazą danych czy implementacja w pamięci
Jak skutecznie read model. Case study
Firestore czyli ognista baza od giganta z Doliny Krzemowej
Jak utrzymać stado Lambd w ryzach
Jak poskromić AWS?
O łączeniu Storyblok i Next.js
Amazon Step Functions. Sposób na implementację procesów w chmurze
Od Figmy do gotowej aplikacji bez linijki kodu

Znaki mocy dla laików – Programowanie funkcyjne w JavaScript