Mostrando entradas con la etiqueta español. Mostrar todas las entradas
Mostrando entradas con la etiqueta español. Mostrar todas las entradas

martes, 1 de octubre de 2019

MVVM con SQLite: modelo de solución

Cuando implementar algún patrón de diseño o un arquitectura que requiere cierta concentración y aprendizaje de mi parte, me gusta documentar el proceso para tenerlo como referencia en el futuro, y también para compartirlo con otros que quieran transitar el mismo camino.

En este caso, se trata de cómo apliqué el patrón Model-View-ViewModel junto con persistencia de datos SQLite, en mi aplicación móvil desarrollada con Xamarin Forms.

Me limitaré a enumerar lo pasos a alto nivel del proceso, que queda ilustrado en el diagrama de clases que acompaña el artículo. Cabe aclarar, que el diagrama sólo refleja aquellos atributos y comportamientos del modelo de clases que considero relevantes para la explicación, porque, claramente, el modelo completo es mucho más extenso.

Por un lado agregué una clase ExtendedBindableObject, que deriva de BindableObject, y agrega la notificación automática del evento PropertyChanged, cuando un ViewModel sufre algún cambio en sus propiedades expuestas.

De la clase ExtendedBindableObject, deriva BaseViewModel, que servirá de base para todas los ViewModels de cada objeto a representar.

El esquema de ViewModels en mi caso, hablando por ahora para objetos simples, consta de un ViewModel con una colección de objetos, otro para agregar nuevos objetos, y otro más para mostrar los detalles de un objeto dado, que además permite borrar o modificar sus atributos.

Para cada uno de los ViewModels detallados anteriormente, se corresponde un View, implementado dentro del modelo de Xamarin Forms como un ContentPage.

Al momento de crearse el View, se llama al constructor del ViewModel correspondiente, y se le pasa una nueva instancia del servicio CrudService (que implementa la interfaz ICrudService), que el ViewModel contiene. De este modo, se hace uso del patrón de inyección de dependencias (un caso particular del patrón inversión de control) indicando al ViewModel qué servicio utilizar para acceder a la capa de datos.

El servicio CrudService a su vez, se encarga de hacer las llamadas a la capa de datos, representada por la clase AppDatabase.

Esto es a grandes rasgos el cuadro completo necesario para implementar MVVM junto con SQLite. Tuve que invertir varias horas de lectura, y luego de pruebas, hasta dejarlo funcionando, pero me deja conforme estar alineado con las prácticas recomendadas.

Si se cumple luego la promesa de escalabilidad y crecimiento más limpio de la aplicación, que este patrón propone, el tiempo dirá.


sábado, 28 de septiembre de 2019

Workout.Me: Localización y Messaging Center


Fue realmente simple de implementar la localización.

Por el momento me limité a definir algunos strings en dos archivos de recursos, uno en inglés y otro en español.

Para probar el funcionamiento, agregué un ítem de menú en el Flyout para intercambiar entre idiomas, y desde allí se envía un mensaje multicast con el MessagingCenter:



Tan simple como ejecutar una línea de código:

MessagingCenter.Send<AppShell>(this, "LanguageChanged");

Y luego, desde cada clase que se desee, hay que suscribirse para recibir ese mensaje:

MessagingCenter.Subscribe<AppShell> (this, "LanguageChanged", (sender) =>
{
    //ApplyLanguage();
});


Muy limpio, efectivo, fácil de implementar. Hermoso.

domingo, 22 de septiembre de 2019

lunes, 16 de septiembre de 2019

Workout.Me - MVVM

Después de renegar un poco logré implementar un patrón MVVM simple. Una clase del modelo de dominio, un viewmodel, y una vista que hace referencia a éste en su BindingContext.

El ViewModel lo estoy derivando de un ViewModelBase, que a su vez derivo de ExtendedBindableObject. Esta última clase es la que se encarga de lanzar el evento PropertyChanged, que da aviso al View cuando se modifican las propiedades del ViewModel.

Por otro lado, la lista de objetos a mostrarse, el ViewModel la está obteniendo ahora de un servicio, que actualmente genera por código los ítems a mostrar.


Próximos pasos: obtener la lista de ítems accediendo a la capa de datos, y que ésta a su vez los recupere de una base local.

domingo, 15 de septiembre de 2019

Workout.Me - nuevo proyecto

Tal como había adelantado hace unos días, estoy comenzando con un proyecto nuevo, una aplicación móvil.

Por ahora la aplicación, salvo que se me ocurra o aparezca algo mejor, se llamará Workout.Me, y se trata de una herramienta con el objetivo primario de asistir en lo que a entrenamiento se refiere.

La idea es que cuente con varias opciones predefinidas para seleccionar, en cuanto a formas de entrenar, según los objetivos del usuario. Y mucha personalización.

A diferencia de proyectos anteriores donde busqué satisfacer en mayor o menor medida las espectativas del usuario final, en este caso ese usuario final soy yo. Obviamente que vengo repasando e investigando las principales opciones que actualmente hay en mercado, pero mi objetivo principal es que la app tenga todo aquello que busco y que actualmente no estoy encontrando en las aplicaciones disponibles.

El proyecto tiene objetivos múltiples. Por un lado, claro, está la aplicación propiamente dicha. Pero también el aprendizaje. Estoy aprediendo todo lo posible acerca de la tecnología Xamarin, aplicando patrones como MVVM, inyección de dependencias, skins, localización, etc.

Iré narrando los avances y novedades en la sección de blog, bajo la etiqueta workoutme.

Ah, este es el logo:


domingo, 8 de septiembre de 2019

Vuelta a la vida!

Después de largo tiempo sin actividad, y luego otro largo tiempo haciendo cosas pero sin publicarlas, vuelvo a darle vida a este blog.

Retomé el desarrollo de aplicaciones móviles.

Había estado unos cuantos meses avanzando con una aplicación android, en Android Studio, y terminé sumamente frustrado por lo dificultoso de lograr algo tan sencillo como compilar la aplicación. Las dependencias y los repositorios de donde se van descargando las mismas, que maven, que gradle, que integración continua, etc. Todo muy lindo salvo cuando estás atrás de un proxy corporativo que te filtra la mitad de internet, y que es imposible de configurar en la IDE.

Como mis pretensiones en cuanto a UI/UX eran modestas, decidí ir por lo seguro y me pasé a Xamarin.Forms. El viejo y conocido Visual Studio, además de no comerse viva la RAM del equipo, es mucho más llevadero de configurar y sacar andando lo que sea.

A la par de esto, quiero retomar también el desarrollo de juegos, y no estoy seguro de qué plataforma será. Quizás Unity, quizás monogame. Veremos.

Próximamente habrá más noticias y avances.


miércoles, 14 de marzo de 2018

Checklist para desarrollo de aplicaciones móviles

He ido repasando diversas recomendaciones de desarrolladores y estudios sobre la industria, y confeccioné esta lista de lo que se debería tener en cuenta al momento de construir una aplicación mobile. Sobre todo si se realiza en forma individual, conviene tener presentes todas estas etapas o hitos, para no dejar nada al azar.



Pasos imprescindibles y convenientes en el desarrollo de aplicaciones móviles:

* DESCRIBIR LA APLICACION
- Qué propósito cumple? Para qué va a servir? Qué necesidades cubre? Qué problemas soluciona?
- Qué tipo de usuarios van a utilizarla?

* SETUP DE REPOSITORIO

* LISTAR REQUERIMIENTOS
- Conformarán el backlog inicial.
- Dejar solo el MVP (Minimum Value Product), quitar todas las funcionalidades que no sean core.
- Sobre la idea o concepto de la app, mirar lo que ya hicieron otros, y ver cómo se podría hacer mejor, más intuitivo, más fácil para el usuario.
- De las funcionalidades y casos de uso, extraer:
- Qué información se va a mostrar al usuario, qué se guardará, cómo se guardará (input para el diseño de base de datos)
- Cómo se va mostrar y agrupar esa información (input para el diseño de pantallas, fragmentos)

* MARKETING (todo el proyecto)
- Crear una landing page. Linkearla desde el app store. Incluir videos, texto de contenido, FAQs, íconos, screenshots, links a todos los stores, códigos QR, links a todas las redes sociales, reviews de usuarios, press kit, etc.
- El landing page debe tener formulario de contacto.
- Configurar redes sociales.
- SEO and app store optimization (ASO)

* BOCETO Y DISEÑO
- Boceto rápido de la estructura y pantallas.
- Especificar los casos de uso de acuerdo a los requerimientos, el flujo de navegación.
- Buscar minimizar la cantidad de gestos o acciones requeridos para las tareas más comunes.
- En papel o herramienta de diagramas.
- Ver templates de apps mobile. Ver apps similares publicadas. Ver qué funciona y qué no.
- Definir qué datos se muestran y se capturan en cada pantalla, y qué datos van de una pantalla a la siguiente.
- Presentar diferentes layouts para cada pantalla. Compararlos, pedir feedback.

* TESTING (todo el proyecto)
    - compatibilidad: probar distintos dispositivos y tamaños de pantalla.
    - interfaz y experiencia de usuario: navegación, flujo, gestos, performance.
    - bajos recursos: probar la app con baja batería, sin señal, etc.
    - seguridad: asegurar la calidad de la integridad, disponibilidad y confidencialidad de los datos de usuario.
    - prueba beta: liberación temprana a un grupo de usuarios para obtener feedback.

* BASE DE DATOS
- Diseñar la base de datos. Qué se va a guardar (local al dispositivo)

* SETUP DE BACKEND
  - APIs, servers y base de datos (en servidor)

* DESARROLLAR PROTOTIPO EJECUTABLE
- Prototipar la estructura en entorno de desarrollo.
- La navegación y experiencia de usuario deben ser fluidas y cómodas.
- El diseño debe ser consistente de pantalla a pantalla, y respetar los estándares de la industria. Ubicación del action bar, botones, etc.
- Agregar validación de datos

* PERSISTENCIA
Acabar el manejo de base de datos. Parametrización, configuración y opciones.

* AJUSTES
Identificación de problemas, refinamiento de detalles de requerimientos y retroalimentación del backlog.

* COMPATIBILIDAD
- Agregar soporte para varias resoluciones y versiones de OS.

* ESTETICA
- Temas, skins y mejoras visuales. Best Practices.

* ESTADISTICAS
- Integrar Analytics.

* UPDATES
- Revisar user feedback y mejorar la app.
- Agregar funcionalidades postergadas.

* LANZAMIENTO
- Tener preparadas para la fecha de lanzamiento Screenshots, imágenes promocionales, descripción, keywords, presskit, videos.
- Analizar con cuidado fecha y hora en que conviene lanzar, e ir anunciándolo en redes con anticipación.
- Publicar en todas las tiendas online al mismo tiempo.
- Actualizar el landing page.


lunes, 5 de diciembre de 2016

#WorldOfCraxs Generador de niveles


En los últimos días he estado desarrollando un generador de niveles, para poder importar archivos TMX (creados con Tiled) a la escena en Unity en forma de prefabs.

martes, 4 de octubre de 2016