Software design patterns on Android Spanish

56
Software Design Patterns on Android Pedro Vicente Gómez Sánchez - Mobile Software Engineer, Tuenti Technologies. @pedro_g_s , @TuentiEng [email protected]

description

Software Design Patterns on Android

Transcript of Software design patterns on Android Spanish

Page 1: Software design patterns on Android Spanish

Software Design Patterns on AndroidPedro Vicente Gómez Sánchez - Mobile Software Engineer, Tuenti Technologies.

@pedro_g_s , @TuentiEng

[email protected]

Page 2: Software design patterns on Android Spanish

http://corporate.tuenti.com/es/dev/blog - @TuentiEnghttp://corporate.tuenti.com/es/jobs

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Page 3: Software design patterns on Android Spanish

¿Por qué hablar de patrones cuando podríamos estar en el bar?

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Page 4: Software design patterns on Android Spanish

“Si vuelvo a ver anotaciones para parsing json en una clase del dominio de mi problema, me pego un tiro.”

“Si vuelvo a ver un proyecto en el que no se use inyección de dependencias, me tiro por una ventana.”

“Si vuelvo a ver un proyecto en el que cada clase tenga más de 7 dependencias, me mudo a la India.”

“Si vuelvo a ver una clase de 3000 líneas de código, me paso a programar para iOS.”

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Pedro Gómez

Page 5: Software design patterns on Android Spanish

● Introducción● Problema a resolver.● Patrones en Android.● Patrón Renderer.● Patrón Repository.● Patrón Command.● Consejos prácticos.

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Page 6: Software design patterns on Android Spanish

DISCLAIMER

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Page 7: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Page 8: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez

Page 9: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez

Page 10: Software design patterns on Android Spanish

¿Qué son los patrones?

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Page 11: Software design patterns on Android Spanish

¿Qué son los patrones?

Un patrón es una posible solución a un problema que se nos plantea de forma que problemas con planteamientos similares puedan ser resueltos de forma similar.

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Page 12: Software design patterns on Android Spanish

¿Qué define un patrón?

● Nombre● Problema que resuelve● Estructura● Consecuencias

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Page 13: Software design patterns on Android Spanish

¿Qué tipos existen?

Creación Estructura

Comportamiento

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Page 14: Software design patterns on Android Spanish

¿Qué tipos existen?

● Creación:○ Abstract Factory.○ Builder.○ Singleton.

● Estructura:○ Adapter.○ Facade.○ Bridge.

● Comportamiento:○ Command.○ State.○ Memento.

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Page 15: Software design patterns on Android Spanish

Ventajas

● Cada patrón es una solución plausible y definida para problemas concretos.● Facilitan la reutilización de estructuras y evitar duplicación de código.● Facilitan la extensibilidad de código y aceleran el tiempo de desarrollo a largo

plazo.● Desacoplan el código.● Favorecen el cambio.● Reducen los esfuerzos de mantenimiento.● Suelen suponer una mejor asignación de responsabilidades.● Plantean un vocabulario común.● Resuelves problemas ya resueltos por otros desarrolladores.

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Page 16: Software design patterns on Android Spanish

Inconvenientes

● No es sencillo identificar qué patrón aplicar.● Pueden suponer una sobrecarga de trabajo a corto plazo.● No siempre es trivial aplicar el patrón a un problema concreto.● Pueden afectar al rendimiento.● Pueden provocar la fiebre del patrón o muerte por refactor.● Un patrón mal aplicado puede transformarse en un anti patrón.

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Page 17: Software design patterns on Android Spanish

Problema a resolver

● Mostrar un conjunto de vídeos en una lista.● Los vídeos serán proporcionados por una API

externa.● Los vídeos podrán ser de varios tipos:

○ Vídeos normales.○ Vídeos populares.○ Vídeos favoritos.○ Vídeos en directo

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Page 18: Software design patterns on Android Spanish

Patrones en Android

Adapter

Chain of Responsibility

Memento

Model View Controller

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Page 19: Software design patterns on Android Spanish

Patrones en Android: Adapter

Nombre: Adapter.

Problema: Convertir la interfaz de una clase en otra que el código cliente espera. Permite la colaboración otra clase a pesar de tener una interface incompatible.

Nuestro problema: Permitir que Android pinte una serie de vistas sobre un ListView sin conocer la implementación que le daremos en el futuro.

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Page 20: Software design patterns on Android Spanish

Patrones en Android: Adapter

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Page 21: Software design patterns on Android Spanish

Patrones en Android: MementoNombre: Memento.

Problema: Capturar y externalizar el estado de un objeto interno, sin violar la encapsulación, de modo que el objeto pueda ser restaurado a este estado más tarde.

Nuestro problema: Guardar el estado de la actividad para recuperarlo ante un reinicio del ciclo de vida de la misma.

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Page 22: Software design patterns on Android Spanish

Patrones en Android: Memento

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Page 23: Software design patterns on Android Spanish

Patrones en Android: Chain of ResponsibilityNombre: Chain of Responsibility.

Problema: Evita acoplar el emisor de una petición a su receptor dando a más de un objeto la posibilidad de responder a una petición. Para ello, se encadenan los receptores y pasa la petición a través de la cadena hasta que es procesada por algún objeto.

Nuestro problema: Notificar eventos a lo largo de nuestra aplicación hasta que uno de los receptores o varios decida procesarlo.

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Page 24: Software design patterns on Android Spanish

Patrones en Android: Chain of Responsibility

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Page 25: Software design patterns on Android Spanish

Patrones en Android: Model View Controller

Nombre: Model View Controller.

Problema: Desacoplar la implementación de las vistas y la de nuestro modelo.

Nuestro problema: Crear una aplicación de forma que la implementación de nuestras vistas y el modelo que implementa la lógica de negocio no esten acopladas.

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Page 26: Software design patterns on Android Spanish

UN ACTIVITY NO ES UN CONTROLADOR!!!

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Page 27: Software design patterns on Android Spanish

Problema a resolverPintado de la lista Procedencia de los

datosCasos de uso

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Page 28: Software design patterns on Android Spanish

Renderer

Software Design Patterns on Android - Pedro V. Gómez Sánchez - [email protected]

Page 29: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

RendererNombre: Renderer.

Problema: Desacoplar el proceso de pintado de elementos heterogéneos en una lista.

Nuestro problema: Tenemos vídeos de diferentes tipos que tienen que pintarse de forma diferente. Vídeos normales, vídeos populares, vídeos favoritos y vídeos en directo.

Page 30: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

RendererEstructura: Este patrón es una combinación de tres patrones.

● Builder: Separa la construcción de un objeto complejo de su representación, así que el mismo proceso de construcción pueda crear diferentes representaciones.

● Delegate: Patrón aplicado cuando una clase delega su implementación en otra clase que actúa como helper.

● Template Method: Define el esqueleto de un algoritmo en una operación, difiriendo algunos pasos en las subclases.

Page 31: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - [email protected]

RendererBuilder: Crear o reciclar una vista en el método getView de un adapter es un proceso de creación complicado que podemos implementar utilizando el patrón builder.

Page 32: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - [email protected]

Builder

Page 33: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Renderer

Template Method: Aplicando este patrón podemos crear una estructura general para el algoritmo de pintado de los vídeos en la lista de forma que los subtipos especialicen el algoritmo y cambien o añadan el contenido que deseen duplicando la menor cantidad de código posible.

Page 34: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Template method

Page 35: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

RendererDelegate: La implementación clásica de el método getView se basa crear, reciclar y setear el contenido de la vista para pintarla apropiadamente, con el patrón delegate podremos delegar la implementación del pintado de la vista sobre los objetos de tipo Renderer.

Renderer

Page 36: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

RendererDelegate: Con este cambio de implementación puede observarse cómo la implementación que vimos en transparencias anteriores se ve reducida a la siguiente.

Page 37: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Renderer

Page 38: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Merece la pena?

Page 39: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Resultado?

Page 40: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Page 41: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Renderer

Page 42: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Renderer

Page 43: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Un adaptador para adaptarlos a todos?

Page 44: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

https://github.com/pedrovgs/Renderers

Page 45: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

RepositoryNombre: Repository.

Problema: Abstraer el origen de datos de un sistema con posibles fuentes de información.

Nuestro problema: Abstraer la procedencia de los datos, si proceden de un sistema de almacenamiento basado en memoria, persistencia o si los datos proceden de la api.

Page 46: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Repository

Diferentes implementaciones de la interface repositorio pueden ofrecer diferentes prestaciones abstrayendo por completo al resto del sistema.

Page 47: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

¿Por qué?

Page 48: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

¿Qué importa si la aplicación tiene una base de datos o un fichero o una API

externa?

Page 49: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - [email protected]

Repository

Page 50: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - [email protected]

Repository

Page 51: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

CommandNombre: Command.

Problema: Encapsular un mensaje como un objeto, permitiendo parametrizar los clientes con diferentes solicitudes, añadir a una cola las solicitudes y soportar undo redo.

Nuestro problema: Modelar los casos de uso de la aplicación de forma que abstraigamos el proceso de ejecución de los mismos.

Page 52: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

Command Casos de uso

Page 53: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - [email protected]

Command

Page 54: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - [email protected]

Consejos prácticos● Un modelo por dominio.● Evitar la duplicidad de código.● Refactorizar día a día.● Cumplir el principio de responsabilidad única.● Tomar las decisiones importantes cuando sea necesario.● Pensar en el framework como un mecanismo de paso de

información.● Desarrollar desde el caso de uso.● Crear código testable.● Escribir código para los compañeros no para la máquina

Page 55: Software design patterns on Android Spanish

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s

¿Preguntas?

Page 56: Software design patterns on Android Spanish

http://corporate.tuenti.com/es/dev/blog - @TuentiEnghttp://corporate.tuenti.com/es/jobs

Software Design Patterns on Android - Pedro V. Gómez Sánchez - @pedro_g_s