mvp - model view presenter (polish)
TRANSCRIPT
MVPM O D E L - V I E W -
W H E R B I E
E R
P O C O M V P ?
J E D N O L I T A S T R U K T U R A
S E P A R A C J A L O G I K I T E S T O W A L N Y K O D= >
Separacja frameworka Android (View) od logiki ekranów(Presenter) i logiki biznesowej (Model) => testowalny kod.Dlaczego? Bo ciężko zamockować Activity czy Fragment.Robolectric był jakimś sposobem, ale nienaturalnym, bogwarantował testy na jednej jedynej implementacji Androida w 1SDK. Urządzeń są tysiące.
P O C O D A G G E R ?
Dagger gwarantuje soliD – Dependency Inversion.Pozwala na pisanie obiektów, które łatwo możnazamockować. Jednak samego Daggera nie powinniśmyużywać w testach, ze względu na zwiększeniekomplikacji.
D A G G E R : 1 C Z Y W I E L EK O M P O N E N T Ó W ?
To zależy. W prostych aplikacjachwystarczy 1. W złożonych, pisanychprzez większą liczbę programistówpisze się komponent per Presenter.Dlaczego? Ma to podobnezastosowanie, jak ograniczeniewidoczności obiektów w klasach:niektórych obiektów nie będziemyw stanie używać tam, gdzie niepowinniśmy.
Mozna bez Daggera,ale wymuszenie daje
wiecej pewnosci
O G Ó L N A S T R U K T U R A M V PW P R O J E K T A C H
A N D R O I D O W Y C H
V = VC
View w MVP to także Controller w najprostszej postaci.Obsługa listenerów obiektów dziedziczących po klasieView zawiera się w obrębie Activity, Fragmentu, View.
N A S Z A S Z C Z E G Ó Ł O W AS T R U K T U R A M V P
MODEL CLASSES, UTILS
VIEW
PRESENTER
INTERACTORREPOSITORY
Interface
InterfaceInterface
Call function
Call function
N A Z W Y F U N K C J I WP R E S E N T E R Z E
Nie mogą być callbackami frameworka Android(onCreate itp). Mają wyrażać autentyczne zadaniefunkcji. Gdyby nazwy były takie jak callbacków, tozaciemnilibyśmy prawdziwą funkcję Presenterów,stworzylibyśmy kod trudny do odczytania.
I nie widzielibysmy co testujemy
K O M U N I K A C J A WP R E S E N T E R Z E
Interactory oraz Repository komunikują się zPresenterem za pomocą callbacków
R O Z D Z I E L E N I E L O G I K I ,V I E W A P R E S E N T E R :
Początkowy problem. Wniosek: wszystkie dane do Presentera. Także te zestanem widoków.
ALE: Would the logic in the presenter make sense if I hada different type of UI?
C O J E S T W V I E W T Y P UA C T I V I T Y / F R A G M E N T ?
C O J E S T W V I E W T Y P UA C T I V I T Y / F R A G M E N T ?
C O J E S T W V I E W T Y P U . . .V I E W ?
C O J E S T W P R E S E N T E R Z E ?
C O J E S T W P R E S E N T E R Z E ?
C O J E S T W P R E S E N T E R Z E ?
C O J E S T W P R E S E N T E R Z E ?
I N T E R F E J S Y D L A V I E W IP R E S E N T E R A
Dla widoku jak najbardziej, ułatwia to mockowanie wtestach. Dla Presentera nie ma to sensu. Zbędna,bezużyteczna dodatkowa praca.
@ S I N G L E T O N
Dagger2 używa tej annotacji do określenia scope'aTAK w RepositoryNIE w Presenterach (wyklucza się z ViewPagerem), orazpewne problemy, gdy Activity startowa posiadapresenter @SingletonNIE w Interactorach
NIE jeśli to nie jest potrzebne.TAK? To ostrożnie – potencjalne memory leaki, gdyużywamy pól klas do przechowywania referencji dolistenerów.
K O M U N I K A C J A M I E D Z YP R E S E N T E R A M I ?
"When using multiple presenters, the easiest way topass information between them is by adopting somekind of event bus."
T E S T Y
Unit testy – testowane Presentery, Interactory,Repository, klasy Utils i pomocnicze klasy modelu.70%Instrumented testy – Espresso i testowanie częściView. 30%
U S P R A W N I E N I A
Constructor Injection
U S P R A W N I E N I A
Repository powinny zawierac sie w Interactorach, anie w Presenterze, gdzie sa na jednym poziomie zInteractoramiNie uzywaj narzedzia Canva
K O S Z T Y
Stworzenie pierwszego MVP i jedność myśleniaprogramistów w jego kwestii to największa bariera.Warto zauważyć, że zmiany w strukturze MVPwymagają zmiany w obrębie całego projektu – imszybciej wprowadzone, tym lepiej. My spororefaktoryzowaliśmy, zanim doszliśmy do prawiesatysfakcjonującego wyniku. Myślę, że nakład wyniósł 1i pół tygodnia pracy każdej osoby.
C Z Y M A T O S E N S WK A Ż D Y M P R Z Y P A D K U ?
Tak, bo separacja logiki od frameworkaAndroid. Ale można użyć czegoś innego (MVVM, VIPER,MVC).
https://medium.com/@mherych/do-i-need-to-create-interfaces-for-my-presenters-9abe0897f873#.ymza49nw9http://hannesdorfmann.com/mosby/mvp/ - IMO najlepsze przedstawienie ideihttps://www.reddit.com/r/androiddev/comments/3zxkb5/should_presenters_be_singletons_or_view_scoped/ - luzna rozmowa o presenterach i singletonachhttps://medium.com/square-corner-blog/android-leak-pattern-subscriptions-in-views-18f0860aa74c#.8so7uez8k - dlaczego inicjalizacja i czyszczenie Presentera wcallbackach onAttachToWindow oraz onDetachFromWindow w View?https://code.tutsplus.com/series/how-to-adopt-model-view-presenter-on-android--cms-1012 - jak nie pisac interfejsoww MVP. TRAGEDIA, choc wydaje sie spelniacwszystkie zalozenia czystego kodu.https://github.com/googlesamples/android-architecture - MVP od Google'ahttps://riggaroo.co.za/introduction-automated-android-testing/ - super tutorial o https://github.com/android10/Android- - FERNANDO CEJAS i jego MVP