O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

Limpiando espero la arquitectura que yo quiero

5.394 visualizações

Publicada em

Paso a paso explico como estructurar nuestros proyectos para ir solucionando y separando problemas para ver finalmente como la foto general de lo que hemos montado coincide con los principios de Clean Architecture y como esto nos ayuda a construir un software más solido, extensible y refactorizable.

Publicada em: Software
  • Seja o primeiro a comentar

Limpiando espero la arquitectura que yo quiero

  1. 1. Limpiando espero la arquitectura que yo quiero Clean Architecture for Android José Manuel Pereira García (JMPergar) ANDROID TECH LEAD
  2. 2. José Manuel Pereira García (JMPergar) ANDROID TECH LEAD www.jmpergar.com @JMPergar jm.pereira.g@gmail.com +JoseMPereira
  3. 3. We are hiring! https://www.jobandtalent.com/es/careers
  4. 4. Objetivos y premisas
  5. 5. Evitar el efecto L’Oréal (No elegir una arquitectura “porque yo lo valgo”)
  6. 6. Soporte a correctivos
  7. 7. Soporte a correctivos Soporte a evolutivos
  8. 8. Soporte a correctivos Soporte a evolutivos Extensible
  9. 9. Soporte a correctivos Soporte a evolutivos Extensible Testable
  10. 10. The best approach when you apply “Clean Architecture” is to use common sense by Rafael Aguilar (@Rais38)
  11. 11. The best approach when you apply “Clean Architecture” is to use common sense by Rafael Aguilar (@Rais38) Todas las arquitecturas caducan Martin Fowler - SacrificialArchitecture http://martinfowler.com/bliki/SacrificialArchitecture.html
  12. 12. single responsibility principle All you need is SRP
  13. 13. Separando problemas
  14. 14. Matando la God Activity VIEW Activity Fragment Widget ... View Interface Todo lo demás
  15. 15. Matando la God Activity Render Methods, View Lifecycle and View Configuration Todo lo demás View Interface
  16. 16. Lógica de vista y Navegación VIEW PRESENTER View Logic Navigation ROUTER View Interface Navigation LAUNCHER Implementation Navigation Launcher Interface Interface Todo lo demás Opcional
  17. 17. Lógica de vista y Navegación VIEW PRESENTER View Logic Navigation ROUTER View Interface Navigation LAUNCHER Implementation Navigation Launcher Interface Interface Todo lo demás Opcional
  18. 18. Lógica de vista y Navegación VIEW Procesar eventos de vista Solicitar datos Controlar la vista Guardar estado de la vista goTo goToNext back View Interface startActivity fragment transactions Interface Todo lo demás Opcional PAGE
  19. 19. View Presenter Domain Flujo de llamadas Click : Refresh Button Active Loading Request Data Response Error Render Empty State Error Click : Retry Active Empty State Loading Request Data Response DataDisable Loading Disable Loading Render Data
  20. 20. Para solucionar el problema de los giros de pantalla mantener en la vista la referencia al Presenter entre cambios de configuración gracias a: onRetainCustomNonConfigurationInstance getLastCustomNonConfigurationInstance Sólo en la Activity
  21. 21. Para solucionar el problema de los giros de pantalla mantener en la vista la referencia al Presenter entre cambios de configuración gracias a: onRetainCustomNonConfigurationInstance getLastCustomNonConfigurationInstance Sólo en la Activity
  22. 22. abstract public class PresenterFragment<K extends PresenterFragment, T> extends Fragment implements Presenter<T> { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } abstract public void init(K presenter); } private void initializePresenter() { FragmentManager fm = getFragmentManager(); MyPresenter retainedMyPresenter = (MyPresenter) fm.findFragmentByTag(MyPresenter.class.getName()); if (retainedMyPresenter == null) { fm.beginTransaction().add( mMyPresenter, MyPresenter.class.getName()).commit(); } else { retainedMyPresenter.init(mMyPresenter); mMyPresenter = retainedMyPresenter; } }
  23. 23. Lógica de negocio PRESENTER ROUTER InterfaceInterface UseCasesInterface INTERACTOR INTERACTOR INTERACTOR Interface Todo lo demás
  24. 24. Lógica de negocio PRESENTER ROUTER InterfaceInterface Validación de datos Obtención de datos Procesamiento de datos Interface Todo lo demás UseCasesInterface
  25. 25. Lógica de negocio InterfaceInterface Interface Todo lo demás Foreground Tasks (Synchronous Interactors) Interactor >> Runnable ThreadExecutor >> ThreadPoolExecutor PostExecutionThread >> MainThread Handler UseCasesInterface INTERACTOR INTERACTOR INTERACTOR PRESENTER ROUTER Background Tasks (Asynchronous Interactors)
  26. 26. Lógica y proveedores de datos Repository Interface REPOSITORY INTERACTOR INTERACTOR INTERACTOR DataSource Interface DataSource Interface API DataSource CACHE DataSource
  27. 27. Lógica y proveedores de datos Políticas de cacheo Lógica de origen de datos INTERACTOR INTERACTOR INTERACTOR DataSource Interface DataSource Interface Integración con los proveedores de datos Integración con los proveedores de datos Repository Interface
  28. 28. ¿Juntar Interactors y Repositories?
  29. 29. Clean Architecture
  30. 30. Activity Fragment Widget ... View Logic (Presenter) PAGES ViewInterface UseCases Repository Interface INTERACTOR INTERACTOR INTERACTOR DataSource Interface DataSource Interface API DataSource CACHE DataSource REPOSITORY Page Implementation
  31. 31. ENTIDADES UI PRESENTERS INTERACTORS REPOSITORIES DATASOURCES
  32. 32. ENTIDADES UI PRESENTERS INTERACTORS REPOSITORIES DATASOURCES AbstraccionesConcreciones Concreciones
  33. 33. ENTIDADES UI PRESENTERS INTERACTORS REPOSITORIES DATASOURCES AbstraccionesConcreciones Concreciones JAVAANDROID ANDROID
  34. 34. ENTIDADES UI PRESENTERS INTERACTORS REPOSITORIES DATASOURCES AbstraccionesConcreciones Concreciones JAVAANDROID ANDROID Regla de la dependenciaRegla de la dependencia
  35. 35. ENTIDADES UI PRESENTERS INTERACTORS REPOSITORIES DATASOURCES AbstraccionesConcreciones Concreciones JAVAANDROID ANDROID Regla de la dependenciaRegla de la dependencia Domain Objects (Modelos ricos) Model View Objects Data Objects
  36. 36. ¿Que hemos conseguido? ● Arquitectura independiente del framework, UI y proveedores de datos. ● Una arquitectura modular horizontal y verticalmente. ● Separar problemas y mejorar la legibilidad del código. ● Solucionar el problema de los cambios de configuración. ● Simplificar el problema de ejecución en segundo plano. ● Declarar el objetivo de tu software gracias a los interactors.
  37. 37. EN RESUMEN Aplica el sentido común No dejes de ser autocrítico y crítico Divide y vencerás
  38. 38. Show me the code! https://github.com/android10/Android-CleanArchitecture https://github.com/PaNaVTEC/Clean-Contacts
  39. 39. Gente con aura de tochez que sabe de arquitectura @pedro_g_s @PaNaVTEC@sefford @Akelael @fernando_cejas @flipper83 Saúl Díaz Android Engineer en Chicisimo Pedro Gómez Android Expert en Karumi Christian Panadero Android Developer en IG Rubén Serrano Lead Android Developer en Redbooth Fernando Cejas Android Developer en SoundCloud Jorge Barroso Cofounder y Android Expert en Karumi Pablo Guardiola Software Engineer en Telefonica I+D @Guardiola31337
  40. 40. Referencias Fernando Cejas - Architecting Android…The clean way? http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/ Jorge Barroso - Forgetting Android https://www.youtube.com/watch?v=ROdIvrLL1ao Pedro Gómez - Software Design Patterns https://www.youtube.com/watch?v=tt3zI9cKiWU Pedro Gómez - Effective Android UI https://www.youtube.com/watch?v=N6yqe88ysNw Rubén Serrano y José Manuel Pereira - Arquitectura Hexagonal en Android https://www.youtube.com/watch?v=C3e3AwOTohg Christian Panadero - My way to Clean Architecture https://www.youtube.com/watch?v=lOEOK3UvmJM Pablo Guardiola - What is all this Clean Architecture jibber-jabber about? http://pguardiola.com/blog/clean-architecture-part-1/ Uncle Bob- The Clean Architecture http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html
  41. 41. Preguntas José Manuel Pereira García (JMPergar) ANDROID TECH LEAD www.jmpergar.com @JMPergar jm.pereira.g@gmail.com +JoseMPereira
  42. 42. GRACIAS

×