Páginas

28 nov. 2012

Arquitectura de aplicaciones Android

Estos días ando con varias peleas con la nueva versión de Gredos Virtual 3D pero tengo pendiente desde hace bastante tiempo publicar un artículo destripando un poco la arquitectura de ésta aplicación. En concreto de lo que quiero hablar aquí es de un diseño que me ha demostrado ser bastante eficiente y que creo que es reutilizable en casi cualquier futura aplicación Android tanto por su versatilidad como por su robustez. 

Doy por hecho que cualquiera que esté leyendo ésto está buscando una buena solución para la interfaz de usuario de su aplicación, ésta solución busca robustez y versatilidad y que el crecimiento en funcionalidades sea fácil de acometer sin suponer un grave impacto en la experiencia de usuario. Siguiendo las pautas que daré a continuación podremos conseguir que todas las actividades de nuestra aplicación sean homogéneas tanto en el flujo de control como en los aspectos visuales. No voy a pegar código pues creo que lo que se explica aquí cualquiera con algo de experiencia con Android lo puede codificar por si mismo, lo importante es pensar primero, realizar un buen diseño que es lo que aquí se intenta y codificar después, quizá si deje algún enlace a entradas de StackOverflow pero no código propio a no ser que me lo pida algún lector.

Vamos al grano. ¿Qué se le debe pedir a una aplicación móvil? En general las aplicaciones móviles suelen tener una Splash Screen, es decir, una pequeña pantalla con un logo o una barra de progreso indicando la carga de la aplicación, esto es totalmente opcional pero le da a nuestras aplicaciones un "toque" profesional. Lo siguiente suele ser un panel de control, una pantalla o actividad que será el centro neurálgico del resto de la aplicación desde donde accederemos a las distintas funcionalidades y en donde queda presente por medio de estilos la imagen y apariencia de la aplicación, imagen que queremos mantener a lo largo del resto de actividades. El resto de actividades de nuestra aplicación podrían, es más, deberían mantener la homogeneidad con la pantalla de inicio, el panel de control, e incluir todas ellas las mismas opciones. ¿Cómo podemos hacer ésto sin repetir código? 

La respuesta a éste primer interrogante, atendiendo al principio DRY (Don't Repeat Yourself) y a la S y la O de SOLID (SRP: Single Responsiblity Principle y OCP: Open Closed Principle) es utilizar herencia, de ésta forma no repetiremos código en cada una de nuestras actividades y abriremos nuestra aplicación a la extensión consiguiendo que cada actividad se centre en una única responsabilidad. El simple hecho de utilizar una clase BaseActivity que aglutine las funciones, las acciones y los flujos comunes como podrían ser ir a inicio, realizar una búsqueda o las comprobaciones pertinentes hacia el usuario, permite a las actividades que hereden de ésta clase base despreocuparse de estas responsabilidades y centrarse en lo que de verdad importe en cada una de ellas. Eso respecto a la lógica de la aplicación y el flujo entre actividades nos da potencia, robustez, homogeneidad y versatilidad, ¿qué más se puede pedir? 

Respecto a los aspectos visuales tenemos la herencia entre layouts, no existe, al menos hasta donde yo sé, una herencia como tal entre layouts de Android pero sí que existe la directiva <Include> con la que en cada layout de cada actividad que herede de BaseActivity podamos incluir por ejemplo una o más barras de tareas con las acciones comunes implementadas en BaseActivity así:

<include layout="@layout/tasksbar"/>
...
<include layout="@layout/footerbar"/>

Otro aspecto arquitectural importante suele ser mantener un contexto de aplicación, un nexo de unión entre las distintas actividades que contenga, por decirlo de alguna manera, estados, objetos o información de carácter global, que asegure dependencias y que sirva de nexo para todas las actividades de nuestra aplicación. Para ésto lo mejor, en mi opinión, es definir una clase propia que extienda a Application y declararla en el fichero AndroidManifest.xml de nuestra aplicación en la que podremos controlar, independientemente de qué suceda en cada actividad y de cuál se lance primero, qué sucede  cuando se crea, se pausa, se "resume" o relanza y se termina la aplicación por ejemplo instanciando distintos recursos como servicios o controladores, pausándolos y resumiéndolos cuando sea necesario y liberando la memoria utilizada por ellos al salir. 

Mediante estas tres pautas, una actividad base, un correcto uso de los layouts y un buen contexto de aplicación nuestras aplicaciones ganarán en profesionalidad, en robustez, en versatilidad y estaremos preparados para el cambio y para que nuestras aplicaciones crezcan sin demasiadas implicaciones y efectos colaterales pues podremos centrarnos bien en los cambios que haya que realizar en cierta actividad o bien en desarrollar una nueva actividad con una nueva funcionalidad y adaptar el flujo de nuestra aplicación en muy poco tiempo y sin demasiadas complicaciones. 

Enlaces:

Herencia en actividades (BaseActivity):
Android how to create my own Activity and extend it ?
How to minimize duplication code in Android without creating Objects
Options Menus and Base Activities

Sobre <Include>:

Contexto de Aplicación:

Patrones de diseño para Android:

Espero que ésta lectura y los enlaces hayan sido útiles y recibir comentarios tipo "quiero saber más sobre ésto", "En ésto te equivocas" o "Gracias, me ha sido muy útil éste artículo".

Un saludo.


Juan García Carmona

19 nov. 2012

Actualizado Gredos Virtual 3D

Para los que han seguido los desarrollos para Android que he estado haciendo estos meses y a los que ya les gustaban las aplicaciones de mapas en 3D que estaban en marcha tengo una buena noticia: 

Hoy he subido la actualización a la versión 2.0 Gredos Virtual 3D. 

Sólo voy a dejar unas capturas de pantalla y un enlace a la descarga aunque los que tengáis un móvil con Android podéis descargarla directamente desde Google Play en vuestros dispositivos. 

Gredos Virtual 3D 2.0 incluye muchas mejoras:
  • Se ha mejorado la interfaz de usuario
  • Se ha mejorado el modo paseo incluyendo una brújula y permitiendo andar de forma continua con una pulsación larga
  • Se ha añadido el modo niebla, el cual te posiciona en el mapa y gracias a los sensores de inclinación y a la brújula permiten ver lo que hay a nuestro alrededor aunque la niebla o las condiciones meteorológicas nos lo impidan. Lo he probado In-Situ y me ha sido enormemente útil.

Aquí las capturas de pantalla:




Y el enlace es:


Y creo que éste puede ser un buen momento para anunciar mi intención de crear una plataforma para la creación de mapas en 3D. No puedo dar más que los siguientes detalles:
  • Será una aplicación gratuíta, de momento para Android, pero quizá porte sólo o con ayuda ésta app a Windows Mobile y iPhone. Desde ésta aplicación se podrán descargar y utilizar los mapas en 3D que ya tengo hechos y los que poco a poco vaya haciendo y publicando.
  • Liberaré el código en GitHub para que cualquiera con conocimientos de programación e interés pueda aportar su granito de arena y mejorar la aplicación, de forma altruista y para todos.
  • Crearé una wiki explicando paso a paso cómo se puede crear un mapa y como están hechos "por dentro" y facilitaré al máximo el proceso para que cualquiera pueda hacerlo.

Ésta plataforma a la que ahora hago referencia requiere mucho trabajo y también mucho esfuerzo por mi parte. No sé hasta donde llegará ni cuando estará lista para dar los "primeros pasos" pero según acabe esta entrada comenzaré a dar forma a todo éste proyecto. Cualquiera interesado en participar activamente puede ponerse en contacto conmigo y le atenderé encantado.

Un saludo.

Juan García Carmona

15 nov. 2012

SOLID Y GRASP. Buenas prácticas hacia el éxito en el desarrollo de software.

Como muchos sabéis el otro día impartí una conferencia a través de Internet titulada "SOLID y GRASP, buenas prácticas hacia el éxito en el desarrollo de software". Dicha conferencia la organizó el grupo de investigación de Ingeniería Web y Testing Temprano (IWT2) fue dada a través de Internet utilizando Skype para el audio y el vídeo y compartiendo parte de mi pantalla con la sala de la Escuela Técnica Superior de Ingeniería Informática de la Universidad de Sevilla donde se encontraban los asistentes gracias a screenleap

Pues bien, antes del simposio entregué a los alumnos una documentación que no todos los asistentes tenían impresa y que era una guía muy detallada de lo que tenía pensado decir, incluyendo comentarios  diagramas UML y código fuente de multitud de ejemplos "malos" donde se cometían ciertos errores. También había en esa documentación una serie de huecos pensados inicialmente para que los asistentes, a modo de ejercicio, fueran resolviendo y arreglando cada ejemplo "malo", tanto con diagramas UML como con código fuente en C# o pseudocódigo. 

Como no todos tenían esa documentación decidí saltarme las prácticas e ir planteando yo cada una de las soluciones y fueron pocos o ninguno los que tuvieron tiempo de coger nota de todo lo que fui diciendo y al final de mi charla prometí que subiría un documento con todo lo que había añadido a la charla y no estaba en la guía inicial.

Bueno, acabo de terminar dicho documento y un poco mas abajo dejo el enlace para su descarga. Como me ha llevado muchísimas horas de trabajo prepararlo he decidido aplicarle una licencia Creative Commons, en concreto Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported (CC BY-NC-ND 3.0). Ésta licencia permite copiar el documento y distribuirlo cuanto se quiera pero mencionando explícitamente de quien es la autoría y nunca y bajo ninguna circunstancia con ánimo de lucro o con fines comerciales. Mi intención con ésto es que se pueda utilizar éste documento, en el contexto que sea y a nivel internacional, para enseñar lo que en el documento se enseña pero reconociendo la labor de la elaboración de dicha documentación, diagramas UML y códigos fuente de ejemplos y soluciones.

A continuación dejo el enlace para la visualización y descarga del documento y quedo a la espera de comentarios, tanto de los asistentes al simposio como de futuros lectores.




Licencia de Creative Commons

Un saludo.
Juan García Carmona

5 nov. 2012

IWT2 DojoUS :: SOLID y GRASP

Éste viernes 9 de noviembre de 2012 voy a dar una pequeña charla en la Universidad de Sevilla. Hace tiempo me puse en contacto con Javier Gutierrez, profesor de la Universidad de Sevilla, entusiasta del TDD y miembro de IWT2, grupo de Ingeniería Web y Testing Temprano. A raiz de algunas conversaciones que tuvimos en cuanto a la formación de ingeniería de software y de TDD me ofreció hacer una ponencia sobre éste tema ya que es algo que en muchas ocasiones se menciona en libros y blogs sobre la materia pero en lo que pocas veces se profundiza.

Llevo unos días preparándolo, a partir de la documentación y los ejemplos que ya tenía de los distintos artículos que hay en éste blog, he preparado una guía para los asistentes en la que punto por punto iremos viendo una serie de ejemplos sobre los que trabajaremos y estoy preparando una serie de ejercicios prácticos de refactorización de código "foráneo" de programas que incumplen uno o varios principios que espero nos de tiempo a realizar ya que la documentación en sí es bastante extensa. 

De momento no puedo adelantar mucho más, podéis encontrar algo de información a éste respecto en los siguientes enlaces:


Tengo que decir que estoy nervioso pues éste no es un tema especialmente divertido y me gustaría poder entretener a los asistentes y conseguir a la vez que éstos principios arraiguen en ellos y sean aplicados, o al menos tenidos en cuenta, durante su ejercicio profesional.

No sé si publicaré más material del utilizado durante ésta charla, aquí os dejo la que va a ser la guía para el alumno y una serie de ejercicios propuestos. Supongo que éstos ejercicios, por la duración del evento y lo extenso de la materia, no podrán llegar a ser tratados tras la charla pero invito tanto a los asistentes al dojo como a cualquier lector a mandarme sus respuestas para que sean publicadas en su nombre aquí en mi blog.

Guía del curso SOLID y GRASP
Ejercicios sobre SOLID y GRASP

Un saludo.

Juan García Carmona
d.jgc.it@gmail.com