domingo, 5 de janeiro de 2014

Geradores de Código em Java - Otimize seu tempo, Economize Dinheiro e Melhore sua Qualidade - Parte 5

Comentários para Colunas Chave Estrangeira


O comentário para coluna chave estrangeira obedece a seguinte estrutura <NOME_ATRIBUTO_JAVA>:<NOME_NA_TELA>:<OPERADOR_PESQUISA>:<CAMPO_MOSTRADO_NA_COMBO>:<TIPO_COMBO_OU_LUPA>:<REPORT>:<TABELA_AUTOCOMPLETE>, em que:
  • NOME_TABELA - é o nome da tabela no banco de dados;
  • NOME_COLUNA - é o nome da coluna;
  • NOME_ATRIBUTO_JAVA - é o nome que será usado como atributo no Java;
  • NOME_NA_TELA - é o nome que será apresentado nas telas do Sistema;
  • OPERADOR_PESQUISA - é o operador de pesquisa desejado
  • CAMPO_MOSTRADO_NA_COMBO - campo mostrado na combo
  • TIPO_COMBO_OU_LUPA - deve ser informado o tipo de relacionamento com a tabela relacionada. Os valores podem ser combo ou lupa.

No exemplo mostrado abaixo é apresentado um tipo combo gerado a partir do comentários “projeto:Projeto:=:descricao:combo”.

 Ilustração 9: Campo Gerado para Coluna Chave Estrangeira

Exemplo de Código Gerado

Uma vez criado o template, todos os códigos serão gerados da mesma forma e sem erros, e qualquer alteração ou evolução pode ser feita no template e isto permitirá que os novos códigos gerados sigam o novo padrão. Abaixo é mostrado parte de um código gerado.

package gov.tjpr.gen.entity;

import gov.tjpr.entity.PersistableEntity;
import javax.persistence.*;
import java.text.Normalizer;
import java.util.Date;

@Entity
@Table(name="tbatividade", schema="public")

@SequenceGenerator(name = "SEQUENCE", sequenceName="public.tbatividade_idatividade_seq", allocationSize=1)
public class Atividade implements PersistableEntity<Integer>{

private static final long serialVersionUID = 1L;

@ManyToOne
@JoinColumn(name = "idprojeto")
private Projeto projeto;
@ManyToOne
@JoinColumn(name = "idrecurso")
private Recurso recurso;
@ManyToOne
@JoinColumn(name = "idtipoatividade")
private TipoAtividade tipoAtividade;
@Column(name="data")
private Date data;
@Column(name="qtdhora")
private Double qtdHora;
@Column(name="descricao")
private String descricao;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQUENCE")
@Column(name="idatividade")
private Integer id;
// GETTERS AND SETTERS
...
}

Quadro 3: Exemplo de Código Gerado a partir do Banco de Dados e Template

Considerações finais

Conclui-se que a geração de código permite diminuir muito o tempo de desenvolvimento, melhorar a qualidade do software, reservar tempo para atividades mais nobres e desafiadoras, padronizar o código e diminuir a curva de conhecimento de novos funcionários. Todos estes elementos contribuem para a diminuição de custos e tempo de entregas de projetos dentro das empresas.
Um gerador de código customizado vai ao encontro das tecnologias legadas e novas de uma grande empresa permitindo independência em relação a um fornecedor, diminuindo os custos de aquisição e treinamento caso fosse adquirido um gerador de mercado.
Além disso, a estrutura genérica de classes apresentadas, são de livre acesso e sem custos, com funcionalidades bem definidas que são suficientes para gerar códigos muito sofisticados como apresentados neste trabalho.

Referências bibliográficas

AMBLER, S.W. Mapping Objects to Relational Databases. An AmbySoft Whitepaper. AmbySoft Inc. 1997. Disponível em: <http://www.agiledata.org/essays/mappingObjects.html>. Acesso em: 24 abril 2012.

AMBLER, Scott. Agile Modeling: Effective Practices for eXtreme Programming and
the Unified Process. WILEY COMPUTER PUBLISHING, 2002.

HERRINGTON, Jack. Code Generation in Action. MANNING, 2003.

SCHVEPE, CLAUDIO. GERADOR DE CÓDIGO JAVA A PARTIR DE ARQUIVOS DO ORACLE FORMS 6I. 2006. Trabalho de Conclusão de Curso de Ciência da Computação, Universidade Regional de Blumenau, Blumenau. Disponível em: <http://www.bc.furb.br/docs/MO/2008/330687_1_1.PDF>. Acesso em: 29 março 2012.

Geradores de Código em Java - Otimize seu tempo, Economize Dinheiro e Melhore sua Qualidade - Parte 4

 Ilustração 5: Diagrama de Classes do Gerador

Neste momento, o velocity combina os objetos com os templates e gera um texto, que é a armazenado em forma de arquivo obedecendo a estrutura de pacotes. Se for necessário a inclusão de mais arquivos gerados, basta criar o template e defini-lo dentro da pasta correspondente a sua equipe. A atual estrutura gera os seguintes arquivos:
  • Entidade – classe de negócios;
  • DAO – interface da classe de persistência;
  • DAOImpl – implementação da classe de persistência;
  • Service – interface da classe de serviço;
  • ServiceImpl – implementação da classe de serviço;
  • Form – classe que representa os campos do formulário da interface web do struts;
  • Action – classe do struts que recebe a submissão de formulários da web, ou funcionalidades acionadas;
  • Cadastro JSP – tela de cadastro usando Java Server Pages;
  • Pesquisa JSP – tela de pesquisa em Java Server Pages;
  • Pesquisa Popup JSP – tela de pesquisa popup em Java Server Pages;
  • Tela de Detalhe Consulta – tela de consulta sem alteração em Java Server Pages;
  • Arquivo de Configuração - um arquivo com todas as alterações dos arquivos de configuração: applicationContext.xml, validation.xml, struts-config.xml, tiles-definitions.xml, ApplicationResources.properties, menu.jsp, report-views-xml.
  • Relatório – o relatório da classe padrão
 Ilustração 6: Saída do Gerador
Como observado no exemplo, foi gerado para uma única tabela, 5265 linhas de código ou 189925 caracteres sem erros de compilação e execução. Mesmo para estruturas mais complexas o tempo de implementação se torna muito menor.

Template de Geração


Após definido o padrão para todos os artefatos de codificação da equipe/empresa, é necessário trocar valores variáveis para a linguagem do velocity. No exemplo abaixo, o nome do sistema foi substituído por ${entity.getSystem()}, através da biblioteca do velocity esta variável será substituída pelo nome do sistema, neste caso, por evep. Com esta tecnologia também é possível fazer laços. Um exemplo de laço é $foreach ($attribute in ${entity.getAttributeList()}) que irá percorrer e gerar todos os atributos da classe de negócios do sistema. 

package gov.tjpr.${entity.getSystem()}.entity;

import gov.tjpr.entity.PersistableEntity;
import javax.persistence.*;
import java.util.Date;

@Entity
@Table(name="${entity.getTableName()}", schema="${entity.getSchema()}")

#foreach ($attributePk in ${entity.getPrimaryKey().getPkAttributeList()})
#if (${attributePk.getType().equals("Integer")})
@SequenceGenerator(name = "SEQUENCE", sequenceName="${entity.getSchema()}.${entity.getTableName().toLowerCase()}_${attributePk.getColumnName().toLowerCase()}_seq", allocationSize=1)
#end
#end
public class ${entity.getClassName()} implements PersistableEntity#foreach($attributePk in ${entity.getPrimaryKey().getPkAttributeList()})<${attributePk.getType()}>#end
{
  private static final long serialVersionUID = ${pSerialEntidade};
#foreach ($attribute in ${entity.getAttributeList()})
#if (${attribute.isPrimaryKey()})
@Id
#if (${attribute.getType().equals("Integer")})
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQUENCE")
#end
@Column(name="${attribute.getColumnName()}")
  private ${attribute.getType()} ${attribute.getName()};
#elseif (${attribute.isForeignKey()})
@ManyToOne
@JoinColumn(name = "${attribute.getColumnName()}")
  private ${attribute.getForeignKey().getEntityPk().getClassName()} ${attribute.getName()};
#else
  @Column(name="${attribute.getColumnName()}")
  private ${attribute.getType()} ${attribute.getName()};
#end
#end
// GETTERS AND SETTERS
...
}

Quadro 2: Template para Geração de Classe do Padrão Modelo

METAINFORMAÇÃO DAS TABELAS


Para enriquecer a geração de códigos, são colocadas informações adicionais nas tabelas, colunas que são chave estrangeiras e colunas que não são chaves estrageiras.

Comentários em nível de tabela


O comentário em nível de tabela obedece a seguinte estrutura <NOME_CLASSE_JAVA>:<NOME_NA_TELA>:<PROPRIEDADE_MOSTRADA_COMBO>, em que:
  • NOME_TABELA - é o nome da tabela no banco de dados;
  • NOME_CLASSE_JAVA - é o nome da classe referente a esta tabela que será criada no Java;
  • NOME_NA_TELA- é o nome que irá ser mostrado nas telas do Sistema;
  • PROPRIEDADE_MOSTRADA_COMBO - é o campo que será utilizado por todas as demais tabelas (em formato de combo ou lupa) que estiverem relacionadas a esta. No exemplo abaixo a entidade Atividade possui uma combo “Nome do Recurso” onde é apresentada a lista de Recursos representados pelo seu nome.

Exemplo:
Recurso:Recurso:nome

 Ilustração 7: Uso do Comentário na Tabela

Comentários para Coluna que não é Chave Estrangeira


O comentário para coluna não chave estrangeira obedece a seguinte estrutura <NOME_ATRIBUTO_JAVA>:<NOME_NA_TELA>:<OPERADOR_PESQUISA>:<OPCOES>:<SEM_ACENTO>:<REPORT>:<TABELA_AUTOCOMPLETE>, em que:
  • NOME_TABELA - é o nome da tabela no banco de dados;
  • NOME_COLUNA - é o nome da coluna;
  • NOME_ATRIBUTO_JAVA - é o nome que será usado como atributo no Java;
  • NOME_NA_TELA - é o nome que será apresentado nas telas do Sistema;
  • OPERADOR_PESQUISA - é o operador de pesquisa desejado
  • OPCOES - deve ser criado no formato <CHAVE1=VALOR1>;<CHAVE2=VALOR2>. É utilizado para combo quando a mesma não estiver vinculada a uma tabela e possui valores fixos. Aplicado somente a campos dos tipos VARCHAR e CHAR.
  • TABELA_AUTOCOMPLETE - é o nome da tabela onde serão buscados os dados para autocomplete.
Usando o seguinte comentário “sexo:Sexo:=:F=Feminino;M=Masculino” para o campo sexo o gerador constrói a combo mostrado no exemplo abaixo:


Geradores de Código em Java - Otimize seu tempo, Economize Dinheiro e Melhore sua Qualidade - Parte 3

ESTRUTURA DO PROCESSO DE GERAÇÃO



O seguinte fluxo é determinado neste processo de geração. O programa gerador busca as informações contidas na base de dados, carrega uma série de classes, mescla estas classes com os templates definidos na empresa e gera os arquivos de saída. Isto torna o gerador independente de tecnologia, pois os templates são definidos pela empresa ou mesmo uma equipe dentro da empresa. As classes carregadas são informações sobre todas as tabelas, relacionamentos e metainformações. A partir dos métodos destas classes é possível criar templates de acordo com a tecnologia da equipe/empresa de modo simples e rápido.

 Ilustração 2: Esquema Processo de Geração

Detalhamento do Processo do Geração


O gerador utiliza a tecnologia java DatabaseMetaData, esta tecnologia acessa a estrutura de tabelas de vários bancos de dados independentemente de tecnologia, para obter de forma independente as informações da estrutura da base de dados relacional, inclusive os comentários que possuem metainformações para enriquecer a geração.
Para criar independência entre equipes, o sistema possui uma separação em pastas para que cada equipe possa criar seus templates, permitindo customização mesmo dentro de uma única empresa.
No Tribunal de Justiça do Estado do Paraná, foi criado três pastas, como ilustrado na figura abaixo. A pasta padrao_criminal obedece o padrão da equipe que cuida dos sistemas criminais, pasta padrao_projudi pertence ao sistemas cíveis e o pasta novos_projetos são para novos projetos dentro do Tribunal.
Além disso, podem ser criadas quantas pastas forem necessárias, de acordo com as especificidades de tecnologias de sua empresa/equipe.
Para que se faça a geração, é necessário que se informe os seguintes parâmetros:
 Ilustração 3: Pasta de Templates
  • Lista de Tabelas – nomes das tabelas que serão geradas;
  • Pasta da Geração – nome do diretório onde será salvo os arquivos gerados;
  • URL – URL de conexão do banco de dados. Exemplo: jdbc:postgresql://postgres-dev:5432/evep;
  • Usuário do Banco – usuário de conexão com o banco de dados
  • Senha – senha de conexão com o banco de dados;
  • Driver – driver do banco de dados
  • Esquema – esquema onde a base de dados foi criado
  • Pasta do Template – como explicado acima, qual conjunto de templates serão utilizados
  • Novo Projeto – indica se o projeto é novo ou não. Quando o sistema é novo, além das classes geradas ele monta um ambiente completo para que o sistema rode sem problemas.
  • Alterar arquivos de configuração – indica que o gerador pode alterar diretamente todos os arquivos de configuração.
Boa parte dos parâmetros são necessários apenas para se ter uma conexão com o banco de dados, senão seria bem menor o número de parâmetros, o que torna bem fácil o uso do gerador, que é a característica “Facilidade de utilização” definidas por Ambler (AMBLER, 2002. pag. 113) .

 Ilustração 4: Parâmetros de Entrada

O gerador com base nestes parâmetros, obtém as informações da base de dados e carrega a estrutura de classes mostrada abaixo. Depois que isto ocorre, usando a tecnologia velocity é possível mesclar o template com os objetos carregados. Dentro do template pode-se acessar várias informações, entre elas:
  • Nome da tabela - através do método entity.getTableName();
  • Nome da classe Java – através do método entity.getClassName();
  • Nome do título da tela – através do método entity.getViewName();
  • Se a coluna é chave estrangeira – através do método attribute.isForeignKey();
  • O domínio de uma coluna – através do método attribute.getListOption();
  • O tamanho do campo – através do método attribute.getLength();
  • Se a coluna fará parte do relatório – através do método attribute.isReport();
  • Se a coluna não é um campo obrigatório – através do método attribute.isAllowNull();
  • O nome da classe que está relacionada com a coluna chave estrangeira – attribute.getForeignKey().getEntityPk().getClassName();
  • O atributo que representa a classe, ou seja, aquela que é apresentada em uma comboentity.getLookupAttribute()


segunda-feira, 30 de dezembro de 2013

Geradores de Código em Java - Otimize seu tempo, Economize Dinheiro e Melhore sua Qualidade - Parte 2

VELOCITY

Velocity é um template-engine feito em Java. É um conjunto de classes, e não um programa diferente em outra linguagem. Uma de suas maiores utilidades é no desenvolvimento de aplicações web, onde o código Java fica totalmente separado do código HTML, tornando assim a aplicação muito mais modularizada e fácil de manter (STEIL, 8888. p. xx). Mas a descoberta mais interessante desta ferramenta desenvolvida para apache e fundamental neste trabalho, é o uso de templates na geração de arquivos, tornando o projeto independente de linguagem e dos padrões de cada equipe dentro de uma grande empresa. Tal qual a mala-direta no Word, este aplicativo permite a substituição de variáveis, laços e teste de condições. Um exemplo clássico seria a geração de um convite para uma lista de pessoas, que possui de um lado a lista de convidados e em outro o modelo do convite, a mala direta substitui uma variável pessoa pelo valor encontrado na lista. O mesmo princípio é aplicado na ferramenta proposta neste documento.
Antes de construir os templates para sua geração é importante estabelecer um padrão de programação construindo uma exemplo de como seria um cadastro completo, com pesquisas, relatórios, tentando incluir nela os mais variados tipos de dados e relacionamentos. A qualidade deste modelo será refletida na qualidade do código gerado.

MAPEAMENTO RELACIONAL

Mapeamento de Objeto-Relacional (ORM) é uma abordagem que permite a construção de sistemas utilizando o paradigma orientado a objetos com a persistência destes objetos em bancos de dados relacionais. Utilizando-se de técnicas e estratégias específicas, é possível mapear classes com seus atributos e associações para o modelo relacional (SILVA et al., 2006).
“O mapeamento de classes pode ser feito mediante a paridade entre classe e tabela, ou seja, uma classe é mapeada para uma tabela” (AMBLER, 1999, pXX). Este mapeamento direto de classes para tabelas representa a forma mais simples de mapeamento, tornando mais fácil o entendimento e a manutenção de uma aplicação.
Desta forma, não se pode desprezar a enorme quantidade de informações existentes em uma modelagem bem feita de uma base de dados. Estas informações são cruciais na riqueza do código gerado neste projeto.
O gerador utiliza diretamente as seguintes informação da base de dados:
  • Tipo da Coluna (varchar, int, bool, etc.)
  • Tamanho da Coluna (varchar 100)
  • Obrigatoriedade da coluna: se permite nulo ou não.
  • Chave primária
  • Chaves estrangeiras
  • Comentários (metainformação)

Tipo da Coluna

Existe uma relação direta entre o tipo do banco de dados relacional e o tipo/classe do atributo em uma classe. Cada banco de dados em particular define seus tipos, bancos como o mysql possui uma gama bem variada de tipos de datas, como por exemplo: TIME, DATE, DATETIME e HOUR e no java, temos uma classe que mapeia todas elas, como Date. O mesmo raciocínio é utilizado para outros tipos, mas sempre é possível definir um paralelo entre os tipos da base de dados e os tipos da linguagens. Abaixo segue por exemplo o mapeamento entre a banco de dados mysql e a linguagem java.
Tipos MySql
Tipos JAVA
CHAR, VARCHAR, BLOB, TEXT, ENUM e SET
java.lang.String, java.io.InputStream, java.io.Reader, java.sql.Blob, java.sql.Clob
FLOAT, REAL, DOUBLE PRECISION, NUMERIC, DECIMAL, TINYINT, SMALLINT, MEDIUMINT, INTEGER, BIGINT
java.lang.String, java.lang.Short, java.lang.Integer, java.lang.Long, java.lang.Double, java.math.BigDecimal
DATE, TIME, DATETIME, TIMESTAMP
java.lang.String, java.sql.Date, java.sql.Timestamp
BIT, TINYINT
java.lang.Boolean
SMALLINT [SEM SINAL]
java.lang.Integer
MEDIUMINT [SEM SINAL]
java.lang.Integer, java.lang.Long (SEM SINAL)
INTEGER [SEM SINAL]
java.lang.Integer, java.lang.Long (SEM SINAL)
BIGINT [SEM SINAL]
java.lang.Long, java.math.BigInteger (SEM SINAL)
FLOAT
java.lang.Float
DOUBLE
java.lang.Double
DECIMAL
java.math.BigDecimal
DATE
java.sql.Date
DATETIME
java.sql.Timestamp
TIMESTAMP
java.sql.Timestamp
TIME
java.sql.Time
YEAR
java.sql.Short ou java.sql.Date
CHAR
java.lang.String
VARCHAR
java.lang.String
BINARY, VARBINARY,TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB
byte[]

 Tabela 1: Conversão entre os tipos MySQL e JAVA

Tamanho da Coluna

O tamanho definido no banco de dados é muito importante na geração, pois pode determinar o tamanho máximo no campo no cadastro. Um campo VARCHAR(50) no banco de dados, não pode ter um campo na tela que aceite mais de 50 caracteres. Se um campo for do tipo TEXT o gerador pode automaticamente criar um componente do tipo TEXTAREA no HTML.

Obrigatoriedade da Coluna

Um dos validadores mais básicos e bastante comum em vários projetos é a obrigatoriedade de uma informação que está associada a uma base de dados bem elaborada. Desta forma, pode-se obter esta informação e inserir no código gerado para validação destes campos, obrigando-os a serem informados.

Chave Primária

No mapeamento objeto relacional é importante dentro do código informar qual é o identificador da tabela na classe. Isto é sinalizado através da anotação @id, o gerador criado faz isto automaticamente utilizando a informação de chave primária do banco de dados.

Chave Estrangeira

O gerador de código proposto utiliza a chave estrangeira para criar um campo do tipo combo ou lupa. A chave estrangeira indica a tabela cujos dados devem aparecer na combo para seleção. A tela abaixo, no cadastro de réu, temos, por exemplo, o campo es-colaridade, que pertence à tabela escolaridade, a lista de informação mostrada nesta tela pertencem à tabela escolaridade. Mas se a tabela possui mais de um campo, temos o problema de qual campo ou quais campos representam este cadastro secundário. Esta indicação é colocada na meta-informação deste campo. Além desta informação temos que definir se o tipo é combo como escolaridade ou lupa como unidade penitenciária.

STEIL, Rafael. Introdução ao Velocity. 2002. Disponível em:
<http://www.guj.com.br/articles> Acesso em: Maio. 2011.
Disponível em: <http://www.javaworld.com/javaworld/jw-12-2001/jw-1228-velocity.html?>
Acesso em: Junho.2011.
Disponível em: ?http://velocity.apache.org/? Acesso em: Julho.2011.


  

domingo, 29 de dezembro de 2013

Geradores de Código em Java - Otimize seu tempo, Economize Dinheiro e Melhore sua Qualidade - Parte 1

INTRODUÇÃO

Geradores de código são soluções inteligentes que reduzem o tempo de desenvolvimento dos projetos, disponibilizam mais tempo da mão de obra para tarefas complexas e melhoram a qualidade do sistema gerado.
Existem diversas ferramentas geradoras de aplicativos no mercado, tais como: GENEXUS, JCOMPANY e JBANANA. No entanto, as melhores ferramentas não são gratuitas e direcionam o desenvolvimento de acordo com os padrões estabelecidos por elas.
Além disso, médias e grandes companhias possuem em seu repertório uma enorme variedade de padrões, ferramentas e linguagens que acabam por restringir a aplicação ampla e um gerador de código de uso comercial, excetuando projetos novos e/ou compatíveis com sua tecnologia. Vale salientar que mesmo em novos projetos é normalmente necessário criar uma infraestrutura para o uso destes geradores comerciais, que implica em mais custos.
Outra desvantagem é a dependência do cliente às atualizações tecnológicas do fornecedor . Se o fornecedor não evoluir a ferramenta ou mesmo descontinuá-la, o cliente poderá arcar com o ônus de usar um recurso ultrapassado para a demanda de novas funções.

Para evitar essas deficiências seria preciso que cada área ou empresa desenvolvesse seus padrões de geração conforme tecnologia pre existente nelas.
O presente blog demonstra o desenvolvimento de um gerador de código construído em java, utilizando a tecnologia velocity da apache, que a partir da metainformação de uma base de dados relacionais postgres, sqlserver e mysql e templates customizados de acordo com a tecnologia existente do cliente, gere uma aplicação com diversas funcionalidades prontas.

GERADORES DE CÓDIGO
Nem tudo que se enfrenta pode ser modificado mas
nada pode ser modificado até que seja enfrentado.
Albert Einstein
DEFINIÇÃO

“Geradores de código são basicamente programas que geram outros programas” (SCHVEPE, 2006, p.15). Os geradores podem ser definidos como ferramentas tanto para formatar códigos simples quanto para gerar aplicações complexas a partir de modelos abstratos (templates). Eles agilizam o processo de desenvolvimento, pois incrementam a produtividade e reduz o tempo utilizado na codificação da aplicação e, consequentemente, o custo final.

Além de diminuir o impacto financeiro, a utilização de geradores padronizam a programação, facilitando futuras manutenções. Dependendo do nível alcançado na implementação dos geradores é possível criar funcionalidades mais complexas.
O gerador de código não elimina a necessidade de programadores, mas elimina tarefas chatas e repetitivas.

VANTAGENS

A utilização de geradores para desenvolvimento de softwares traz enormes vantagens aos códigos gerados, tais como (HERRINGTON, 2003. p. 15):

● qualidade: a escrita de grande quantidade de código vai gradualmente diminuindo a qualidade final do software. Na geração automática, a qualidade do software está diretamente ligada à qualidade dos templates. Esse, por sua vez, não possui qualidade associada à quantidade de código a ser desenvolvida,
visto que os templates possuem uma estrutura fixa que não é alterada pelo tamanho do projeto;

● consistência: o código gerado tende a ser consistente, pois possui uma padronização de nomenclatura de classes, métodos, variáveis e localização (pastas e subpastas), o que torna o código de fácil entendimento e modificação;

● único ponto de conhecimento: caso seja necessária uma alteração de alguma estrutura de entrada do projeto, necessita-se apenas saber o local onde essa modificação deve ser realizada. Após isso, o código gerado se propagará para todos os processos seguintes à alteração, gerando sempre um código compatível com as entradas;

● maior tempo para o projeto: considerando-se o uso de uma biblioteca externa (API), podem acontecer alterações nessa fonte obrigando assim que modificações sejam feitas em todas as partes do código em que aquela modificação irá influenciar. Com a utilização do gerador, esse processo poderá ser feito apenas nos templates do gerador e uma nova geração efetuará as mudanças necessárias no código. Essa característica faz toda a diferença em cronogramas de projetos que utilizam ou não geradores (forma manual);

● abstração: como, normalmente, os geradores utilizam os modelos abstratos de dados (templates) do código alvo, fica fácil migrar de uma plataforma/linguagem para outra, necessitando apenas uma revisão no escopo de abstração, ou seja, modificar os templates de acordo com as necessidades da plataforma/
linguagem alvo;

● agilidade: uma característica chave da geração de código é a maleabilidade do código de saída. No nível de negócio, o software será de mais fácil manutenção e implementação de novas funcionalidades. Mesmo considerando-se o tempo que se economiza no ato da geração, podemos afirmar que essa técnica dá um grande percentual de agilidade ao desenvolvedor. Além destes benefícios, um gerador de código deve seguir algumas premissas, de acordo com Ambler (AMBLER, 2002. pag. 113) um bom gerador de código deve possuir as seguintes características:

● Conformidade com os padrões de codificação. O desenvolvedor deve ser capaz de editar o código-fonte gerado pelo gerador de código. Se o código gerado variar muito do padrão da equipe/empresa tornará mais difícil trabalhar com o gerador, reduzindo o benefício da geração. Portanto, a empresa precisa de ferramentas que possam ser configuradas de acordo com convenções de codificação ao invés da empresa ter que converter seus padrões em conformidade com a ferramenta (colocando-o à mercê dos caprichos do fornecedor).

● Suporte para personalização. Gerador de código-fonte deve fornecer a capacidade de permitir que se defina que tipo de código deve ser gerado.

● Intrusão mínima. Algumas ferramentas são intrusivos, colocando identificadores em seus comentários de código fonte, como identificações exclusivas ou marcas proprietárias para indicar qual o código foi gerado. Algumas ferramentas são ainda mais intrusivas e limitam as alterações a certas partes do código-fonte gerado, muitas vezes indicando estas seções com comentários. Essas "intromissões" são normalmente postas em prática para a conveniência do vendedor de ferramentas, tornando mais fácil a engenharia reversa de seu
próprio código. As invasões não estão lá para sua conveniência e elas não são necessárias.

● Suporte flexível para engenharia reversa. Colaborador normalmente trabalha em uma pequena porção de um sistema de cada vez. Para apoiar este processo de forma eficaz, você precisa ser capaz de fazer engenharia reversa de apenas uma parte do sistema em um momento, talvez dez classes C + + para
fora da 300 que compõem o seu sistema, e apenas gerar os tipos de diagramas que você precisa agora , talvez um diagrama de classes UML simples para começar.

● Facilidade de utilização. Uma ferramenta é difícil de utilizar e difícil de aprender, acaba aumentando os custos da empresa e desta forma, tornando ineficaz o uso da ferramenta. O gerador de código deve suportar várias linguagens. Por exemplo, um sistema baseado na Web pode incluir HTML, JavaScript,
Perl, Java e banco de dados de código proprietário. O ideal é uma gerador de código que apoie as linguagens que a empresa pretende trabalhar.

Esta é a final da parte I - De geradores de Código em Java. Continuo em breve.
Grato
Pablo

REFERÊNCIAS BIBLIOGRÁFICAS
AMBLER, S.W. Mapping Objects to Relational Databases. An AmbySoft Whitepaper.
AmbySoft Inc. 1997. Disponível em: <http://www.agiledata.org/essays/mappingObjects.
html>. Acesso em: 24 abril 2012.
AMBLER, Scott. Agile Modeling: Effective Practices for eXtreme Programming and
the Unified Process. WILEY COMPUTER PUBLISHING, 2002.

HERRINGTON, Jack. Code Generation in Action. MANNING, 2003.

http://geradorcodigojava.blogspot.com.br/2013/12/geradores-de-codigo-em-java-otimize-seu.html
http://geradorcodigojava.blogspot.com.br/2013/12/velocity-velocity-e-um-template-engine.html
http://geradorcodigojava.blogspot.com.br/2014/01/geradores-de-codigo-em-java-otimize-seu.html
http://geradorcodigojava.blogspot.com.br/2014/01/geradores-de-codigo-em-java-otimize-seu_217.html

http://geradorcodigojava.blogspot.com.br/2014/01/geradores-de-codigo-em-java-otimize-seu_5.html