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