Armando una aplicación usando AjGenesis (Parte 3)

Published on Author lopezLeave a comment

Tercera parte de esta serie de posts tutoriales, sobre cómo armar una aplicación usando AjGenesis, mi proyecto open source de generación de código. Anteriores posts:

Building An Application Using AjGenesis (Part 1)
Armando una Aplicación usando AjGenesis (Parte 1)
Building An Application Using AjGenesis (Part 2)
Armando una Aplicación usando AjGenesis (Parte 2)

El código de este post puede bajarse de from AppExampleStep03.zip.

Se necesitan los últimos binarios de AjGenesis. Los pueden bajar desde AjGenesisTrunkBinaries.zip. (el código fuente estáa en el repositorio de AjGenesis en Codeplex). Hay que agregar el directorio bin al path, para ejecutar los ejemplos de este post.

Esta vez, mejoré el código del proceso de generación. El comando GenerateClasses.cmd:

AjGenesis.Console Project.xml CompleteModelCSharp.ajg GenerateClasses.ajg

tienen un nuevo parámetro: una tarea intermedia a ejecutar, CompleteModelCSharp.ajg:

' Some functions
' Name to use for variables
function CSharpVariableName(name)
  firstletter = name.Substring(0,1)
  
  return firstletter.ToLower() & name.Substring(1)
end function
' Name to use for Classes, Properties..
function CSharpName(name)
  firstletter = name.Substring(0,1)
  
  return firstletter.ToUpper() & name.Substring(1)
end function
function CSharpType(type)
  type = type.ToLower()
  
  if type="text" then
    return "string"
  end if
  
  if type="integer" then
    return "int"
  end if
  
  return type
end function
' Set namespace to use in CSharp code
if not Project.CSharp.Namespace then
  Project.CSharp.Namespace = CSharpName(Project.Name)
end if
' Complete Entities
for each Entity in Project.Model.Entities
  ' Set the variable name to use for an entity
  if not Entity.CSharp.VariableName then
    Entity.CSharp.VariableName = CSharpVariableName(Entity.Name)
  end if
  
  for each Property in Entity.Properties
    ' Set the CSharp to use in each property
    if not Property.CSharp.Type then
      Property.CSharp.Type = CSharpType(Property.Type)
    end if
  end for
end for

Lo nuevo: definición de funciones, el uso de métodos .NET como .ToUpper(), y completar el modelo, como en:

if not Project.CSharp.Namespace then
  Project.CSharp.Namespace = CSharpName(Project.Name)
end if

Estoy agregando propiedades al modelo en memoria. Si no hemos especificado el namespace a usar, se crea uno. Noten que si Project.CSharp.Namespace no est’a definido, y Project.CSharp no existe, está en nulo, no aparece exception: un indefinido O.A.B. se evalúa a null, nothing, y eso se toma como falso en AjBasic (he tomado esa estrategia de PHP).

Entonces, el código de arriba enriquece el modelo a usar, tomando decisiones relacionadas, en este caso, con C#. En próximos post, escribiré código similar para otras tecnologías. Pero vale la pena mencionar que de esta manera podemos escribir un modelo independiente de la tecnología, y luego, cuando la tecnología se elija (en este caso, el lenguaje de programación, pero podría ser también la base de datos, o la tecnología de presentación), podemos enriquecer el modelo con la información más técnica.

Este es el fragmento que en el código de arriba agregar un tipo C# a una propiedad, basado en su tipo abstracto:

  for each Property in Entity.Properties
    ' Set the CSharp to use in each property
    if not Property.CSharp.Type then
      Property.CSharp.Type = CSharpType(Property.Type)
    end if
  end for

La segunda tarea a ejecutar en el comando mencionado, es la misma que en el anterior post, GenerateClasses.ajg:

for each Entity in Project.Model.Entities
  TransformerManager.Transform("EntityClass.tpl", "${Entity.Name}.cs", Environment)
end for

El template EntityClass.tpl:

// Entity Class, generated with AjGenesis (http://ajgenesis.codeplex.com)
namespace ${Project.CSharp.Namespace} {
  public class ${Entity.Name}
  {
<#
  for each Property in Entity.Properties
#>
    public ${Property.CSharp.Type} ${Property.Name} { get; set; }
<#
  end for
#>
  }
}

ahora usa las nuevas propiedades del modelo.

Este es el Customer.cs generado:

// Entity Class, generated with AjGenesis (http://ajgenesis.codeplex.com)
namespace AjApp {
public class Customer
  {
    public string Name { get; set; }
    public string Address { get; set; }
  }
}

Próximos pasos: escribir más tareas y templates para generar, desde el mismo modelo, código Java y VB.NET.

Como en los anteriores posts de la series, les recuerdo que ésta es una serie tutorial. En el desarrollo real, prefiero adoptar otra manera de armar la generación de código, que describí en los posts:

AjGenetizing An Application

AjGenetizando una Aplicación

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 *