Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Caminhos para uma Arquitetura Limpa e Testável ...
Search
Rafael Toledo
August 29, 2015
Programming
16
800
Caminhos para uma Arquitetura Limpa e Testável no Android
Apresentada no Android Dev Conference 2015 organizado pelo iMasters
Rafael Toledo
August 29, 2015
Tweet
Share
More Decks by Rafael Toledo
See All by Rafael Toledo
Gamedev com Kotlin Native
rafaeltoledo
0
71
Kotlin Multiplataforma: Compartilhando código entre Android e iOS
rafaeltoledo
0
290
Motion Layout
rafaeltoledo
1
130
Pipeline Android
rafaeltoledo
3
150
Android Architecture Components
rafaeltoledo
7
150
What's New in Kotlin 1.3
rafaeltoledo
0
140
An Overview of Multiplatform Kotlin
rafaeltoledo
2
120
Compartilhando Código com Kotlin Multiplataforma
rafaeltoledo
2
250
Android Assíncrono
rafaeltoledo
3
210
Other Decks in Programming
See All in Programming
Elixir で IoT 開発、 Nerves なら簡単にできる!?
pojiro
1
120
FormFlow - Build Stunning Multistep Forms
yceruto
1
160
イベントストーミングから始めるドメイン駆動設計
jgeem
4
820
Go Modules: From Basics to Beyond / Go Modulesの基本とその先へ
kuro_kurorrr
0
110
単体テストの始め方/作り方
toms74209200
0
430
ワイがおすすめする新潟の食 / 20250530phpconf-niigata-eve
kasacchiful
0
300
業務自動化をJavaとSeleniumとAWS Lambdaで実現した方法
greenflagproject
1
100
Gleamという選択肢
comamoca
6
700
Passkeys for Java Developers
ynojima
3
850
Benchmark
sysong
0
140
Enterprise Web App. Development (2): Version Control Tool Training Ver. 5.1
knakagawa
1
110
CSC307 Lecture 17
javiergs
PRO
0
110
Featured
See All Featured
Building Applications with DynamoDB
mza
95
6.4k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
900
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
Faster Mobile Websites
deanohume
307
31k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Scaling GitHub
holman
459
140k
Embracing the Ebb and Flow
colly
86
4.7k
How to train your dragon (web standard)
notwaldorf
92
6.1k
Speed Design
sergeychernyshev
30
990
Why Our Code Smells
bkeepers
PRO
337
57k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.8k
KATA
mclloyd
29
14k
Transcript
Caminhos para uma Arquitetura Limpa e Testável no Android
rafaeltoledo.net @_rafaeltoledo Desenv. Android @ Concrete Solutions
Arquitetura x Design @_rafaeltoledo
Arquitetura x Design @_rafaeltoledo Polêmico!
"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
"É o conjunto de decisões de design que gostaríamos de
ter tomado no início do projeto" @_rafaeltoledo Ralph Johnson (GoF)
@_rafaeltoledo
"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)
@_rafaeltoledo entendidos?
Arquitetura? @_rafaeltoledo
@_rafaeltoledo
@_rafaeltoledo
Arquitetura @_rafaeltoledo por que se preocupar?
Porque ninguém quer mexer em código legado @_rafaeltoledo
Por que ninguém quer mexer em código legado? @_rafaeltoledo
O que é legado? @_rafaeltoledo
@_rafaeltoledo
#0 Ausência de testes! @_rafaeltoledo
“Prefer simple, direct solutions to problems rather than creating a
lot of infrastructure and abstractions to solve those problems.” Chet Haase @_rafaeltoledo
@_rafaeltoledo
@_rafaeltoledo
@_rafaeltoledo @benorama
@_rafaeltoledo
Arquitetura @_rafaeltoledo por que se preocupar?
Por que se preocupar? • Código mais fácil de manter!
• Rápido e fácil de testar • Fácil de entender • Desacoplado @_rafaeltoledo
@_rafaeltoledo Caminhos?
@_rafaeltoledo MVC? MVP? MVVM? Clean? Flux? Viper?
@_rafaeltoledo MVC
@_rafaeltoledo MODEL VIEW CONTROLLER
Model • Representar / Interagir com os dados @_rafaeltoledo
View • Renderizar e apresentar os dados @_rafaeltoledo
Controller • Tratar eventos vindos da View • Atualizar o
Model • Gerenciar a navegação @_rafaeltoledo
@_rafaeltoledo
Contexto Mobile! @_rafaeltoledo há mais a ser feito
Model • Representar / Interagir com os dados • Interagir
com a rede - API? @_rafaeltoledo
View • Renderizar e apresentar os dados • Gerenciar os
estados das Views @_rafaeltoledo
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
MVC no Android • Pode ocorrer acúmulo de funções no
Controller @_rafaeltoledo
MVC? @_rafaeltoledo
MVP! @_rafaeltoledo
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
Presenter • Android costumeiramente mistura Model + View. Ex: CursorAdapter
• Precisamos de uma divisão clara de responsabilidades @_rafaeltoledo
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
@_rafaeltoledo USUÁRIO VIEW MODEL PRESENTER Interage Notifica Atualiza lexaden.com
@_rafaeltoledo USUÁRIO VIEW MODEL PRESENTER Exibe Atualiza Obtém dados lexaden.com
MVP - Interactors • Controla as interações do usuário e
com as fontes de dados • Modelo de callback / troca de mensagens @_rafaeltoledo
public interface MyPresenter { void onResume(); void onItemClicked(int position); }
@_rafaeltoledo
public interface MyView { void showProgress(); void hideProgress(); void setItems(List<String>
items); void showMessage(String message); } @_rafaeltoledo
public interface LoadItemsInteractor { void loadItems(OnItemsLoadedListener listener); interface OnItemsLoadedListener {
void onLoaded(List<String> items); } } @_rafaeltoledo
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
public class MyActivity implements MyView { MyPresenter presenter; ... @Override
protected void onResume() { super.onResume(); presenter.onResume(); } } @_rafaeltoledo
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
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");
então MVP é só alegria? @_rafaeltoledo
@_rafaeltoledo
MVP no Android • Use com cuidado, pois pode acabar
se tornando overengineered! @_rafaeltoledo
Mas e o MVVM? @_rafaeltoledo
MVVM • Apareceu com mais força após o anúncio do
DataBinding no I/O • Existem outras libs de binding: RoboBinding, AndroidBinding, ... @_rafaeltoledo
MVVM • Comumente utilizado em ambientes Microsoft • É quase
um requisito o uso de alguma biblioteca, caso contrário haverá muito boilerplate @_rafaeltoledo
@_rafaeltoledo MODEL VIEW VIEW-MODEL Data Binding e Comandos Atualiza o
Model
Sinceramente? @_rafaeltoledo
@_rafaeltoledo
Nossa… por quê? @_rafaeltoledo
MVVM • Códigos mais complexos tendem a ficar extremamente acoplados
• Testes? #comofas @_rafaeltoledo
@_rafaeltoledo
Outras abordagens • Clean Architecture • Flux • Viper (adaptado
do iOS) @_rafaeltoledo
Arquitetura @_rafaeltoledo algumas dicas finais
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
Dicas • Desacople do framework • Use Robolectric para testes
unitários, Espresso / Robotium para navegação @_rafaeltoledo
No final das contas... @_rafaeltoledo
@_rafaeltoledo estamos buscando um código bacana!
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
OBRIGADO! rafaeltoledo.net @_rafaeltoledo Desenv. Android @ Concrete Solutions estamos contratando!
concretesolutions.com.br/carreira