Caminhos para uma Arquitetura Limpa e Testável no Android

Caminhos para uma Arquitetura Limpa e Testável no Android

Apresentada no Android Dev Conference 2015 organizado pelo iMasters

2dc2a52d38ee8c184deeceaadf9ed6ba?s=128

Rafael Toledo

August 29, 2015
Tweet

Transcript

  1. Caminhos para uma Arquitetura Limpa e Testável no Android

  2. rafaeltoledo.net @_rafaeltoledo Desenv. Android @ Concrete Solutions

  3. Arquitetura x Design @_rafaeltoledo

  4. Arquitetura x Design @_rafaeltoledo Polêmico!

  5. "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
  6. "É o conjunto de decisões de design que gostaríamos de

    ter tomado no início do projeto" @_rafaeltoledo Ralph Johnson (GoF)
  7. @_rafaeltoledo

  8. "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)
  9. @_rafaeltoledo entendidos?

  10. Arquitetura? @_rafaeltoledo

  11. @_rafaeltoledo

  12. @_rafaeltoledo

  13. Arquitetura @_rafaeltoledo por que se preocupar?

  14. Porque ninguém quer mexer em código legado @_rafaeltoledo

  15. Por que ninguém quer mexer em código legado? @_rafaeltoledo

  16. O que é legado? @_rafaeltoledo

  17. @_rafaeltoledo

  18. #0 Ausência de testes! @_rafaeltoledo

  19. “Prefer simple, direct solutions to problems rather than creating a

    lot of infrastructure and abstractions to solve those problems.” Chet Haase @_rafaeltoledo
  20. @_rafaeltoledo

  21. @_rafaeltoledo

  22. @_rafaeltoledo @benorama

  23. @_rafaeltoledo

  24. Arquitetura @_rafaeltoledo por que se preocupar?

  25. Por que se preocupar? • Código mais fácil de manter!

    • Rápido e fácil de testar • Fácil de entender • Desacoplado @_rafaeltoledo
  26. @_rafaeltoledo Caminhos?

  27. @_rafaeltoledo MVC? MVP? MVVM? Clean? Flux? Viper?

  28. @_rafaeltoledo MVC

  29. @_rafaeltoledo MODEL VIEW CONTROLLER

  30. Model • Representar / Interagir com os dados @_rafaeltoledo

  31. View • Renderizar e apresentar os dados @_rafaeltoledo

  32. Controller • Tratar eventos vindos da View • Atualizar o

    Model • Gerenciar a navegação @_rafaeltoledo
  33. @_rafaeltoledo

  34. Contexto Mobile! @_rafaeltoledo há mais a ser feito

  35. Model • Representar / Interagir com os dados • Interagir

    com a rede - API? @_rafaeltoledo
  36. View • Renderizar e apresentar os dados • Gerenciar os

    estados das Views @_rafaeltoledo
  37. 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
  38. MVC no Android • Pode ocorrer acúmulo de funções no

    Controller @_rafaeltoledo
  39. MVC? @_rafaeltoledo

  40. MVP! @_rafaeltoledo

  41. 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
  42. Presenter • Android costumeiramente mistura Model + View. Ex: CursorAdapter

    • Precisamos de uma divisão clara de responsabilidades @_rafaeltoledo
  43. 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
  44. @_rafaeltoledo USUÁRIO VIEW MODEL PRESENTER Interage Notifica Atualiza lexaden.com

  45. @_rafaeltoledo USUÁRIO VIEW MODEL PRESENTER Exibe Atualiza Obtém dados lexaden.com

  46. MVP - Interactors • Controla as interações do usuário e

    com as fontes de dados • Modelo de callback / troca de mensagens @_rafaeltoledo
  47. public interface MyPresenter { void onResume(); void onItemClicked(int position); }

    @_rafaeltoledo
  48. public interface MyView { void showProgress(); void hideProgress(); void setItems(List<String>

    items); void showMessage(String message); } @_rafaeltoledo
  49. public interface LoadItemsInteractor { void loadItems(OnItemsLoadedListener listener); interface OnItemsLoadedListener {

    void onLoaded(List<String> items); } } @_rafaeltoledo
  50. 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
  51. public class MyActivity implements MyView { MyPresenter presenter; ... @Override

    protected void onResume() { super.onResume(); presenter.onResume(); } } @_rafaeltoledo
  52. 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
  53. 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");
  54. então MVP é só alegria? @_rafaeltoledo

  55. @_rafaeltoledo

  56. MVP no Android • Use com cuidado, pois pode acabar

    se tornando overengineered! @_rafaeltoledo
  57. Mas e o MVVM? @_rafaeltoledo

  58. MVVM • Apareceu com mais força após o anúncio do

    DataBinding no I/O • Existem outras libs de binding: RoboBinding, AndroidBinding, ... @_rafaeltoledo
  59. MVVM • Comumente utilizado em ambientes Microsoft • É quase

    um requisito o uso de alguma biblioteca, caso contrário haverá muito boilerplate @_rafaeltoledo
  60. @_rafaeltoledo MODEL VIEW VIEW-MODEL Data Binding e Comandos Atualiza o

    Model
  61. Sinceramente? @_rafaeltoledo

  62. @_rafaeltoledo

  63. Nossa… por quê? @_rafaeltoledo

  64. MVVM • Códigos mais complexos tendem a ficar extremamente acoplados

    • Testes? #comofas @_rafaeltoledo
  65. @_rafaeltoledo

  66. Outras abordagens • Clean Architecture • Flux • Viper (adaptado

    do iOS) @_rafaeltoledo
  67. Arquitetura @_rafaeltoledo algumas dicas finais

  68. 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
  69. Dicas • Desacople do framework • Use Robolectric para testes

    unitários, Espresso / Robotium para navegação @_rafaeltoledo
  70. No final das contas... @_rafaeltoledo

  71. @_rafaeltoledo estamos buscando um código bacana!

  72. 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
  73. OBRIGADO! rafaeltoledo.net @_rafaeltoledo Desenv. Android @ Concrete Solutions estamos contratando!

    concretesolutions.com.br/carreira