Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

One Year of Clean Architecture - The Good, The Bad and The Bob

1,832 views

Published on

Après des heures de visionnage de ce sacré tonton, et conscients qu’évidemment, "there is a better way", il était temps de passer à la version supérieure du MVP. C’est ce que nous avons fait, en mettant en place différentes interprétations de la Clean Architecture sur nos missions, sur des applications existantes comme sur du from-scratch.

Nous sommes partis des postulats d’Uncle Bob : avoir une architecture indépendante des frameworks, de l’UI, des back-ends et des BDD. Et par dessus tout : testable. Pour une fois, nous n’avons pas mis la stack technique au centre de notre choix d’architecture. Car comme il le dit si bien, un bon architecte est quelqu’un qui retarde au plus tard les choix des outils. Nous nous sommes concentrés sur les règles métier. En pur java. En pur KOTLIN. Sans librairies.

Ce modèle a révolutionné notre manière de concevoir une application chez nos différents clients (BNP, SNCF, Meetic…). Nous allons vous partager nos fiertés, nos douleurs et les questions qui restent encore ouvertes.

Published in: Technology
  • De notre côté on a forcé le nommage des entités pour implémenter la Clean Architecture : ViewModel, DomainModel et DataModel pour différencier l'appartenance aux différentes couches des entités.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

One Year of Clean Architecture - The Good, The Bad and The Bob

  1. 1. By OCTO & The Refiners The Good, The Bad and The Bob Gabriel Adgeg – Dorian Lamandé NE YEAR OF CLEAN ARCHITECTURE
  2. 2. ANDROID?Dorian Lamandé Gabriel Adgeg
  3. 3. CONTEXTE CONCEPTS REX DE QUOI TU M'CAUSES LO ?
  4. 4. getTalkContext()
  5. 5. Architecting iOS Apps with VIPER
  6. 6. androïd
  7. 7. OCTO TECHNOLOGY > THERE IS A BETTER WAY
  8. 8. OCTO TECHNOLOGY > THERE IS A BETTER WAY
  9. 9. getString(R.string.clean_archi_concepts)
  10. 10. “ Architecture is not about tools and building materials, architecture is about usage. Robert C. Martin
  11. 11. Promesses de la Clean Architecture ¤ Indépendante des frameworks ¤ Testable ¤ Indépendante de la UI ¤ Indépendante de la base de données
  12. 12. Promesses de la Clean Architecture pour Android ¤ Indépendante des frameworks : SDK Android, Rx, Dagger ¤ Testable : TDD, JUnit, Espresso, Robolectric ¤ Indépendante de la UI : smartphone, tablette, TV, chatbot, émulateur ¤ Indépendante de la (base de) donnée(s) : Realm, Retrofit…
  13. 13. Le Lexique Clean Présentation Règles Fonctionnelles Entity Use-Case/Interactor Données Repository/Gateway Presenter ViewModel View
  14. 14. UI Thread Worker Thread Une interprétation de Clean Architecture en action Core Interactor Repository Interface Entity Presenter Presenter View Model View Interface Entity Repository Repository API Model Entity Activity Fragment
  15. 15. UI Thread Worker Thread Une autre interprétation de Clean Architecture Interactor Activity Fragment Repository PresenterView Controller Android Java/Kotlin
  16. 16. Entity public class Talk { private final String title; private final Date startingDate; public Talk(String title, Date startingDate) { this.title = title; this.startingDate = startingDate; } public String getTitle() { return title; } public Date getStartingDate() { return startingDate; } }
  17. 17. Interactor public class TalkInteractor { private final TalkRepository repository; private final TalkPresenter presenter; public void loadTalk(String talkId) { if (argumentIsValid(talkId)) { try { Talk talk = repository.getTalk(talkId); presenter.presentTalk(talk); } catch (TalkRepository.TalkRetrievalException e) { presenter.presentErrorRetrievingTalk(); } } else { presenter.presentInvalidArgument(); } } }
  18. 18. Api Model @AutoValue public abstract class JsonTalk { @JsonCreator public static JsonTalk newInstance( @JsonProperty("title") String title, @JsonProperty("date") Date date) { return new AutoValue_JsonTalk(title,date); } public abstract String getTitle(); public abstract Date getDate(); } { "talk": { "title": "One year of clean architecture", ”date": "2017-04-10T16:20:00" } }
  19. 19. Repository implementation public class RetrofitTalkRepository implements TalkRepository { private final Retrofit retrofit; @Override public Talk getTalk(String talkId) throws TalkRetrievalException { try { Response<JsonTalk> response = retrofit .create(Service.class).getTalk(talkId).execute(); if (response.isSuccessful()) { JsonTalk jsonTalk = response.body(); return transformToEntity(jsonTalk); } } catch (IOException ignored) { } throw new TalkRetrievalException(); } }
  20. 20. ViewModel public class TalkViewModel { private final String title; private final String startingDate; public TalkViewModel(String title,String startingDate) { this.title = title; this.startingDate = startingDate; } public String getTitle() { return title; } public String getStartingDate() { return startingDate; } }
  21. 21. Presenter implementation public class AndroidTalkPresenter implements TalkPresenter { private final TalkView view; @Override public void presentInvalidArgument() { view.displayError(); } @Override public void presentErrorRetrievingTalk() { view.displayError(); } @Override public void presentTalk(Talk talk) { TalkViewModel viewModel = transformToViewModel(talk); view.displayTalk(viewModel); } }
  22. 22. Activity public class TalkActivity extends AppCompatActivity implements TalkView { @Override public void displayError() { viewFlipper.setDisplayedChild(DISPLAY_ERROR); } @Override public void displayTalk(TalkViewModel viewModel) { viewFlipper.setDisplayedChild(DISPLAY_TALK); titleView.setText(viewModel.getTitle()); startingDateView.setText(viewModel.getStartingDate()); } }
  23. 23. Transformation de la donnée Repository "startingDate": "10-04-2017" LocalDate Interactor LocalDate Presenter "Lundi 10 avril 2017"
  24. 24. getValue(RX_CLEAN_ARCHI)
  25. 25. Et alors ? Use-case first, Activity last Frontières claires Use-cases full Java/Kotlin TDD 4 real Cohabitation de 2 libs pour la couche réseau
  26. 26. C’est quoi le hic ? ¤ Single responsability -> many objects ¤ Nécessite l’investissement de toute l’équipe ¤ Schéma nécessaire ¤ Objets passe-plat
  27. 27. Interro surprise Cohérence vs Pragmatisme Un ou plusieurs use-cases par écran ?
  28. 28. Interro surprise Cohérence vs Pragmatisme Validité de la donnée Cache Un ou plusieurs use-cases par écran ?
  29. 29. Zoom: Cache RetrofitTalkRepository Repository Implementation TalkInteractor Interactor Repository Interface TalkRepository
  30. 30. Zoom: Cache Interactor Repository Interface TalkInteractor TalkRepository RetrofitTalk Repository Repository Implementations CacheTalk Repository
  31. 31. Interro surprise Cohérence vs Pragmatisme Validité de la donnée Cache Actions mineures sur l’UI ? Un ou plusieurs use-cases par écran ?
  32. 32. Idéal pour des gros projets Permet la montée en compétence de nos jeunes Le mot de la fin Clean Archi 2ème version NOT Tools Driven Development
  33. 33. @dorianlamande @g_adgeg

×