Esquemas de reutilización de código en Xamarin

Dentro del desarrollo multiplataforma que plantea Xamarin hay dos puntos claves donde podremos plantear reutilización del código de nuestras aplicaciones: la lógica de negocio y la lógica de presentación. Esto implica que sobre dos de los puntos claves de una aplicación mobile podremos aplicar reutilización de código, reduciendo tiempos de desarrollo y facilitando el mantenimiento.

A su vez estos puntos son complementarios entre sí, pudiendo utilizar ambos de forma simultánea. Lo que si quedará en nuestras manos es la decisión sobre cuando utilizar cada una de estas formas y que funcionalidad tener como compartida entre las distintas plataformas, ya que como en todo desarrollo si planteamos compartir algo que realmente no corresponde nos estaremos complicando sin necesidad.

 

Lógica de negocio:

Este será el punto de reutilización elemental de Xamarin, ya que no hay existe prácticamente escenario donde no sea provechoso reutilizar la lógica de negocio de una aplicación.

A aquellos que ya hayan hecho desarrollos móviles en distintas plataformas, ¿no les ha pasado de que terminan haciendo exactamente la misma lógica de aplicación en distintos lenguajes y con distintos frameworks, resolviendo los mismos problemas pero de distintas formas? Acá está el punto original sobre el cual Xamarin a venido a ayudarnos.

La clave aquí está en desarrollar toda nuestra lógica de aplicación a través de proyectos separados a lo que son las capas de presentación, y desde estás últimas referenciar a dichos proyectos. En los proyectos compartidos donde desarrollemos toda nuestra lógica de aplicación por ejemplo podremos hacer lo siguiente (solo por mencionar algunos usos comunes):

  • Consumir Web Services o APIs REST: Toda aplicación móvil en la actualidad requiere consumir alguna API para darle una interacción al usuario. Con C# podremos desarrollar toda la lógica asociada (incluido el manejo de llamadas asíncronas) para este propósito, logrando una reutilización al 100% sobre este aspecto.
  • Definición e interacción con la base de datos: Este es un punto muy significativo en lo que a reutilización se refiere. Podremos lograr la reutilización completa de la gestión de nuestras bases de datos, desarrollando solamente una vez de nuestro acceso a datos.
  • Lógica de procesamiento de la aplicación: El uso de C# nos permite aprovechar sus características para resolver las necesidades que tengamos en una aplicación móvil, incluido el soporte a procesamiento asíncrono y paralelo de forma sencilla.
  • Gestionar el acceso a APIs específicas de cada plataforma: Más allá de la lógica que necesitemos desarrollar de forma particular, es muy probable que necesitemos el acceso a APIs nativas de cada plataforma, como por ejemplo la ubicación del GPS. Aquí podríamos pensar que estamos ante un “punto de quiebre” a la hora de pensar en la factibilidad del uso de una lógica de negocio compartida, pero no es así. Podemos usar una esquema de inyección de dependencias para que cada plataforma resuelva la funcionalidad en cuestión y nos retorne el resultado correspondiente a través de un contrato común a todas.

Como mencionamos anteriormente, lo que deberemos hacer para dar soporte de nuestra lógica de negocio a múltiples plataformas es distribuir dicha lógica en proyectos separados a los de presentación, como cualquier aplicación N-capas. Aquí tendremos dos formas (o tipos de proyectos) a usar: Shared Projects y Portable Class Library.

Sobre el primero hemos hablado en uno de los posts anteriores, y nos sirve sobre todo para tener recursos compartidos entre distintos proyectos, teniendo la particularidad de que no se compilarán allí mismo sino en el proyecto desde el cual se los referencie.

En cambio un proyecto de tipo Portable Class Library (conocido como PCL por sus iniciales) es mucho más cercano a una biblioteca de clases como las que normalmente solemos usar. La principal particularidad está en que sobre la misma podremos configurar las plataformas para las que queremos que esté disponible su utilización, pudiendo hacer esto en las propiedades del proyecto:

ReutilizacionXamarin - PCL

Esto hará que podamos utilizar este proyecto como referencia desde distintas aplicaciones target, lo cual tendrá como restricción las librerías y componentes que podamos usar, ya que deben ser compatibles con este enfoque.

 

Lógica de presentación:

Este es uno de los puntos más interesantes (y también relativamente nuevo) que nos ofrece Xamarin, permitiendo que realicemos el desarrollo de nuestras pantallas una sola vez y las mismas se rendericen en las distintas plataformas usando los componentes nativos de cada una. La clave de todo esto es Xamarin.Forms.

Básicamente podemos definirlo como un enfoque acompañado de un conjunto de herramientas, que nos permiten:

  • Desarrollar nuestras pantallas una sola vez
  • A partir de componentes genéricos lograr la visualización y funcionamiento del nativo para cada plataforma
  • Definición de elementos o propiedades según la plataforma
  • Personalización de elementos genéricos a nativos a partir de Renderers
  • Flujo de navegación único
  • Lógica adicional asociada a la presentación de la información en pantalla unificada
  • Acceso a APIs a través de inyección de dependencias

Esto sin duda puede producirnos un resultado muy significativo en los tiempos de desarrollo y mantenimiento de una aplicación, ya que estaremos realizando un desarrollo único para toda la gestión de la capa de presentación.

Igualmente debemos ser consientes que muchas veces el diseño puede ser personalizado para cada plataforma en particular, además de querer usar funcionalidades 100% nativas o exclusivas. Es allí donde Xamarin.Forms puede no ser la alternativa adecuada, ya que vamos a necesitar aplicar demasiadas particularidades dentro de un desarrollo concebido como compartido, produciendo un resultado que no va a lograr el cometido inicial de reutilizar la lógica ni la interacción de usuario que se quisiera (por las posibilidades que vamos a tener para hacerlo dentro de la programación).

Lo que no debemos olvidar es que el resultado de este enfoque sigue siendo una aplicación nativa para cada una de las plataformas que elijamos, como se puede ver en la siguiente imagen de ejemplo de una aplicación con Xamarin.Forms:

ReutilizacionXamarin - XamarinForms
Resultado de una aplicación desarrollada con Xamarin.Forms (imagen tomada del sitio de Xamarin)

Si analizamos la aplicación resultante en cada una de las plataformas, claramente estamos ante resultados con una interfaz nativa, con elementos y patrones de uso correspondientes a cada plataforma. Sin embargo se trata de un desarrollo de interfaz única, con solo algunas definiciones menores sobre elementos para cada plataforma.

Este es solamente un ejemplo que nos permite ver que el resultado es una aplicación con visualización de elementos nativos para cada caso. A su vez, como se puede apreciar, podemos lograr apariencias atractivas o utilización de componentes complejos. La clave estará en lo compartido que sea el diseño entre todas las plataformas y la necesidad de usar ciertos patrones o comportamientos nativos no soportados por Xamarin.Forms.

 

En uno de los próximos posts vamos a ver en mayor detalle la creación de una aplicación utilizando estos enfoques.

Gracias por leer!

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s