Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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
120
Kotlin Multiplataforma: Compartilhando código entre Android e iOS
rafaeltoledo
0
330
Motion Layout
rafaeltoledo
1
190
Pipeline Android
rafaeltoledo
3
210
Android Architecture Components
rafaeltoledo
7
230
What's New in Kotlin 1.3
rafaeltoledo
0
180
An Overview of Multiplatform Kotlin
rafaeltoledo
2
180
Compartilhando Código com Kotlin Multiplataforma
rafaeltoledo
2
310
Android Assíncrono
rafaeltoledo
3
250
Other Decks in Programming
See All in Programming
AWS CDKのカスタムリソースでContinuum(旧Security Agent)を実装した話 | Implementing Continuum (formerly Security Agent) via AWS CDK Custom Resource
akihisaikeda
2
160
残高管理から台帳サービスへの進化
artoy
1
210
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
320
パスワード再設定メールのURLについて知っておこう
uyuki234
0
170
コードで差別化できない時代の ソフトウェアエンジニアリング / Software Engineering in an Era Where Code Doesn’t Differentiate
kishida
2
190
[Dev Group Paris Octobre 26] Agentforce, SIforce, Claudeforce, Slackbot… on s'y retrouve ?
nabondance
0
120
phperだってパンチカードでコーディングしたい
o0h
PRO
0
390
Agentic Software Factoryに、すごく賢いIF文を。 / super smart IF statement into the Agentic Software Factory.
rkaga
8
2.3k
Lambda durable functionsでHuman in the Loopを楽に…楽に……
har1101
1
190
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
300
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
35
17k
APNsからLive Activityを開始する話
yumnumm
0
170
Featured
See All Featured
WCS-LA-2024
lcolladotor
0
900
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
580
Rails Girls Zürich Keynote
gr2m
96
14k
Unsuck your backbone
ammeep
672
58k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
310
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
We Have a Design System, Now What?
morganepeng
55
8.4k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
590
Technical Leadership for Architectural Decision Making
baasie
3
610
How to Talk to Developers About Accessibility
jct
2
590
Odyssey Design
rkendrick25
PRO
2
880
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
280
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