73
Caminhos para uma Arquitetura Limpa e Testável no Android

Caminhos para uma arquitetura limpa e testável em Android

Embed Size (px)

Citation preview

Page 1: Caminhos para uma arquitetura limpa e testável em Android

Caminhos para uma Arquitetura Limpa e Testável no Android

Page 2: Caminhos para uma arquitetura limpa e testável em Android

rafaeltoledo.net

@_rafaeltoledo

Desenv. Android @ Concrete Solutions

Page 3: Caminhos para uma arquitetura limpa e testável em Android

Arquiteturax

Design

@_rafaeltoledo

Page 4: Caminhos para uma arquitetura limpa e testável em Android

Arquiteturax

Design

@_rafaeltoledo

Polêmico!

Page 5: Caminhos para uma arquitetura limpa e testável em Android

"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

Page 6: Caminhos para uma arquitetura limpa e testável em Android

"É o conjunto de decisões de design que gostaríamos de ter tomado no início do projeto"

@_rafaeltoledo

Ralph Johnson (GoF)

Page 7: Caminhos para uma arquitetura limpa e testável em Android

@_rafaeltoledo

Page 8: Caminhos para uma arquitetura limpa e testável em Android

"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)

Page 9: Caminhos para uma arquitetura limpa e testável em Android

@_rafaeltoledo

entendidos?

Page 10: Caminhos para uma arquitetura limpa e testável em Android

Arquitetura?

@_rafaeltoledo

Page 11: Caminhos para uma arquitetura limpa e testável em Android

@_rafaeltoledo

Page 12: Caminhos para uma arquitetura limpa e testável em Android

@_rafaeltoledo

Page 13: Caminhos para uma arquitetura limpa e testável em Android

Arquitetura

@_rafaeltoledo

por que se preocupar?

Page 14: Caminhos para uma arquitetura limpa e testável em Android

Porque ninguém quer mexer emcódigo legado

@_rafaeltoledo

Page 15: Caminhos para uma arquitetura limpa e testável em Android

Por que ninguém quer mexer emcódigo legado?

@_rafaeltoledo

Page 16: Caminhos para uma arquitetura limpa e testável em Android

O que é legado?

@_rafaeltoledo

Page 17: Caminhos para uma arquitetura limpa e testável em Android

@_rafaeltoledo

Page 18: Caminhos para uma arquitetura limpa e testável em Android

#0 Ausência de testes!

@_rafaeltoledo

Page 19: Caminhos para uma arquitetura limpa e testável em Android

“Prefer simple, direct solutions to problems rather than creating a lot of infrastructure and abstractions to solve those problems.”

Chet Haase

@_rafaeltoledo

Page 20: Caminhos para uma arquitetura limpa e testável em Android

@_rafaeltoledo

Page 21: Caminhos para uma arquitetura limpa e testável em Android

@_rafaeltoledo

Page 22: Caminhos para uma arquitetura limpa e testável em Android

@_rafaeltoledo

@benorama

Page 23: Caminhos para uma arquitetura limpa e testável em Android

@_rafaeltoledo

Page 24: Caminhos para uma arquitetura limpa e testável em Android

Arquitetura

@_rafaeltoledo

por que se preocupar?

Page 25: Caminhos para uma arquitetura limpa e testável em Android

Por que se preocupar?

● Código mais fácil de manter!

● Rápido e fácil de testar

● Fácil de entender

● Desacoplado

@_rafaeltoledo

Page 26: Caminhos para uma arquitetura limpa e testável em Android

@_rafaeltoledo

Caminhos?

Page 27: Caminhos para uma arquitetura limpa e testável em Android

@_rafaeltoledo

MVC?

MVP?

MVVM?

Clean?

Flux?

Viper?

Page 28: Caminhos para uma arquitetura limpa e testável em Android

@_rafaeltoledo

MVC

Page 29: Caminhos para uma arquitetura limpa e testável em Android

@_rafaeltoledo

MODELVIEW

CONTROLLER

Page 30: Caminhos para uma arquitetura limpa e testável em Android

Model

● Representar / Interagir com os dados

@_rafaeltoledo

Page 31: Caminhos para uma arquitetura limpa e testável em Android

View

● Renderizar e apresentar os dados

@_rafaeltoledo

Page 32: Caminhos para uma arquitetura limpa e testável em Android

Controller

● Tratar eventos vindos da View

● Atualizar o Model

● Gerenciar a navegação

@_rafaeltoledo

Page 33: Caminhos para uma arquitetura limpa e testável em Android

@_rafaeltoledo

Page 34: Caminhos para uma arquitetura limpa e testável em Android

Contexto Mobile!

@_rafaeltoledo

há mais a ser feito

Page 35: Caminhos para uma arquitetura limpa e testável em Android

Model

● Representar / Interagir com os dados

● Interagir com a rede - API?

@_rafaeltoledo

Page 36: Caminhos para uma arquitetura limpa e testável em Android

View

● Renderizar e apresentar os dados

● Gerenciar os estados das Views

@_rafaeltoledo

Page 37: Caminhos para uma arquitetura limpa e testável em Android

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

Page 38: Caminhos para uma arquitetura limpa e testável em Android

MVC no Android

● Pode ocorrer acúmulo de funções no Controller

@_rafaeltoledo

Page 39: Caminhos para uma arquitetura limpa e testável em Android

MVC?

@_rafaeltoledo

Page 40: Caminhos para uma arquitetura limpa e testável em Android

MVP!

@_rafaeltoledo

Page 41: Caminhos para uma arquitetura limpa e testável em Android

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

Page 42: Caminhos para uma arquitetura limpa e testável em Android

Presenter

● Android costumeiramente mistura Model + View. Ex: CursorAdapter

● Precisamos de uma divisão clara de responsabilidades

@_rafaeltoledo

Page 43: Caminhos para uma arquitetura limpa e testável em Android

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

Page 44: Caminhos para uma arquitetura limpa e testável em Android

@_rafaeltoledo

USUÁRIO

VIEW

MODEL

PRESENTER

Interage

Notifica

Atualiza

lexaden.com

Page 45: Caminhos para uma arquitetura limpa e testável em Android

@_rafaeltoledo

USUÁRIO

VIEW

MODEL

PRESENTER

Exibe

Atualiza

Obtém dados

lexaden.com

Page 46: Caminhos para uma arquitetura limpa e testável em Android

MVP - Interactors

● Controla as interações do usuário e com as fontes de dados

● Modelo de callback / troca de mensagens

@_rafaeltoledo

Page 47: Caminhos para uma arquitetura limpa e testável em Android

public interface MyPresenter {

void onResume();

void onItemClicked(int position);

}

@_rafaeltoledo

Page 48: Caminhos para uma arquitetura limpa e testável em Android

public interface MyView {

void showProgress();

void hideProgress();

void setItems(List<String> items);

void showMessage(String message);

}

@_rafaeltoledo

Page 49: Caminhos para uma arquitetura limpa e testável em Android

public interface LoadItemsInteractor {

void loadItems(OnItemsLoadedListener listener);

interface OnItemsLoadedListener {

void onLoaded(List<String> items);

}

}

@_rafaeltoledo

Page 50: Caminhos para uma arquitetura limpa e testável em Android

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

Page 51: Caminhos para uma arquitetura limpa e testável em Android

public class MyActivity implements MyView {

MyPresenter presenter;

...

@Override

protected void onResume() {

super.onResume();

presenter.onResume();

}

}

@_rafaeltoledo

Page 52: Caminhos para uma arquitetura limpa e testável em Android

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

Page 53: Caminhos para uma arquitetura limpa e testável em Android

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");

Page 54: Caminhos para uma arquitetura limpa e testável em Android

então MVP é só alegria?

@_rafaeltoledo

Page 55: Caminhos para uma arquitetura limpa e testável em Android

@_rafaeltoledo

Page 56: Caminhos para uma arquitetura limpa e testável em Android

MVP no Android

● Use com cuidado, pois pode acabar se tornando overengineered!

@_rafaeltoledo

Page 57: Caminhos para uma arquitetura limpa e testável em Android

Mas e o MVVM?

@_rafaeltoledo

Page 58: Caminhos para uma arquitetura limpa e testável em Android

MVVM

● Apareceu com mais força após o anúncio do DataBinding no I/O

● Existem outras libs de binding: RoboBinding, AndroidBinding, ...

@_rafaeltoledo

Page 59: Caminhos para uma arquitetura limpa e testável em Android

MVVM

● Comumente utilizado em ambientes Microsoft

● É quase um requisito o uso de alguma biblioteca, caso contrário haverá muito boilerplate

@_rafaeltoledo

Page 60: Caminhos para uma arquitetura limpa e testável em Android

@_rafaeltoledo

MODELVIEW

VIEW-MODEL

Data Binding eComandos

Atualiza o Model

Page 61: Caminhos para uma arquitetura limpa e testável em Android

Sinceramente?

@_rafaeltoledo

Page 62: Caminhos para uma arquitetura limpa e testável em Android

@_rafaeltoledo

Page 63: Caminhos para uma arquitetura limpa e testável em Android

Nossa… por quê?

@_rafaeltoledo

Page 64: Caminhos para uma arquitetura limpa e testável em Android

MVVM

● Códigos mais complexos tendem a ficar extremamente acoplados

● Testes? #comofas

@_rafaeltoledo

Page 65: Caminhos para uma arquitetura limpa e testável em Android

@_rafaeltoledo

Page 66: Caminhos para uma arquitetura limpa e testável em Android

Outras abordagens

● Clean Architecture

● Flux

● Viper (adaptado do iOS)

@_rafaeltoledo

Page 67: Caminhos para uma arquitetura limpa e testável em Android

Arquitetura

@_rafaeltoledo

algumas dicas finais

Page 68: Caminhos para uma arquitetura limpa e testável em Android

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

Page 69: Caminhos para uma arquitetura limpa e testável em Android

Dicas

● Desacople do framework

● Use Robolectric para testes unitários, Espresso / Robotium para navegação

@_rafaeltoledo

Page 70: Caminhos para uma arquitetura limpa e testável em Android

No final das contas...

@_rafaeltoledo

Page 71: Caminhos para uma arquitetura limpa e testável em Android

@_rafaeltoledo

estamos buscando um código bacana!

Page 72: Caminhos para uma arquitetura limpa e testável em Android

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

Page 73: Caminhos para uma arquitetura limpa e testável em Android

OBRIGADO!rafaeltoledo.net

@_rafaeltoledo

Desenv. Android @ Concrete Solutionsestamos contratando!

concretesolutions.com.br/carreira