Una práctica fundamental en la Generacón Automática de Código es la Preservación del Código No Generado. En otras palabras que entre un ciclo de generación y el siguiente no perdamos el código que hayamos escrito manualmente.

Para esto AjGenesis prevee un mecanismo muy sencillo y seguro.

Este se basa en pequeñas modificaciones a los archivos .ajg y los Templates dónde exista código que se quiera preservar.

Para ejemplificar vamos a seguir con nuestro ejemplo del post anterior sobre AjGenesis, el ignoto SyP.

Comenzamos con el archivo BuildVbNet2.ajg. Como ya vimos en estos archivos se define cómo aplicar los Templates, precisamente con los comandos AjBasic TransformerManager.Transform. En los TransformerManager.Transform que generan archivos que contienen código que hayamos generado manualmente y no queremos perder, tendremos que agregar un parámetro en su invocación. Este parámetro es un string que define la palabra clave que el AjGenesis entenderá que delimita los bloques de código que se pretenden preservar, en el ejemplo este argumento será PRESERVE, pero podría ser cualquier otro String.

Nosotros vamos a suponer que en el SyP vamos a necesitar preservar código en todos sus archivos .vb

Tomo cómo ejemplo el primer TransformerManager.Transform que genera un archivo .vb que encuentro en BuildVbNet2.ajg:

TransformerManager.Transform(“Templates/VbNet2/HomeAspxVb.tpl”,”${Project.BuildDir}/Src/${Project.Name}.WebClient/Default.aspx.vb”,Environment)

y quedará:

TransformerManager.Transform(“Templates/VbNet2/HomeAspxVb.tpl”,”${Project.BuildDir}/Src/${Project.Name}.WebClient/Default.aspx.vb”,Environment,”PRESERVE”)

SI el parámetro existe y luego no se usa no es problema.

En cada archivo donde se quiera preservar código se debera definir en que lugar quedará alojado, esto se realiza ubicando dos Comentarios PRESERVE,

‘ PRESERVE

……….

‘ PRESERVE

todo el código contenido entre estos dos Comentarios se preservará a través de las sucesivas generaciones.

A continuación de la palabra clave se puede escibir lo que se necesite para hacer claro el código. En este ejemplo defino dos bloques de preservación de código, uno al comienzo y otro al final del archivo. Ambos bloques quedan definidos con los siguientes dos pares de Comentarios:

‘ PRESERVE 1

‘ PRESERVE

y

‘ PRESERVE 2

‘ PRESERVE

 El 1 y el 2 son capricosos, podría haber escrito cualquier otra cosa que los diferencie.

En el ejemplo, por una razón de claridad en el código, prefiero usarlo así.

‘ PRESERVE 1 comment start

‘ PRESERVE 1 comment end

y

‘ PRESERVE 2 comment start

‘ PRESERVE 2 comment end

Lo que trae problemas es no diferenciar los bloques, como en el siguiente ejemplo;

‘ PRESERVE

‘ PRESERVE

y

‘ PRESERVE

‘ PRESERVE

Ahora, si estás trabajando con un sólo bloque de código, no hay problema en que se use así:

‘ PRESERVE

‘ PRESERVE

pero tiene que ser un sólo bloque a preservar.

Para que esto quede establecido, tengo que agregar estas lineas en cada Template dónde quiera que se apliquen y este es todo el trabajo.

Es importante destacar que si se define un bloque PRESERVE en un archivo cualquiera, pero no se define en su correspondiente Template este bloque no se preservará y se perderá con sus Comentarios PRESERVE incluidos.

El código de ejemplo pueden descargarlo desde acá SyPP.zip, ahora a generar escribir y volvera regenerar sin caer en ataque de pánico.

Espero sus comentarios.🙂