not-so-object oriented programming
TRANSCRIPT
Programowanie nie do końca obiektowe
…czyli kilka sposobów na przeżycie bez klas.
Przemek Smyrdek
Jak programujemy?
Imperatywnie Deklaratywnie
Proceduralnie LogicznieObiektowo Funkcyjnie
Obiektowo jest wporzo.
Klasy odwzorowują obiekty biznesowe
Działanie metod jest przewidywalne
OOP wspiera dobre praktyki
To prawda, ale…
Ukryte wejścia / wyjścia
Efekty uboczne
Stan algorytmu / klasy / etc.
Modyfikacja (mutacja) parametrów
Obiektowo jest wporzo?
Klasy odwzorowują obiekty biznesowe(a o wszystkim decyduje ich aktualny stan)
Działanie metod jest przewidywalne(ale nie ma problemu żeby wykonać coś „na boku”)
OOP wspiera dobre praktyki(ale nie zabrania złych)
Funkcyjnie? No coś słyszałem, ale…
No coś słyszałem, ale…
…w sumie po co, skoro C# / Ruby / Java mi wystarczy?
…w sumie po co, skoro od zawsze robiłem w jQuery i działało?
…w sumie po co, skoro nie znam a i tak mi płacą?
…w sumie po co, skoro…
Problem nr 1 – system edukacji
„To, że ciągle robisz coś w określony sposób
wcale nie oznacza, że jest to najlepszy sposób
na robienie tego czegoś.”
Problem nr 2 – przyzwyczajenia
„JS jest złym językiem, bo nie ma klas.”
Problem nr 3 – OOP jako lek na wszystko
Warto poszerzać horyzonty
Co zdiagnozowaliśmy do tej pory?
efekty uboczne
globalny stan
modyfikacja parametrów
A gdyby tak użyć funkcji matematycznych…
y = f(x)
f(2) = 12
Przewidywalne zachowanie
Mapowanie wejścia na wyjście
Wysoki poziom abstrakcji
Dziedzina
Abstrakcja
12345…
357911…
f(x) = 2x + 1
12345…
357911…
public int MultiplyAndAddOne(int input){
int multiplied = input * 2;int addOneResult = multiplied + 1;return addOneResult;
}
12345…
357911…
public int MultiplyAndAddOne(int input){
switch(input){
case 1: return 3;case 2: return 5;case 3: return 7;…
}}
Brak efektów ubocznych
(no side-effects)
Brak mutacji parametru
(immutability)
Funkcja jest bezstanowa
(stateless)
public int MultiplyAndAddOne(int input){
switch(input){
case 1: return 3;case 2: return 5;case 3: return 7;…
}}
=> Przewidywalne zachowanie
=> Łatwe testowanie
=> Zmiana nawyków
public int MultiplyAndAddOne(int input){
switch(input){
case 1: return 3;case 2: return 5;case 3: return 7;…
}}
map
filter
reduce
…
Funkcyjnie, czyli co zrobić, a nie jak zrobić:
map
filter
reduce
Funkcja to obiekt pierwszej klasy
Przypisanie funkcji
Funkcja jako parametr
Funkcja zwracana z innej funkcji
Języki funkcyjne
Czysto funkcyjne
Mieszane
Programowanie funkcyjne x 2
F#
• Microsoft, 2005
• Pozwala na tworzenie kodu w wielu paradygmatach
• Mocno typowany
• Oparty o platformę .NET
• Visual Studio
• Pipes, pattern matching, async
F# - DEMO
Reactive Extensions
• „Reactive Functional Programming”
• Programowanie reaktywne – wykorzystanie wzorca Obserwator
• Cross-platform (.NET, JS, Java, …)
• Kompozycja oparta o strumienie danych
• Async
Rx.Observable
https://github.com/Reactive-Extensions/Rx.NET
https://medium.com/google-developer-experts/angular-introduction-to-reactive-extensions-rxjs-a86a7430a61f
var observer = rx.Observer.create(function onNext(result){ console.log(result);
},function onError(err){ console.log(err);
},function onCompleted(){ console.log('Completed');
});
observable.subscribe(observer);
Strumień eventów
czas’click’ ’click’ ’click’’click’’click’’click’
Map, reduce, filter!
map
’click’ ’click’ ’click’’click’’click’’click’
1 1 11 1 1
map
var onesStream = Rx.Observable.fromEvent(button, ’click’).map( () => 1 );
onesStream.subscribe(function(value) { … });
Rx - DEMO
https://glebbahmutov.com/draw-cycle/
http://rxmarbles.com/
Pułapki
Wdrożenie „czystego” FP w zespole może okazać się zbyt kosztowne
O wiele mniejsza baza zasobów w porównaniu do OOP
Problematyczna optymalizacja
Dobre praktyki OOP / FP
SRP / Minimalizowanie efektów ubocznych (no side-effects)
Przewidywalne zachowanie funkcji (immutability)
Minimalizowanie globalnego stanu (stateless)
„To, że ciągle robisz coś w określony sposób
wcale nie oznacza, że jest to najlepszy sposób
na robienie tego czegoś.”
Credits:
http://fsharpforfunandprofit.com/posts/thinking-functionally-intro/
https://www.youtube.com/watch?v=1zj7M1LnJV4
https://gist.github.com/staltz/868e7e9bc2a7b8c1f754
http://wazniak.mimuw.edu.pl/index.php?title=Programowanie_funkcyjne
http://blog.reactandbethankful.com/posts/2015/09/15/understanding-the-functional-revolution/
http://www.mpscholten.de/javascript/2016/01/15/javascript-in-2016-functional-programming-is-getting-here-to-stay.html
http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html
https://glebbahmutov.com/draw-cycle/
http://reactivex.io/intro.html
http://fsharp.org/about/index.html
http://www.scs.stanford.edu/16wi-cs240h/slides/fb-slides.html
https://brianmckenna.org/blog/howtostopfp
and more…
Dzięki :)