SlideShare uma empresa Scribd logo
1 de 54
Baixar para ler offline
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 :)

Mais conteúdo relacionado

Destaque

ใบความรู้ที่ 2 กำเนิดภาษาซี
ใบความรู้ที่ 2 กำเนิดภาษาซีใบความรู้ที่ 2 กำเนิดภาษาซี
ใบความรู้ที่ 2 กำเนิดภาษาซี
dechathon
 
Internet środowiskiem samokształcenia
Internet środowiskiem samokształceniaInternet środowiskiem samokształcenia
Internet środowiskiem samokształcenia
tajny1525
 
werfw
werfwwerfw
werfw
adamx
 
Platforma_edukacyjna_systemy
Platforma_edukacyjna_systemyPlatforma_edukacyjna_systemy
Platforma_edukacyjna_systemy
Tsanko Ivanov
 
E materialy
E materialyE materialy
E materialy
dksm
 

Destaque (13)

Diccionario visual basic
Diccionario visual basicDiccionario visual basic
Diccionario visual basic
 
Py2 - Py3 migration - Krzysztof Skarupa
Py2  - Py3 migration - Krzysztof SkarupaPy2  - Py3 migration - Krzysztof Skarupa
Py2 - Py3 migration - Krzysztof Skarupa
 
ใบความรู้ที่ 2 กำเนิดภาษาซี
ใบความรู้ที่ 2 กำเนิดภาษาซีใบความรู้ที่ 2 กำเนิดภาษาซี
ใบความรู้ที่ 2 กำเนิดภาษาซี
 
PostgreSQL and JSON with Python - Przemek Lewandowski
PostgreSQL and JSON  with Python - Przemek Lewandowski PostgreSQL and JSON  with Python - Przemek Lewandowski
PostgreSQL and JSON with Python - Przemek Lewandowski
 
Corp Astro
Corp AstroCorp Astro
Corp Astro
 
Internet środowiskiem samokształcenia
Internet środowiskiem samokształceniaInternet środowiskiem samokształcenia
Internet środowiskiem samokształcenia
 
werfw
werfwwerfw
werfw
 
Platforma_edukacyjna_systemy
Platforma_edukacyjna_systemyPlatforma_edukacyjna_systemy
Platforma_edukacyjna_systemy
 
E-LEARNING
E-LEARNINGE-LEARNING
E-LEARNING
 
E materialy
E materialyE materialy
E materialy
 
Szkolenia online - czy uczymy się przez Internet?
Szkolenia online - czy uczymy się przez Internet?Szkolenia online - czy uczymy się przez Internet?
Szkolenia online - czy uczymy się przez Internet?
 
Konferencja Czas na e-biznes - 6 Netchoaching
Konferencja Czas na e-biznes - 6 NetchoachingKonferencja Czas na e-biznes - 6 Netchoaching
Konferencja Czas na e-biznes - 6 Netchoaching
 
Wiki
WikiWiki
Wiki
 

Semelhante a Not-So-Object Oriented Programming

[PL] Jak programować aby nie zwariować
[PL] Jak programować aby nie zwariować[PL] Jak programować aby nie zwariować
[PL] Jak programować aby nie zwariować
Jakub Marchwicki
 
Open Xml Translator - czyli o oswajaniu formatow
Open Xml Translator - czyli o oswajaniu formatowOpen Xml Translator - czyli o oswajaniu formatow
Open Xml Translator - czyli o oswajaniu formatow
3camp
 

Semelhante a Not-So-Object Oriented Programming (6)

[PL] Jak programować aby nie zwariować
[PL] Jak programować aby nie zwariować[PL] Jak programować aby nie zwariować
[PL] Jak programować aby nie zwariować
 
4Developers 2018: Unit testing - introduction (Marek Kawczyński)
4Developers 2018: Unit testing - introduction (Marek Kawczyński)4Developers 2018: Unit testing - introduction (Marek Kawczyński)
4Developers 2018: Unit testing - introduction (Marek Kawczyński)
 
Refaktoryzacja
RefaktoryzacjaRefaktoryzacja
Refaktoryzacja
 
[PL] Jak programować aby nie zwariować?
[PL] Jak programować aby nie zwariować?[PL] Jak programować aby nie zwariować?
[PL] Jak programować aby nie zwariować?
 
Open Xml Translator - czyli o oswajaniu formatow
Open Xml Translator - czyli o oswajaniu formatowOpen Xml Translator - czyli o oswajaniu formatow
Open Xml Translator - czyli o oswajaniu formatow
 
Unit testing w praktyce... czyli właściwie jak?
Unit testing w praktyce... czyli właściwie jak?Unit testing w praktyce... czyli właściwie jak?
Unit testing w praktyce... czyli właściwie jak?
 

Not-So-Object Oriented Programming

Notas do Editor

  1. 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.
  2. Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  3. Przewidywalność Łatwe testowanie
  4. Przewidywalność Łatwe testowanie
  5. 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.
  6. 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ół
  7. Przykład rozwoju aplikacji JS’owych jQuery -> MVVM (Knockout) -> MVC (Angular) -> Functional (React)
  8. 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.
  9. 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
  10. Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  11. Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  12. Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  13. Podsumowując to co wiemy do tej pory możemy już wprowadzić podział
  14. Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  15. Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  16. Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  17. Programowanie reaktywne – reactive functional programming R
  18. Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  19. Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  20. Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  21. Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  22. Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  23. Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  24. Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu
  25. Imperatywnie – zbiór poleceń, linijka po linijce Deklaratywnie – operowanie na logice wyższego poziomu