José F. Romaniello

Las aventuras y desventuras de un codificador.

Hace poco tiempo desarrollé un cliente de sincronización basado en Microsoft Sync Framework. En unas pocas líneas:

Microsoft Sync Framework es una completa plataforma de sincronización que habilita la colaboración y el acceso sin conexión para las aplicaciones, servicios y dispositivos. Sync Framework ofrece las tecnologías y herramientas que habilitan la movilidad y el uso compartido de los datos, además de permitir poner los datos fuera de conexión. (...)
Actualmente, en lo que a bases de datos se refiere, el framework viene con una implementación para la parte del servidor basado en Sql Server y una de cliente Sql CE, pero permite ser extendido en este sentido a casi cualquier motor de base de datos, tanto en la parte cliente como en la parte servidora. En el proyecto que estaba trabajando Sql CE no era una opción, por lo cual vi la necesidad de implementar un cliente para Sqlite utilizando el proveedor de Ado.net System.Data.Sqlite. El proyecto esta publicado de forma open source. Puede ser descargado de la siguiente dirección: http://sourceforge.net/projects/sqliteclientsyn/. Para desarrollar y probar la librería me he basado en los ejemplos de Sync Guru. El cambio es bastante trivial:
  1. Quitar las referencias a System.Data.SqlServerCE y Microsoft.Synchronization.Data.SqlServerCe.
  2. Agregar las referencias a System.Data.Sqlite y SQLiteSync.
  3. Reemplazar todas las llamadas a clases como SqlCeConnection, SqlCECommand, etc por su respectiva SQLiteConnection, SQLiteCommand, etc.
  4. Reemplazar SqlCeClientSyncProvider por SqliteClientSyncProvider.
  5. No es muy importante, pero es aconsejable, modificar la extensión del archivo de la base de datos en la cadena de conexión.
Con estos simples pasos cualquier ejemplo debería funcionar correctamente.

| More

Al menos es lo que yo pienso. Pero es algo complicado, al 50% de la gente le desagrada totalmente, a tal punto de no poder olerlo.

| More

Un par de meses despues de asistir al curso que dicto el Sr Juan Gabardini dictado por el Inti, sobre Scrum, y luego de haber investigado acerca de ello hemos empezado un proyecto nuevo con estas ideas (a saber TDD, reuniones, y todo el checklist de scrum). Mi rol por el momento es el de Scrum Master, desde mi punto de vista trabajar de esta forma da como un cierto incentivo al grupo. Creo que una de las cosas que mas llamo la atención, fue lo referido al Sprint Backlog; el discurso fue el siguiente:

Yo no voy a asignar las tareas del Sprint Backlog, simplemente estan en la pizarra, y cada cual debe elegir lo que TENGA GANAS de hacer. En lo que a mi respecta, espero y deseo que el trabajo que hagan les guste.
Y esta es la implementación;

| More

Esta es una idea de arquitectura que me gusta. Algunas cosas que yo considero no existen antes de empezar:

  • Soluciones mágicas ni herramientas que lo hacen todo. Olvidate de construir una aplicación empresarial con esto o algo como esto.
  • Una arquitectura que funcione bien para todos los casos.
  • Una herramienta que sea una bala de plata para resolver cualquier problema.
Sin embargo, es posible:
  • Construir aplicaciones a partir de modelos probados
  • Construir software sencillo, escalable y mantenible.
  • Crear software de calidad.
  • Disminuir fricciones que existen en el desarrollo de software.
  • Hacer las cosas bien.
La arquitectura básica que voy a explicar, es la siguiente: Modelo El modelo es lo que hace a la aplicación ser lo que es. Como ejemplo he agregado dos componentes; entidades y servicios. Entidades Las entidades representan las clases de objetos que intervienen en el dominio de nuestro problema. Describen de cierta manera el lenguaje que utilizara nuestra aplicación. Entonces, si en nuestra aplicación intervienen caballos, seguramente tendremos como entidad una clase caballo, lo mismo con facturas, etc. La mayoría de las veces hablamos de objetos con significado en el mundo real artículos, comprobantes de compra, etc. Dichas entidades usualmente tienen varias propiedades como por ejemplo Código, Descripción, Cantidad, Precio, etc. Las propiedades pueden ser de diferentes tipos:
  • Tipos básicos del lenguaje de programación, ej: int, string, float, etc.
  • Entidades; ej: la clase factura podría tener una propiedad Cliente que a su vez es del tipo Cliente.
  • Colecciones de entidades; ej: la clase factura podría tener una propiedad Lineas, que es una colección genérica, tipo IList .
Además de propiedades poseen métodos que implementan lógica de negocio. Un método de la clase Factura, podría ser CalcularNeto. Lo que es importante mencionar en este punto, es que bajo ningún punto de vista tenemos que pensar una entidad como una tabla o un registro de la base de datos, simplemente es algo mas complejo pero mas aproximado a la realidad. Por otro lado, es preciso que las entidades sean POCO o POJO, es decir, clases simples que no implementen interfaces complejas ni estén fuertemente ligadas a un framework en particular. De esta manera son fáciles de mantener, usar y entender. Con lo cual "YO" descartaría completamente la idea de Datasets Tipados y hasta en cierto punto a la propia nueva herramienta de Microsoft, Entity Framework. (Ya lo se, tienen un bonito editor y buen soporte técnico.) Servicios Los servicios son objetos que llevan a cabo cierta funcionalidad del sistema. En estos casos la funcionalidad que implementan es demasiado compleja y en algunos casos depende de componentes externos a nuestro sistema, por lo cual resulta inapropiado embeberla en las entidades. Un ejemplo de servicio, podría ser ValidadorDeOrdenesCompra. Interfaz La interfaz de usuario le permite al usuario interactuar con el dominio de la aplicación. El patrón MVC es muy recomendable en sistemas de nivel empresarial. Básicamente, tenemos 3 componentes interactuando entre si:
  • Modelo: es lo que se explico previamente, intervienen entidades y servicios.
  • Vista: Se encarga solamente de mostrar y capturar los datos de la interfaz gráfica.
  • Controlador: Es quien manejar el flujo de la interfaz de usuario, por ejemplo: toma datos del Modelo y se los asigna a la Vista, toma los datos que la Vista capturo y llama a métodos del Modelo para persistir los datos.
Repositorios En este nivel nos encontramos con funcionalidad para almacenar y recuperar las Entidades del dominio. A simple vista se podría pensar directamente en una base de datos (DAO), pero también existen otras clases de repositorios y me permití mencionar un repositorio que obtenga Entidades de mi dominio desde un webservice. DAO Un DAO, Data Access Object, posee la funcionalidad necesaria para guardar y recuperar las Entidades en una base de datos. En el objeto DAO se encapsula la funcionalidad para interactuar con la base de datos. Cada DAO, se encargará de solo una entidad, pero es posible que existan entidades sin su correspondiente DAO (simplemente no necesitan ser almacenadas). Así, la interfaz de una clase dao para una entidad Factura podría contener los siguientes métodos:
  • ObtenerPorNumero(NroFactura) as Factura
  • ObtenerTodos() as IList
  • ObtenerPorMes(Mes) as IList
  • Guardar(Factura)
  • Eliminar(Factura)
Lo que es importante destacar es que hasta esta clase llega todo lo relacionado a la base de datos. Es bastante inapropiado tener instrucciones SQL o referencias a objetos ADO.Net fuera de aquí. En otro momento voy a escribir un post dedicado exclusivamente a objetos DAO y como simplificar esto mediante ORM. Para terminar En proximos post voy a detallar en mayor medida cada uno de los componentes de esta arquitectura. Por otra parte, quisiera dejar algunas referencias: Parte de esta arquitectura esta basada en este artículo: NHibernate Best Practices with ASP.NET, 1.2nd Ed. Ayende Rahien: http://ayende.com/ Jeffrey Palermo: http://jeffreypalermo.com/ Deja tu comentario, saludos!

| More

Para dar una idea general, este blog tratará sobre programación en .Net Framework con integra relación en aspectos de arquitectura. Actualmente me encuentro trabajando en un proyecto Open Source sobre el cual se basará mi segundo post llamado Sqlite Client Sync Provider. También estoy involucrado en el desarrollo de un ERP, utilizando .Net Framework 3.5, Sql Server, Nhibernate, Asp.Net.. y otras herramientas sobre las cuales iré publicando. Espero mediante este blog hacer llegar a mis colegas buen material. Eso es todo por hoy! Hasta la próxima entrada!

| More