Angel "Java" Lopez

NET, Java, PHP y Desarrollo de Software

This Blog

Syndication

Search

Tags

Community

Email Notifications

Archives

.NET

ASP.NET

Windows Form

VB.NET

C#

Sitios

Blogs

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

Published Fri, Mar 12 2010 10:01 by lopez

Comments

# re: Modelos para Generación de Código en AjGenesis@ Friday, March 12, 2010 5:06 AM

De hecho, con un poco de maña podríamos tomar el texto de la Guerra y la Paz y extraer como entidades a Piotr, Andrei y María.

El modelo es un reflejo simplificado del mundo; la versión resumida que nos explica un aspecto de la realidad con los elementos que necesitamos para un fin particular.

Lo grandioso de ajGenesis es que permite usar cualquier modelo como input para generar otros modelos especulares.

Abrazo,

  su primo

Martin Salias

# re: Modelos para Generación de Código en AjGenesis@ Friday, March 12, 2010 1:44 PM

Angel, antes que nada felicitaciones por tu trabajo.

Para un cliente usé como 1er metamodelo su base de datos relacional, luego lo pase a un spreadsheet de google donde renombramos "entidades" y "propiedades" y luego con ajGenesis y un adaptador leí lo que estaba en google y generé clases .net.

Fue divertido hacerlo, ya que tocabamos en google y regenerabamos el modelo de dominio en 1 minuto :D.

Walter Poch

# AjGenesis y Language Workbench Competition 2011@ Friday, March 11, 2011 4:13 AM

La semana pasada, gracias a @pmolinam , encontré Language Workbench Competition 2011 Molina me había

Angel "Java" Lopez

# Generación de Código e Inteligencia Artificial@ Tuesday, May 31, 2011 5:28 AM

A finales de los setenta y principios de los ochenta (ya en el siglo pasado ;-)) estuve aprendiendo de

Angel "Java" Lopez

Leave a Comment

(required) 
(required) 
(optional)
(required) 
If you can't read this number refresh your screen
Enter the numbers above: