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
1
2
3
4
5
…
3
5
7
9
11
…
f(x) = 2x + 1
1
2
3
4
5
…
3
5
7
9
11
…
public int MultiplyAndAddOne(int input)
{
int multiplied = input * 2;
int addOneResult = multiplied + 1;
return addOneResult;
}
1
2
3
4
5
…
3
5
7
9
11
…
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 :)

Not-So-Object Oriented Programming

Editor's Notes

  • #2 Przemek Smyrdek, EUVIC Lekki wstęp do programowania funkcyjnego i reaktywnego, trochę o F#, Rx.JS oraz o dobrych i złych wzorcach w programowaniu.
  • #3 Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  • #6 Przewidywalność Łatwe testowanie
  • #7 Przewidywalność Łatwe testowanie
  • #13 Ci którzy nie podnieśli rąk być może myślą w ten sposób – no coś słyszałem, ale… I w sumie nigdy nie było czasu albo chęci na poznanie tematu szerzej.
  • #15  TOP 39 szkół w USA na 2014 – Pierwszy język programowania jakiego uczą Scratch – darmowy interaktywny język do nauki programowania poprzez wizualizację Jedynie funkcyjny Scheme (skim) – 5 na 39 szkół
  • #16 Przykład rozwoju aplikacji JS’owych jQuery -> MVVM (Knockout) -> MVC (Angular) -> Functional (React)
  • #17 Zamiast zrozumieć powody dla których dany język lub sposób programowania wygląda tak a nie inaczej, najprostszym wyjściem jest zanegować sens jego istnienia.
  • #18 Nie obiecuję że od dzisiaj wszyscy zaczniecie programować w ten sposób. Ja sam programuję głównie w C#, bardzo mocno trzymam się programowania obiektowego ale uważam, że warto poszerzać swoje horyzonty Zanim krótki wstęp i więcej konkretów to chciałbym żebyśmy zostali na trochę w tej „niewiedzy” i popatrzyli z czego ona wynika – 3 główne problemy
  • #33 Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  • #34 Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  • #35 Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  • #36 Podsumowując to co wiemy do tej pory możemy już wprowadzić podział
  • #37 Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  • #38 Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  • #39 Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  • #40 Programowanie reaktywne – reactive functional programming R
  • #41 Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  • #42 Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  • #43 Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  • #44 Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  • #45 Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  • #46 Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  • #47 Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  • #48 Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu