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.


  

Nenhum comentário:

Postar um comentário