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
58
Kotlin Multiplataforma: Compartilhando código entre Android e iOS
rafaeltoledo
0
290
Motion Layout
rafaeltoledo
1
110
Pipeline Android
rafaeltoledo
3
140
Android Architecture Components
rafaeltoledo
7
130
What's New in Kotlin 1.3
rafaeltoledo
0
130
An Overview of Multiplatform Kotlin
rafaeltoledo
2
110
Compartilhando Código com Kotlin Multiplataforma
rafaeltoledo
2
240
Android Assíncrono
rafaeltoledo
3
200
Other Decks in Programming
See All in Programming
Rubyでつくるパケットキャプチャツール
ydah
0
170
HTML/CSS超絶浅い説明
yuki0329
0
190
Внедряем бюджетирование, или Как сделать хорошо?
lamodatech
0
940
React 19でお手軽にCSS-in-JSを自作する
yukukotani
5
560
毎日13時間もかかるバッチ処理をたった3日で60%短縮するためにやったこと
sho_ssk_
1
550
技術的負債と向き合うカイゼン活動を1年続けて分かった "持続可能" なプロダクト開発
yuichiro_serita
0
300
見えないメモリを観測する: PHP 8.4 `pg_result_memory_size()` とSQL結果のメモリ管理
kentaroutakeda
0
940
“あなた” の開発を支援する AI エージェント Bedrock Engineer / introducing-bedrock-engineer
gawa
4
220
Fixstars高速化コンテスト2024準優勝解法
eijirou
0
190
AHC041解説
terryu16
0
400
サーバーゆる勉強会 DBMS の仕組み編
kj455
1
300
快速入門可觀測性
blueswen
0
500
Featured
See All Featured
GitHub's CSS Performance
jonrohan
1030
460k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.5k
Scaling GitHub
holman
459
140k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
28
2.2k
A Philosophy of Restraint
colly
203
16k
Become a Pro
speakerdeck
PRO
26
5.1k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.5k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
3
360
The World Runs on Bad Software
bkeepers
PRO
66
11k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
30
2.1k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Adopting Sorbet at Scale
ufuk
74
9.2k
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