Generación de código con AjGenesis en un proyecto real

Published on Author lopez3 Comments

El año pasado, me uní un equipo de desarrollo en un proyecto privado. La solución inicial era una aplicación Web VB.NET, que estaban escribiendo, con proyectos de librerías de clases, usando el  Mere Mortals Framework. El equipo había escrito varias páginas webs (y algunos formularios WinForm), cubriendo algunos casos de usos sencillos que se estaban comenzando a implementar. La base de datos era (y es) SQL Server 2008. No es un proyecto público, así que puedo entrar en mayores detalles, pero puedo escribir en rasgos generales sobre la historia del desarrollo.

Había ya varias entidades en el dominio, y se venían más. Para cada entidad, había que escribir muchos archivos: las clases de Mere Mortal framework, sus clases de validación, de acceso a datos, los comandos DDL de la base, procedimientos almacenados, páginas web iniciales, etc. Entonces, comencé a migrar la solución a generación de código, usando mi proyecto de generación de código AjGenesis (mi proyecto favorito :-). Pueden leer algo de esa experiencia en

Code generation for Mere Mortals Framework
Generación de código para Mere Mortals Framework

Esto es lo que llamo: “ajgenetizar” una aplicación. Dada una solución andando, elevar el nivel de abstracción, descubrir las abstracciones que necesitamos para modelar el sistema en construcción, encontrar el código similar repetitivo, las partes que sí tenemos que escribir manualmente, y entonces, poner todo es en el proceso de generación de código. El código generado debe reflejar una solución preexistente: debe ser código del que uno esté orgulloso.

El modelo inicial fue obtenido desde la base de datos. Como escribí en otros posts, esto no es el modelo ideal. Pero fue una decisión pragmática. Escribí hace un tiempo:

AjGenesis – Generating the model from the database
AjGenesis – Generando el modelo desde la base de datos
Generating a Model from the Database using AjGenesis
Generando un modelo desde la base de datos usando AjGenesis
Models for Code Generation in AjGenesis
Modelos para la generación de código en AjGenesis

Despues de obtener una solución andando, que podíamos extender manualmente o automáticamente agregando más al “modelo” de la base, fuimos migrando a un modelo abstracto. Entonces, despues de unas semanas usando la base de datos como modelo inicial, la propia base de datos comenzó a generarse desde el nuevo modelo abstracto, y la dirección del proceso fue en reverso! Ahora, cada entidad es agregada al modelo abstracto, y cualquier idea nueva de implementación puede agregarse a los templates y tareas de generación. Mucho de los artefactos de texto (clases, archivos de configuración, comando de la base de datos, proyectos, páginas web) son generados por el proceso de generación de código.

Este año, migré los templates para remover el framework Mere Mortals, usando ahora nuestro propio acceso a datos, relaciones una a varios, lazy loading, identity map, cache de otros datos, validación, StructureMap como contenedor de Inversion of Control, interfaces para abstracciones que fuimos descubriendo, services layers, etc… La parte interesante es que pudimos cambiar gran parte de la infraestructura de una solución a otra, pero sin mucho esfuerzo. Ya habíamos empezado a trabajar con service layer, en vez de ir directamente contra el framework MereMortals, y eso facilitió varias partes de la migración. Las partes manuales fueron pasadas a la nueva solución, pero el modelo es todavía el mismo modelo abstracto, serializado en XML, que teníamos antes. Y si necesitamos adoptar un ORM, si elegimos ese camino, podemos cambiar la generación para soportar eso, tenemos varios tests (no diría unitarios) que soportan el detectar cualquier cambio erróneo que tenemos. O podemos adoptar ASP.NET MVC2, u otra solución para diferentes problemas (persistencia, validaciones, tests, presentación, etc..)

Y, estoy seguro que el modelo podría ser usado para generar el núcleo de la aplicación en otra tecnología o lenguaje. No es un requerimiento de este proyecto. Pero es una especie de “prueba ácida” para nuestro modelo abstracto: si necesitáramos cambiar de base de datos, o de lenguaje de implementación, o alguna tecnología, todo está en su lugar listo para adoptar el cambio. Incluso, lo aprendido puede servir como base para otros proyectos.

Cada semana, el equipo está agregando nuevas entidades en el dominio, al avanzar en la implementación de las historias planteadas. Y se han podido ir agregando en el modelo abstracto: muchas de las “technicalities” (crear tablas e índices, procedimientos almacenados, métodos de acceso a datos, relaciones en código, etc… ) son generadas automáticamente. Y lo manual está claramente delimitado. El equipo, entonces, puede poner su esfuerzo y foco en la lógica del dominio y en los detalles de presentación.

Para mí, ha sido una prueba del poder de la generación de código desde un modelo: no es sólo generación de código. El punto clave es tener un modelo que nos ayude a representar la solución que estamos armado, separando problemas (persistencia) de soluciones técnicas (MereMortals, ADO.NET o algún ORM). Y tenemos la opción de cambiar y mejorar lo que estamos generando para el proyecto.

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Leave a Reply

Your email address will not be published. Required fields are marked *