Architektura aplikacji z wykorzystaniem wzorca redux i implementacji angular 2+ oraz ngrx. Prezentacja ze szkolenia przeznaczonego dla programistów angular1.
13. prymityw, tablica, promise, …
number
Array
<number>
Promise
<number>
?
jedna wartość wiele wartości
wartość dostępna teraz
wartość dostępna w przyszłości
15. prymityw, tablica, promise, …
number
Array
<number>
Promise
<number>
?
jedna wartość wiele wartości
wartość dostępna teraz
wartość dostępna w przyszłości
16. prymityw, tablica, promise, …
number
Array
<number>
Promise
<number>
?
jedna wartość wiele wartości
wartość dostępna teraz
wartość dostępna w przyszłości
17. prymityw, tablica, promise, …
number
Array
<number>
Promise
<number>
?
jedna wartość wiele wartości
wartość dostępna teraz
wartość dostępna w przyszłości
18. prymityw, tablica, promise, observable
number
Array
<number>
Promise
<number>
Observable
<number>
jedna wartość wiele wartości
wartość dostępna teraz
wartość dostępna w przyszłości
23. prymityw, tablica, promise, observable
number
Iterable
<number>
Promise
<number>
Observable
<number>
jedna wartość wiele wartości
wartość dostępna teraz
wartość dostępna w przyszłości
pull semantics
push semantics
34. Stan…
• Stan (state) – wartości wszystkich zmiennych (np. komponentu,
aplikacji) w danym momencie, do których program ma dostęp.
…jest projektowany na…
36. Akcje…
• Akcja (action) – obiekt, który opisuje to, co się zdarzyło.
• Ważne – samo wyemitowanie akcji nie modyfikuje stanu.
…obsługiwane przez…
37. Reduktor…
• Reduktor (reducer) – czysta funkcja (pure function), która na
podstawie stanu i akcji synchronicznie (wręcz transakcyjnie) wylicza
nowy stan.
• Ważne – reduktor nie modyfikuje stanu – tworzy nowy stan.
• Ważne – reduktor nie wywołuje asynchronicznych funkcji.
…modyfikuje…
38. Store…
• Store – jeden obiekt, w którym zapisany jest stan całej aplikacji.
• Ważne – zapisany stan jest tylko do odczytu.
• baza danych
…przechowuje…
39. Stan…
• Stan (state) – wartości wszystkich zmiennych (np. komponentu,
aplikacji) w danym momencie, do których program ma dostęp.
…jest projektowany na… itd.
47. ngrx/Store
• Po każdej akcji zostanie wypchnięty nowy stan
• Wszystko, co zasubskrybowało store, dostanie odpowiedni jego
fragment, o ile…
• …w ogóle się zmienił (a korzystamy z niemutowalnego drzewa stanu)
49. Asynchroniczne wywołania – ngrx/Effects
• Wywoływane „obok”
• Nasłuchują akcji
• Gdy odpowiednia nadejdzie – wywołują asynchroniczny kod
(np. http)
• Po zakończeniu – zwracają 0..* akcji
• To także observables (można korzystać z operatorów, np.
debounce czy switchMap)
• switchMap w połączeniu z http potrafi anulować request –
out of the box
50. Architektura aplikacji
@ngrx/Store
Service
Smart Comp.
Dumb Comp.
Reducers
@ngrx/Effects
Effects Service
Data Service
HTTP
new state
select state (observable)
state (observable)
properties (bind)events
call
action (dispatch)
state + action
action (dispatch)
state + action
state + action
state (call)
state (call)response (observable)
response (observable)
state + action
https://youtu.be/pjwVq8B-ZAw w 21:55 i w 33:45
51. Wzorzec REDUX - dodatkowe korzyści
• Transakcyjne modyfikowanie stanu aplikacji
• Separacja logiki od prezentacji
• Możliwość zapisania stanu aplikacji w każdym momencie
• Możliwość odtworzenia wyglądu aplikacji z zapisanego stanu
(widok funkcją stanu)
• Time-travel debug – oprócz stanu można zapisać n (być może
nawet duże N) ostatnich akcji – możliwość odtworzenia
przebiegu działań użytkownika
• Dirty checking – niepotrzebne
53. Typescript: typy
function asd() {
var a = 42;
var b = 'hello';
b = a; // Type 'number' is not assignable to type 'string'
return b;
}
console.log(asd()); // 42
var x: number;
54. ES2015: let, const
function x() {
var V = 1;
let L = 1;
const C = 1;
if (this) {
var V = 2;
let L = 2;
C = 4; // Cannot assign to 'C' because it is
// a constant or a read-only property.
}
console.log(L, V, C); // 1 2 4
}
72. Architektura aplikacji
@ngrx/Store
Service
Smart Comp.
Dumb Comp.
Reducers
@ngrx/Effects
Effects Service
Data Service
HTTP
new state
select state (observable)
state (observable)
properties (bind)events
call
action (dispatch)
state + action
action (dispatch)
state + action
state + action
state (call)
state (call)response (observable)
response (observable)
state + action
https://youtu.be/pjwVq8B-ZAw w 21:55 i w 33:45
73. Wypadałoby jeszcze wspomnieć o:
• Narzędziach: Redux Dev Tools, Augury
• Style guide: https://angular.io/docs/ts/latest/guide/style-guide.html
• Reactive forms, reactive router, ngrx/router
• Testach jednostkowych:
• jednostka != plik, jednostka != klasa, jednostka != serwis
• AAA – arrange, act, assert
• https://angular.io/docs/ts/latest/guide/testing.html - guide
• https://docs.google.com/presentation/d/1gJCBr_M5dCcCX9WUM52ZUAKVlPj
6hQv3MYXKlgFMpSA/edit?usp=sharing - przykłady
• Korzystając z tej architektury celowo rezygnuje się części
funkcjonalności oferowanych przez Typescript i Angular