Windows Phone. Técnicas para compartir código. 1º Parte

Introducción

wp7_wp8Tratando temas de desarrollo relacionados con Windows Phone una de las preguntas más frecuentes que se suele recibir es…

¿Desarrollo para Windows Phone 8 o sigo desarrollando para Windows Phone 7?

La respuesta es depende. Como todo en la vida os estaréis imaginando. Windows Phone 8 nos facilita en sus APIs a los desarrolladores la capacidad de implementar funcionalidades que hasta ahora no teníamos como comandos de voz, text to speech, nuevos mapas, wallet, etc. Sin duda es una opción sumamente tentadora. Si nuestra aplicación requiere del uso de alguna de estas nuevas APIs no hay discusión, debemos desarrollar para Windows Phone 8. Sin embargo, el número de dispositivos Windows Phone 7 en el mercado es hoy por hoy superior al número de Windows Phone 8. Por lo tanto, el número de posibles usuarios también es mayor. Además por compatibilidad binaria nuestra aplicación Windows Phone 7 funcionaría en dispositivos Windows phone 8, eso si, sin aprovechar ninguna de las nuevas funcionalidades.

Entonces, ¿porque no aprovechar las nuevas funcionalidades de Windows Phone 8 y no desaprovechar el volumen de usuarios ya existentes de Windows Phone 7?. Si, crearíamos entonces dos versiones. En la entrada actual vamos a comenzar a analizar como utilizando técnicas para compartir código podemos conseguir tener nuestra aplicación en Windows Phone 7 y Windows Phone 8 compartiendo grandes cantidades de código.

Interesante, ¿verdad?. Manos a la obra!

Arrancamos

Para acelerar el proceso y llegar a los divertido (las técnicas para compartir código, claro) vamos a partir de un proyecto ya existente. Se trata de una aplicación para Windows Phone 7 llamada “Recetas” que como su nombre indica es una aplicación de recetas de cocina.

La aplicación cuenta con una pantalla principal donde el usuario puede elegir entre distintos grupos de recetas:

Página Principal

Página Principal

Tras elegir un grupo en concreto, el usuario puede ver el listado de recetas que pertenecen a dicho grupo:

Detalles de un Grupo

Detalles de un Grupo

Por último, al seleccionar una receta el usuario visualizará los detalles de dicha receta. En el ApplicationBar tenemos opciones para:

  • Crear un recordatorio
  • Crear un tile secundario
Detalles de una Receta

Detalles de una Receta

Podéis descargar el código del ejemplo a continuación:

Actualizando a Windows Phone 8

Bien, partiendo de nuestro proyecto Windows Phone 7 deseamos portarlo a Windows Phone 8. Como veremos a continuación, es una tarea sumamente sencilla.

En Visual Studio hacemos clic derecho sobre el proyecto en el explorador de soluciones. Nos aparecerá el siguiente menu emergente:

Actualizar a Windows Phone 8

Actualizar a Windows Phone 8

Elegimos la opción “Actualización a Windows Phone 8.0“.

Puedes obtener más información al respecto en el siguiente enlace.

FacepalmBien, llegados a este punto hemos logrado uno de nuestros grandes objetivos, tenemos nuestra aplicación Windows Phone 7 portada a Windows Phone 8. Sin embargo, tenemos un grave problema…

Tenemos el doble de trabajo!. Ahora cada cambio en nuestra aplicación tenemos que tenerlo en cuenta en dos apps diferentes… ¿solución?.

Técnicas para compartir código

Para evitar mantener ambos proyectos (duplicando el trabajo), deberíamos lograr compartir la mayor cantidad de código entre ellos. Podemos lograrlo con un correcto uso de las técnicas para compartir código:

  • Ctrl-C, Ctrl-V: Más que un patrón a utilizar para compartir código es un evidente anti-patrón. NO debemos realizar copy & paste bajo ningun motivo. Siempre que que estemos realizando esta operación debemos pararnos a analizar la situación. Con toda probabilidad existirá alguna otra técnica mucha más efectiva que nos facilitará la gestión y mantenimiento del código.
  • Enlazado de ficheros: En proyectos Visual Studio podemos utilizar un mismo fichero sin necesidad de copiar (duplicando) el fichero en cada proyecto, es decir, utilizando el mismo fichero. Esta fácil y su vez potente estrategia para compartir código, nos permite utilizar ficheros en un proyecto vinculados a otro. Sólo trabajamos con un fichero y además trabajamos con el de manera natural, de modo que, un cambio en el fichero en cualquiera de los proyectos donde se utilice afecta al resto.
Ad As Link

Ad As Link

  • Compilación Condicional: Mediante directivas de compilación podemos elegir que parte del código ejecutar dependiendo de la plataforma donde se ejecute. Se debe utilizar sólo para pequeños trozos de código. Hay que tener en cuenta que aunque logramos nuestro objetivo, estamos duplicando código. Veamos un ejemplo:
#if CONDITION
using Conditional.Namespace;
#else
using Another.Namespace;
#endif
  • Componente Windows Runtime: Es un componente pensado para agrupar y exponer funcionalidad. Es compatible con Windows Phone 8 y con Windows 8. Contamos con plantillas en Visual Studio que nos facilitan su creación (Windows Runtime Componente template). No lo usaremos a corto plazo ya que no es compatible con proyectos Windows Phone 7.
  • Portable Class Library:  Permiten realizar el desarrollo multiplataforma de aplicaciones .NET. Podemos crear librerías portables con códiog compartido entre Windows 8, Windows Phone, Xbox 360 y otras plataformas .NET.
Portable Class Library

Portable Class Library

¿Qué podemos compartir en una librería Portable?

Antes de usar directamente la librería Portable debemos realizar un esfuerzo de análisis para determinar que podemos y que no podemos compartir utilizandola. El objetivo final es poder añadir en la librería portable la mayor cantidad de código posible. Nuestros proyectos se nutrirán de dicha librería.

En una librería portable:

  • Podemos añadir código administrado (C# o VB) no dependiente de plataforma específica. Es decir, podremos pasar variables, propiedades, métodos, etc. siempre y cuando no haya código específico de ninguna plataforma como podría ser la lógica para crear un tile secundario en Windows Phone por ejemplo. Las APIs del Windows Runtime no son portables y no se pueden utilizar desde librerías portables.
  • No se pueden añadir directivas de compilación. Las directivas de compilación como ya hemos comentado tienen como objetivo permitir diferentes rutas en el código dependiendo de la plataforma. El objetivo de la librería portable es el antagónico. Si necesitamos una implementación diferente en Windows Phone 7 y Windows Phone 8 no incluiremos ambas rutas en la librería portable. En su lugar, utilizaremos técnicas que explicaremos detalladamente en siguentes partes de este artículo como el polimorfismo utilizando interfaces (básicamente utilizaremos interfaces definidas en nuestra librería portable para definir el código específico a implementar en cada plataforma, implementando la interfaz en el proyecto correspondiente a cada plataforma).
  • El código de interfaz (XAML) no es portable. Podemos utilizar otras técnicas para compartir código en la parte de UI como por ejemplo el enlazado de ficheros.
Portable Class Libraries

Portable Class Libraries

MVVM al rescate!

Sin duda las Portable Class Libraries nos permitirían unificar el código común de ambos proyectos en un mismo proyecto, una librería a la que haríamos referencia en cada proyecto Windows Phone. Sin embargo, tenemos varios problemas muy graves en nuestro código actual (podéis descargarlo desde el enlace facilitado previamente):

  • Tenemos la vista y la lógica de la aplicación totalmente acoplada. Si quitamos un evento Click de un botón nuestra interfaz se va a “quejar”.
  • Por otro lado, como ya hemos mencionado, en la Portable Class Library sólo podemos incluir código común y no específico de la plataforma. Ahora mismo la lógica de la aplicación es compartida pero no podríamos por este motivo trasladarla tampoco a la clase portable porque hay código específico (creación de tiles, recordatorios, etc.).

¿Solución?

MVVMMVVM llega al rescate. Para quien no lo conozca Model-View-ViewModel (MVVM) es un patrón de diseño de aplicaciones que permite desacoplar el código de interfaz de usuario del código que no sea de interfaz de usuario.

El patrón MVVM se compone de tres partes fundamentales:

  • La Vista: Define las vistas de la aplicación, es decir, conjunto de controles, layout, estilos, etc. Se nutre del vista-modelo utilizando su propiedad DataContext. Los controles se configuran mediante propiedades expuestas por el vista-modelo e interactuan mediante el uso de comandos.
  • El Vista-Modelo:Conjunto de clases que encapsulan la lógica de presentación. Implementa propiedades y comandos a los que se asociará la vista. Controla la interacción de la vista con el modelo.
  • El Modelo: Conjunto de clases que encapsulan los datos de la aplicación junto a su lógica de negocio. Validan el modelo de los datos aplicando reglas de negocio. El modelo suele implementar las interfaces INotifyPropertyChanged y INotifyCollectionChanged para notificar cambios en propiedades y colecciones. No deben referenciar a la vista ni al vista-modelo.

Proximamente…

En la segunda parte de la entrega llegamos con un claro objetivo en mente, utilizar el patrón MVVM en nuestro proyecto para lograr la base sólida necesaria para utilizar técnicas para compartir código. Sin duda será muy interesante, ¿te apuntas?.

Más información

4 pensamientos en “Windows Phone. Técnicas para compartir código. 1º Parte

  1. hace un mes me regalaron un nokia 610 viene con windows phone 7.1, asi los venden aca en chile, lamentablemente las aplicaciones requieren 7.5 o superior. he buscado bastante y no encuentro como actualizar por que no esta disponible la actualizacion desde zune aca.
    agradesco cualquier ayuda!

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