Not-So-Object Oriented Programming

Post on 21-Feb-2017

446 views 0 download

Transcript of Not-So-Object Oriented Programming

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 :)