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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Rafael Toledo
August 29, 2015
Programming
840
16
Share
Caminhos para uma Arquitetura Limpa e Testável no Android
Apresentada no Android Dev Conference 2015 organizado pelo iMasters
Rafael Toledo
August 29, 2015
More Decks by Rafael Toledo
See All by Rafael Toledo
Gamedev com Kotlin Native
rafaeltoledo
0
110
Kotlin Multiplataforma: Compartilhando código entre Android e iOS
rafaeltoledo
0
300
Motion Layout
rafaeltoledo
1
170
Pipeline Android
rafaeltoledo
3
190
Android Architecture Components
rafaeltoledo
7
190
What's New in Kotlin 1.3
rafaeltoledo
0
170
An Overview of Multiplatform Kotlin
rafaeltoledo
2
160
Compartilhando Código com Kotlin Multiplataforma
rafaeltoledo
2
290
Android Assíncrono
rafaeltoledo
3
240
Other Decks in Programming
See All in Programming
HTML-Aware ERB: The Path to Reactive Rendering @ RubyKaigi 2026, Hakodate, Japan
marcoroth
0
590
Kingdom of the Machine
yui_knk
2
1.3k
AI時代のエンジニアリングの原則 / Engineering Principles in the AI Era
haru860
0
960
Spec Driven Development | AI Summit Vilnius
danielsogl
PRO
1
130
Agentic Elixir
whatyouhide
0
430
The Less-Told Story of Socket Timeouts
coe401_
3
910
運転動画を検索可能にする〜Cosmos-Embed1とDatabricks Vector Searchで〜/cosmos-embed1-databricks-vector-search
studio_graph
1
580
AIと共に生きる技術選定 2026
sgash708
0
120
Firefoxにコントリビューションして得られた学び
ken7253
2
150
Running Swift without an OS
kishikawakatsumi
0
870
GNU Makeの使い方 / How to use GNU Make
kaityo256
PRO
16
5.6k
リセットCSSを1行消したらアクセシビリティが向上した話
pvcresin
4
420
Featured
See All Featured
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
130
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
500
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.7k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
820
Ruling the World: When Life Gets Gamed
codingconduct
0
220
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.2k
The Curse of the Amulet
leimatthew05
1
12k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Art, The Web, and Tiny UX
lynnandtonic
304
21k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.9k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.9k
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