Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Conceptos básicos sobre patrones de arquitectura para Android

Conceptos básicos sobre patrones de arquitectura para Android

My first tech talk I gave for the Android Dev Perú community about architecture patterns in Android.

More Decks by Jose Flavio Quispe Irrazábal

Other Decks in Programming

Transcript

  1. N Capas • Estructura de un sistema de software. •

    Define como los componentes: ◦ Se comunican ◦ Se interrelacionan ◦ Sus responsabilidades • Permite bajo acoplamiento.
  2. Patrones de Diseño • Los patrones de diseño utilizan un

    tipo de entidad y muestra la relación entre estos para una llegar a una solución. • Representan la forma de estructurar clases para resolver problemas comunes. • Describen una estructura interna.
  3. Patrones de Arquitectura • Los patrones de arquitectura utilizan muchos

    componentes que están compuestos por módulos más pequeños. Cada componente tiene una responsabilidad única con respecto a la arquitectura. Patrón de Arquitectura Micro-kernel. Fuente: Oreilly.com
  4. Patrones de la capa de presentación en Android • Diseño

    a nivel general de una aplicación Android y la interacción que tendrá el usuario con esta. • Define como obtendremos la data y la mostraremos al usuario.
  5. Modelo - Vista - Controlador • Modelo: lógica de negocios,

    conexiones a servidor, datos. • Vista: Interface que será implementada por Activity, Fragment o View. • Controlador: Clase aparte que se comunica con la vista a través de una interface.
  6. Modelo - Vista - Presentador • Vista: Interface que será

    implementada por Activity, Fragment o View. • Presentador: “lógica de la vista” y mediador con modelo. • Modelo: lógica de negocio, recoge datos, repositorios.
  7. Abstracción interface ShowMoviesView : BaseView{ fun setPresenter(presenter: ShowMoviesPresenter) fun showLoader()

    fun hideLoader() fun errorInternet() fun errorServer() fun onMoviesLoaded(list: ArrayList<Movie>) } interface ShowMoviesPresenter : BasePresenter { fun setInteractor(interactor: ShowMoviesInteractor) fun showMovies() fun onMoviesLoaded(list: ArrayList<Movie>) fun onMoviesError(errorCode: Int) } interface ShowMoviesInteractor { fun getMovies() } … override fun getMovies() { repo.getMovies() // in which thread the work will be executed .subscribeOn(Schedulers.computation()) // in which thread is onNext() method going to be listened .observeOn(AndroidSchedulers.mainThread()) // onComplete() call will execute onMoviesLoaded method .subscribe(presenter::onMoviesLoaded) } interface MoviesRepository<T> { fun getMovies() : Single<List<T>> } Solo cambios de UI Gestiona los cambios de UI y se comunica con el mediador al repositorio (interactor) Caso de uso y escucha al repositorio Obtiene los datos, no interesa de donde, siempre devolverá objetos T Observa
  8. Model - View - ViewModel • Model: lógica de negocio,

    llamadas a bases de datos. • ViewModel: interactúa con el modelo y observa sus cambios. Prepara la data a ser observada. • View: actualiza la UI. Observa al ViewModel. ¡Ninguna capa tiene conocimiento sobre la existencia de la capa anterior! Se suscribe a los cambios de: Se suscribe a los cambios de: Solicita datos de:
  9. ShowMoviesActivity viewModel = ViewModelProviders.of(this).get(ShowMoviesViewModel::class.java) observeLoadState() requestForMovies() private fun observeLoadState() {

    viewModel.getState().observe(this, Observer<Int> { when (it) { ShowMoviesViewModel.LOADING -> { pb.visibility = View.VISIBLE } ShowMoviesViewModel.LOADED -> { pb.visibility = View.GONE } } }) } private fun requestForMovies() { btn.setOnClickListener { viewModel.getMoviesList().observe(this@ShowMoviesActivity, Observer<ArrayList<Movie>> { onMoviesLoaded(it!!) }) } }
  10. ShowMoviesViewModel fun getMoviesList(): MutableLiveData<List<Movie>> { loadState.value = LOADING repo.getMovies() .subscribeOn(Schedulers.computation())

    .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::loadList) return list } private fun loadList(l: List<Movie>) { loadState.value = LOADED list.postValue(l) } interface MoviesRepository<T> { fun getMovies(): Single<List<T>> } ShowMoviesRepository
  11. Clean Architecture • “Integración” de arquitecturas como: Hexagonal, Onion, DCI,

    Screaming, etc. • Separación de responsabilidades dividiendo el software en capas.
  12. Clean Architecture • Independencia a frameworks: estos son utilizados como

    herramientas extras y el sistema no se limita a ellos. • Testeable: cada módulo se puede probar sin la necesidad de otro. • Independencia de cualquier agente externo: las reglas de negocio no saben nada acerca del exterior. • Independencia de la UI: la forma de presentar el sistema al usuario puede cambiar. • Independencia de cualquier base de datos: puedes cambiar de Oracle a MySQL o de Mongo a Firebase o de SQL Server a Mongo...
  13. Clean Architecture • Entidades: objetos de las reglas de negocio.

    • Casos de Uso: funciones y reglas de negocio. • Adaptadores de Interfaz: arquitecturas de la GUI. • Frameworks: bases de datos, REST API’s.
  14. Clean Architecture en Android: ¿Cómo estructuro mi proyecto? • MVC,

    MVP, MVVM • Le pasa el repositorio implementado al caso de uso en la capa de Dominio
  15. Clean Architecture en Android: ¿Cómo estructuro mi proyecto? • Contiene

    los repositorios implementados. • Obtiene data externa.
  16. Clean Architecture en Android: ¿Cómo estructuro mi proyecto? • Casos

    de uso • Llamadas al repositorio • Solo Kotlin o Java (el módulo es una librería pura)
  17. Links de Interés • Florina Muntenescu (Noviembre, 2016). Android Architecture

    Patterns: Model-View-Controller. • Florina Muntenescu (Noviembre, 2016). Android Architecture Patterns: Model-View-Presenter. • Antonio Leiva (Abril, 2014). MVP for Android: how to organize the presentation layer. • Janishar Ali (Julio, 2017). Android MVP Architecture Extensions with Interactors and Repositories. • Florina Muntenescu (Abril, 2017). MVVM - It's All in The (Implementation) Details. • Joe Birch (Septiembre, 2015). Approaching Android with MVVM. • Petr Nohejl (Diciembre, 2016). MVVM on Android. • Roy Ng (Mayo, 2017). It's time to use MVVM as your Android’s app base architecture. • Jose Alcérreca (Septiembre, 2017). ViewModels and LiveData: Patterns + AntiPatterns. • Jordi González (Noviembre, 2010). Clean Architecture. The Bemobile Way. • Antoni Castejón (Febrero, 2017). Android clean architecture with ViewModel, UseCases and Repositories: Part 1. • Arthur Antunes (Diciembre, 2016). SOLID Principles: The Definitive Guide. • Uncle Bob (Agosto, 2012). The Clean Architecture. • Chema Pramos (Enero, 2016). Arquitectura Clean de Uncle Bob. • Chema Pramos (Febrero, 2016). Vísteme con Clean Architecture que tengo prisas. • Google Developers (Mayo, 2018). Guide to App Architecture. • Jose Flavio Quispe (Abril, 2018). Basic concepts of Software Architectures in Android. • Neal Ford en Oreilly.com (Setiembre, 2015). Contrasting architecture patterns with design patterns. • Microsoft Docs (Diciembre, 2010). Key Principles of Software Architecture. • Antonio Leiva (Octubre, 2018). Clean architecture para Android con Kotlin. • Yossi Segev (Marzo, 2018). A Guided Tour inside a clean architecture code base.