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
850
16
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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
310
Motion Layout
rafaeltoledo
1
180
Pipeline Android
rafaeltoledo
3
200
Android Architecture Components
rafaeltoledo
7
200
What's New in Kotlin 1.3
rafaeltoledo
0
170
An Overview of Multiplatform Kotlin
rafaeltoledo
2
170
Compartilhando Código com Kotlin Multiplataforma
rafaeltoledo
2
300
Android Assíncrono
rafaeltoledo
3
250
Other Decks in Programming
See All in Programming
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
990
AI時代の仕事技芸論〜ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ(スクフェス仙台 2026バージョン)
kuranuki
0
670
AIエージェントで 変わるAndroid開発環境
takahirom
2
680
SREは、MCPとSRE Agentをこう使え!
kazumax55
0
150
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
Apache Hive: そしてCloud Native Lakehouseへ
okumin
1
150
ローカルLLMでどこまでコードが書けるか -縮小版 / How much code can be written on a local LLM Shortened
kishida
2
190
20260623_Loop Engineeringで自分の分身の問い合わせBotを作る
ryugen04
0
230
えっ!!コードを読まずに開発を!?
hananouchi
0
220
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
170
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
2
580
初めてのKubernetes 本番運用でハマった話
oku053
0
130
Featured
See All Featured
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.8k
What's in a price? How to price your products and services
michaelherold
247
13k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
260
The Curious Case for Waylosing
cassininazir
1
430
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
180
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
320
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
It's Worth the Effort
3n
188
29k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
360
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Designing Powerful Visuals for Engaging Learning
tmiket
1
450
Design in an AI World
tapps
1
260
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