Caminhos para uma arquitetura limpa e testável em Android
-
Upload
concrete-solutions -
Category
Technology
-
view
528 -
download
2
Transcript of Caminhos para uma arquitetura limpa e testável em Android
![Page 1: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/1.jpg)
Caminhos para uma Arquitetura Limpa e Testável no Android
![Page 2: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/2.jpg)
rafaeltoledo.net
@_rafaeltoledo
Desenv. Android @ Concrete Solutions
![Page 3: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/3.jpg)
Arquiteturax
Design
@_rafaeltoledo
![Page 4: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/4.jpg)
Arquiteturax
Design
@_rafaeltoledo
Polêmico!
![Page 5: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/5.jpg)
"Principais elementos do sistema - as peças difíceis de mudar. Uma fundação no qual o resto precisa
ser construído"
@_rafaeltoledo
Martin Fowler
![Page 6: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/6.jpg)
"É o conjunto de decisões de design que gostaríamos de ter tomado no início do projeto"
@_rafaeltoledo
Ralph Johnson (GoF)
![Page 7: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/7.jpg)
@_rafaeltoledo
![Page 8: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/8.jpg)
"O design é feito sobre o que foi decidido pela arquitetura, por isso
é difícil mudar a arquitetura. Design deve ser flexível ao
máximo"
@_rafaeltoledo
Neal Ford (Thoughtworks)
![Page 9: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/9.jpg)
@_rafaeltoledo
entendidos?
![Page 10: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/10.jpg)
Arquitetura?
@_rafaeltoledo
![Page 11: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/11.jpg)
@_rafaeltoledo
![Page 12: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/12.jpg)
@_rafaeltoledo
![Page 13: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/13.jpg)
Arquitetura
@_rafaeltoledo
por que se preocupar?
![Page 14: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/14.jpg)
Porque ninguém quer mexer emcódigo legado
@_rafaeltoledo
![Page 15: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/15.jpg)
Por que ninguém quer mexer emcódigo legado?
@_rafaeltoledo
![Page 16: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/16.jpg)
O que é legado?
@_rafaeltoledo
![Page 17: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/17.jpg)
@_rafaeltoledo
![Page 18: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/18.jpg)
#0 Ausência de testes!
@_rafaeltoledo
![Page 19: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/19.jpg)
“Prefer simple, direct solutions to problems rather than creating a lot of infrastructure and abstractions to solve those problems.”
Chet Haase
@_rafaeltoledo
![Page 20: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/20.jpg)
@_rafaeltoledo
![Page 21: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/21.jpg)
@_rafaeltoledo
![Page 22: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/22.jpg)
@_rafaeltoledo
@benorama
![Page 23: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/23.jpg)
@_rafaeltoledo
![Page 24: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/24.jpg)
Arquitetura
@_rafaeltoledo
por que se preocupar?
![Page 25: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/25.jpg)
Por que se preocupar?
● Código mais fácil de manter!
● Rápido e fácil de testar
● Fácil de entender
● Desacoplado
@_rafaeltoledo
![Page 26: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/26.jpg)
@_rafaeltoledo
Caminhos?
![Page 27: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/27.jpg)
@_rafaeltoledo
MVC?
MVP?
MVVM?
Clean?
Flux?
Viper?
![Page 28: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/28.jpg)
@_rafaeltoledo
MVC
![Page 29: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/29.jpg)
@_rafaeltoledo
MODELVIEW
CONTROLLER
![Page 30: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/30.jpg)
Model
● Representar / Interagir com os dados
@_rafaeltoledo
![Page 31: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/31.jpg)
View
● Renderizar e apresentar os dados
@_rafaeltoledo
![Page 32: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/32.jpg)
Controller
● Tratar eventos vindos da View
● Atualizar o Model
● Gerenciar a navegação
@_rafaeltoledo
![Page 33: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/33.jpg)
@_rafaeltoledo
![Page 34: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/34.jpg)
Contexto Mobile!
@_rafaeltoledo
há mais a ser feito
![Page 35: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/35.jpg)
Model
● Representar / Interagir com os dados
● Interagir com a rede - API?
@_rafaeltoledo
![Page 36: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/36.jpg)
View
● Renderizar e apresentar os dados
● Gerenciar os estados das Views
@_rafaeltoledo
![Page 37: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/37.jpg)
Controller
● Tratar eventos vindos da View● Atualizar o Model● Gerenciar a navegação● Interagir com componentes do sistema● Gerenciar eventos do sistema● Atualizar a View de acordo com os eventos
do sistema@_rafaeltoledo
![Page 38: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/38.jpg)
MVC no Android
● Pode ocorrer acúmulo de funções no Controller
@_rafaeltoledo
![Page 39: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/39.jpg)
MVC?
@_rafaeltoledo
![Page 40: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/40.jpg)
MVP!
@_rafaeltoledo
![Page 41: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/41.jpg)
MVP
● Não chega a ser um padrão arquitetural
● Adendo ao MVC
● Mostra uma maneira de estruturarmos a camada de apresentação de forma desacoplada
@_rafaeltoledo
![Page 42: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/42.jpg)
Presenter
● Android costumeiramente mistura Model + View. Ex: CursorAdapter
● Precisamos de uma divisão clara de responsabilidades
@_rafaeltoledo
![Page 43: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/43.jpg)
Presenter
● Ponto de ligação entre o Model e as Views
● Mais fácil de testar as interações - interface
● De maneira geral, 1:1 View / Presenter - exceção views complexas
@_rafaeltoledo
![Page 44: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/44.jpg)
@_rafaeltoledo
USUÁRIO
VIEW
MODEL
PRESENTER
Interage
Notifica
Atualiza
lexaden.com
![Page 45: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/45.jpg)
@_rafaeltoledo
USUÁRIO
VIEW
MODEL
PRESENTER
Exibe
Atualiza
Obtém dados
lexaden.com
![Page 46: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/46.jpg)
MVP - Interactors
● Controla as interações do usuário e com as fontes de dados
● Modelo de callback / troca de mensagens
@_rafaeltoledo
![Page 47: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/47.jpg)
public interface MyPresenter {
void onResume();
void onItemClicked(int position);
}
@_rafaeltoledo
![Page 48: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/48.jpg)
public interface MyView {
void showProgress();
void hideProgress();
void setItems(List<String> items);
void showMessage(String message);
}
@_rafaeltoledo
![Page 49: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/49.jpg)
public interface LoadItemsInteractor {
void loadItems(OnItemsLoadedListener listener);
interface OnItemsLoadedListener {
void onLoaded(List<String> items);
}
}
@_rafaeltoledo
![Page 50: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/50.jpg)
public class MyActivity implements MyView {
MyPresenter presenter;
...
@Override
public void showProgress() {
progressBar.setVisibility(View.VISIBLE);
}
@Override
public void setItems(List<String> items) {
adapter.addAll(items);
adapter.notifyDataSetChanged();
}
} @_rafaeltoledo
![Page 51: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/51.jpg)
public class MyActivity implements MyView {
MyPresenter presenter;
...
@Override
protected void onResume() {
super.onResume();
presenter.onResume();
}
}
@_rafaeltoledo
![Page 52: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/52.jpg)
public class MyPresenterImpl implements MyPresenter,
LoadItemsInteractor.OnItemsLoadedListener {
public MyPresenter(MyView view, LoadItemsInteractor interactor) {
this.view = view;
this.interactor = interactor;
}
@Override
public void onResume() {
view.showProgress();
interactor.findItems(this);
}
}
@_rafaeltoledo
![Page 53: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/53.jpg)
MVP
@_rafaeltoledo
● Como são interfaces, podem ser facilmente testados!
presenter.onResume();
verify(view, atLeast(1)).showProgress(); // Mockito
SomeInteractor mocked = mock(SomeInteractor.class);
when(mocked.loadFromNetwork()).thenReturn(Arrays.asList("object");
![Page 54: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/54.jpg)
então MVP é só alegria?
@_rafaeltoledo
![Page 55: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/55.jpg)
@_rafaeltoledo
![Page 56: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/56.jpg)
MVP no Android
● Use com cuidado, pois pode acabar se tornando overengineered!
@_rafaeltoledo
![Page 57: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/57.jpg)
Mas e o MVVM?
@_rafaeltoledo
![Page 58: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/58.jpg)
MVVM
● Apareceu com mais força após o anúncio do DataBinding no I/O
● Existem outras libs de binding: RoboBinding, AndroidBinding, ...
@_rafaeltoledo
![Page 59: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/59.jpg)
MVVM
● Comumente utilizado em ambientes Microsoft
● É quase um requisito o uso de alguma biblioteca, caso contrário haverá muito boilerplate
@_rafaeltoledo
![Page 60: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/60.jpg)
@_rafaeltoledo
MODELVIEW
VIEW-MODEL
Data Binding eComandos
Atualiza o Model
![Page 61: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/61.jpg)
Sinceramente?
@_rafaeltoledo
![Page 62: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/62.jpg)
@_rafaeltoledo
![Page 63: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/63.jpg)
Nossa… por quê?
@_rafaeltoledo
![Page 64: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/64.jpg)
MVVM
● Códigos mais complexos tendem a ficar extremamente acoplados
● Testes? #comofas
@_rafaeltoledo
![Page 65: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/65.jpg)
@_rafaeltoledo
![Page 66: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/66.jpg)
Outras abordagens
● Clean Architecture
● Flux
● Viper (adaptado do iOS)
@_rafaeltoledo
![Page 67: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/67.jpg)
Arquitetura
@_rafaeltoledo
algumas dicas finais
![Page 68: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/68.jpg)
Dicas
● Não seja extremista
● Sempre pense e escreva testes
● Um código difícil de testar é um indicador de que a arquitetura está meio capenga...
@_rafaeltoledo
![Page 69: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/69.jpg)
Dicas
● Desacople do framework
● Use Robolectric para testes unitários, Espresso / Robotium para navegação
@_rafaeltoledo
![Page 70: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/70.jpg)
No final das contas...
@_rafaeltoledo
![Page 71: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/71.jpg)
@_rafaeltoledo
estamos buscando um código bacana!
![Page 72: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/72.jpg)
Links bacanas!
● antonioleiva.com/mvp-android● fragmentedpodcast/episodes/11● github.com/chiuki/friendspell● github.com/googlesamples/android-topeka● fernandocejas.
com/2014/09/03/architecting-android-the-clean-way/
@_rafaeltoledo
![Page 73: Caminhos para uma arquitetura limpa e testável em Android](https://reader035.fdocumentos.tips/reader035/viewer/2022081323/5877a82d1a28ab826e8b66df/html5/thumbnails/73.jpg)
OBRIGADO!rafaeltoledo.net
@_rafaeltoledo
Desenv. Android @ Concrete Solutionsestamos contratando!
concretesolutions.com.br/carreira