Modelos para Generación de Código en AjGenesis

Quisiera hoy enumerar y pasar una corta revista a las opciones que tenemos para escribir, describir un modelo en  AjGenesis, mi proyecto open source de generación de códgio.

Una de las ideas básicas de AjGenesis es tener un modelo de libre definición, como punto de partida. No es un modelo fijo. ¿Qué significa esto? Que podemos crear y usar nuestro propio modelo. Veamos un ejemplo concreto. Si quisiéramos modelar una clásica aplicación "Hello, World”, podemos comenzar escribiendo un modelo simple como el siguiente:

<Project Company="ajlopez.com">
   <Message>Hello, World</Message>
</Project>


Y si queremos tener múltiples mensajes, lo extendemos en cualquier momento a:



<Project>
    <Messages>
        <Message>Hello, World One</Message>
        <Message>Hello, World Two</Message>
        <Message>Hello, World Three</Message>
    </Messages>
</Project>


Más información sobre este ejemplo sencillo en A Hello World Application in AjGenesis. (Generando Código: Hello World con AjGenesis).



Pero XML no sólo una de las versiones SERIALIZADAS de un modelo (el modelo es abstracto, AjGenesis lo maneja en memoria, y lo recupera desde donde lo digamos, en las primeras versiones, sólo de XML). En la versión del trunk podemos escribir y usar el modelo serializado como texto:



Project
    Messages
        Message = "Hello, World One"
        Message = "Hello, World Two"
        Message = "Hello, World Three"
    End Messages
End Project


Más información sobre modelos textuales en



Textual Model for Code Generation in AjGenesis


Modelo textual para generación de código con AjGenesis



Si queremos describir una Entidad en una especie de modelo de dominio, podemos escribir algo como este XML de libre formato:



<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<Entity>
    <Name>Employee</Name>
    <Description>Employee</Description>
    <SetName>Employees</SetName>
    <Descriptor>Employee</Descriptor>
    <SetDescriptor>Employees</SetDescriptor>
    <SqlTable>employees</SqlTable>
    <Properties>
        <Property>
            <Name>Id</Name>
            <Description>Id</Description>
            <Type>Id</Type>
            <SqlType>int</SqlType>
        </Property>
        <Property>
            <Name>EmployeeCode</Name>
            <Description>Code</Description>
            <Type>Text</Type>
            <SqlType>varchar(20)</SqlType>
        </Property>
        <Property>
            <Name>LastName</Name>
            <Description>Last Name</Description>
            <Type>Text</Type>
            <SqlType>varchar(100)</SqlType>
        </Property>
        <Property>
            <Name>FirstName</Name>
            <Description>First Name</Description>
            <Type>Text</Type>
            <SqlType>varchar(100)</SqlType>
        </Property>
        <Property>
            <Name>IdDepartment</Name>
            <Description>Department</Description>
            <Type>IdRef</Type>
            <SqlType>int</SqlType>
            <Reference>Department</Reference>
        </Property>
    </Properties>
</Entity>


Más detalles del uso de un modelo como éste en Application Generation using AjGenesis. (Generando aplicaciones con AjGenesis).



Pero si leer XML nos hace doler los ojos, podemos volver a escribir el mismo modelo en forma textual. El ejemplo de arriba, abreviado:



Entity Employee
    Description = "Employee"
    SetName = "Employees"
    ...
    Properties
        Property Id
            ...
        End Property
            ...
        Property Name
        End Property
    End Properties
End Entity


 



No lo implementé, pero quiero agregar hojas de cálculo como modelos:





Escribí sobre eso en: Another Model for AjGenesis (Otro modelo para AjGenesis).



Pero a veces, queremos usar algo ya existente como fuente de nuestro modelo. Y con AjGenesis, podemos! Una de las más “populares” fuentes de seudo-modelos es la base de datos misma. En mi opinión, la base de datos no es el modelo ideal, pero, dependiendo del proyecto y de nuestras necesidades, puede ser una solución pragmática (recordemos, AjGenesis y generación de código son soluciones pragmáticas a algunos problemas en el desarrollo de software), así que no dudemos en adoptar fuentes convenientes, sólo hay que estar advertidos de sus limitaciones.



Escribi algún ejemplo en: Generating a Model From the Database Using AjGenesis (Generando un modelo desde la base de datos usando AjGenesis) y en AjGenesis: Generating the Model from the Database (AjGenesis: Modelo desde la base de datos).



AjGenesis nació y fue diseñado para sobrevivir al “fashion development”: no está orientado a una tecnología en particular, a una plataforma, framework, lenguaje determinado. Puede generar cualquier cosa que se un artefacto de texto (y yo diría que más): Java, C#, VB.NET, PHP, archivos de configuración, XML, scripts de base de datos, aún COBOL. Podemos escribir tareas, plantillas y lo que queramos generar, en cualquier momento. Podemos empezar en pequeño, e ir creciendo, agregando más abstraciones y transformaciones. Pero tareas y templates son temas que merecen otro post. Dicho esto, podemos usar como modelo un proyecto complilado. Como ejemplo, escribí sobre el trabajo de Dario Quintana usando .NET y Reflection en at:



AjGenesis: Generating the model from assemblies
AjGenesis: Modelo generado desde los assemblies



En el mundo Java, se acostumbra a generar código desde anotaciones en el propio código (mencionaría como ejemplo al venerable XDocLet). O desde archivos de configuración, la gente de Hibernate tiene hbm2java. NHibernate, la más popular librería open source de Object Relational Mapping en el mundo .NET, no tiene esas herramientas. Como en Java, AjGenesis puede usar los tags meta que se agregab a los archivos de mapeo .hbm, para usarlos en la generación de código. Vean:



Generating Code with AjGenesis using NHibernate Hbm Mapping Files
Generando código con AjGenesis usando archivos de mapeo de NHibernate



(Tengo un ejemplo más completo en el trunk actual, que genera una solución completa en ASP.NET y NHibernate).



Pueden bajarse el proyecto desde el trunk de código en:



http://www.codeplex.com/ajgenesis



Próximos tópicos: tareas, plantillas, abstracciones vs “technicalities”, modelos en memoria, transformaciones modelo a modelo, completando el modelo, tomando decisiones, sistemas expertos e inteligencia artificial aplicada a la generación de código y AjGenesis.



Nos leemos!



Angel "Java" Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

This entry was posted in 12677, 2643, 3463, 5124, 6145. Bookmark the permalink.

Leave a Reply

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


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>