Análise das vantagens na busca por novas técnicas de programação, por meio do estudo da linguagem Java e seu recurso chamado “annotations”1 Gabriel Augusto Duarte 2 Resumo: Muito se fala sobre novas tecnologias e novos métodos para o desenvolvimento de sistemas, mas poucos desenvolvedores param para analisar o quanto a tecnologia evoluiu até chegar ao ponto em que se encontra atualmente. Este estudo faz uma análise geral de um recurso chamado Anotações, para que uma base comparativa seja criada, podendo-se, assim, analisar outros recursos e tecnologias semelhantes. Muitas vezes não se nota o quanto o dia-a-dia pode ser mais organizado, prático e lucrativo, quando se muda uma rotina ou um paradigma que antes parecia muito bem focado, mas que graças à competitividade de um mercado sempre mais exigente, torna-se obsoleto em pouco tempo. Palavras-chave: Sistemas de Informação. Desenvolvimento de Sistemas. JAVA. Anotações do Java. Evolução das linguagens de programação. Orientador: Prof. Ms. Klausner Vieira Gonçalves. Formado em Sistemas de Informação e cursando a especialização em Engenharia e Administração de Sistemas de Bancos de Dados pela UNICAMP. Atua no desenvolvimento de sistemas web para as Faculdades Claretianas de Rio Claro desde 2009. E-mail: <[email protected]>. 1 2 Linguagem Acadêmica, Batatais, v. 2, n. 1, p. 225-242, jan./jun. 2012 225 1. INTRODUÇÃO Estão sempre surgindo novas tecnologias para o desenvolvimento de sistemas. Mas até que ponto conhecer essas novas ferramentas ou técnicas pode ser melhor que trabalhar com as que já se conhece e se tem prazer em trabalhar? Manter o equilíbrio é exatamente o desafio dos desenvolvedores. Nota-se isso observando que programadores de COBOL, uma linguagem de meio século, encontram ainda hoje oportunidades no mercado. Mas deve se atentar ao fato de que a linguagem em questão evoluiu, e os programadores necessitaram, em algum momento, evoluir junto a eles. Este artigo tem como objetivo não só apresentar uma ferramenta, as anotações do Java, mas também trazer à tona a necessidade de se aprofundar na tecnologia da preferência de cada um. 2. MATERIAIS E MÉTODOS Linguagens de programação e sua evolução O ser humano tem, em sua essência, a necessidade de desenvolver ferramentas que facilitem o seu dia a dia. Ao longo de toda essa existência criativa da humanidade, notou-se que todo problema é mais facilmente resolvido se dividido em problemas menores. Deu-se, nesse momento, o início da informática, surgindo como meio de dividir problemas e posteriormente, fazê-los interpretáveis pelos computadores através de comandos. Segundo Sebesta (2000), os primeiros computadores eram utilizados somente no meio científico e isso graças ao fato de que esses eram extremamente difíceis de operar. A linguagem humana e a linguagem computacional estavam distantes e cada comando exigia horas de trabalho para ser feito, como no caso dos cartões perfurados. A solução foi criar uma linguagem intermediária entre o computador e o homem. 226 Linguagem Acadêmica, Batatais, v. 2, n. 1, p. 225-242, jan./jun. 2012 Essas linguagens necessitaram evoluir ao longo dos anos para se adaptar às novas necessidades e aos novos recursos. Podemos citar como marco nessa evolução a criação do Paradigma Estruturado e posteriormente Orientado a Objetos, na qual se baseou a linguagem JAVA. Linguagem JAVA Em meados da década de 1990, desenvolvedores da Empresa SUN (Microsystems)trabalhavam no desenvolvimento de uma espécie de TV interativa, mas a linguagem utilizada na época, o C++, não era suficiente para satisfazer as necessidades apresentadas pelo projeto, conforme nos diz Cadenhead (2005). James Gosling, líder do projeto, decidiu então utilizar os esforços de sua equipe para a produção de uma linguagem que atendesse esses requisitos. Segundo JAVA (2010) o esforço do corpo de engenheiros não foi suficiente para criar a TV, pois era avançada demais para a época, mas a nova linguagem foi então utilizada em um meio que ainda ganhava força na época, a internet. Em 1995 a SUN anunciou o lançamento do Java como um pacote de ferramentas de desenvolvimento gratuito. E, embora com recursos primitivos se comparados aos dias atuais, poderiam ser utilizados nas páginas vistas no Netscape Navigator. O JAVA possui inúmeras características que o fazem merecedor do prestígio atingido, entre elas: • orientação a objetos; • ser uma linguagem distribuída; • segurança; • portabilidade; • ser uma linguagem interpretada. Além das características acima informadas, os desenvolvedores devem conhecer as características internas da linguagem, necessárias durante a codificação. São elas: Linguagem Acadêmica, Batatais, v. 2, n. 1, p. 225-242, jan./jun. 2012 227 • • • • • ausência de ponteiros; existência de um tipo booleano; herança simples; existência de threads ou processos assíncronos; coleta automática de lixo de memória (GarbageCollection). JAVA e a internet Conforme dito anteriormente, o JAVA foi criado com o objetivo de ser uma linguagem voltada à comunicação em rede. Entre as ferramentas que atingiram esse objetivo, podemos citar os applets, o servlets e as páginas JSP. Os applets são pequenos programas utilizados em páginas web que fornecem um grande leque de opções ao desenvolvimento. Esses já compuseram boa parte da utilização do JAVA, mas hoje em dia são utilizados apenas em aplicações mais específicas. Servlet é o nome utilizado como diminutivo de server, ou servidor. Como remete o seu nome, estes aplicativos são utilizados no servidor e possuem um grande poder de manipulação de requisições via internet. Já as páginas JSP foram criadas com o intuito de anexar os códigos JAVA ao conteúdo HTML, facilitando o desenvolvimento. Podemos utilizar todas as ferramentas dos servlets nas páginas JSP. Anotações Em qualquer linguagem de programação, é necessário organização e padronização nos códigos, para que seja mais simples sua manutenção. No JAVA isso pode ser feito de diversas maneiras, como os Javadocs, a documentação automática do JAVA,uso de interfaces ou através da generalização de classes. Além dessas ferramentas, podem ser utilizadas as anotações do JAVA. Anotação é uma informação adicionada ao código no formato @nome_ da_anotação que não alteram diretamente o fluxo do sistema. Conforme 228 Linguagem Acadêmica, Batatais, v. 2, n. 1, p. 225-242, jan./jun. 2012 Oracle (2010), anotações podem ser utilizadas em três situações: passando informações ao compilador; para gerar meta-informações na forma de documentação, arquivos XML, entre outros. Para serem avaliadas em tempo de execução, causando um desvio indireto na execução do sistema. Anotações podem tratar especificamente um elemento do código, como uma classe, um método, atributo, pacote etc. Anotações utilizadas pelo compilador: são três as anotações utilizadas pelo compilador. A anotação @Deprecated informa que o método que a contém não deve mais ser utilizado, pois foi substituído por outro melhor. @Override indica que o método foi sobrescrito de uma classe mãe e @SupressWarning indica que avisos do tipo ”Warning” podem ser ignorados. Anotações utilizadas para gerar documentos e outros códigos: são anotações criadas pelo desenvolvedor com a finalidade de serem lidas externamente. Vejamos um exemplo, por Oracle (tutorial/java/javaOO/ annotations.html>. Acesso em: 30 set. 2010): 1. @ClassPreamble ( 2. author = “John Doe”, 3. date = “3/17/2002”, 4. currentRevision = 6, 5. lastModified = “4/12/2004”, 6. lastModifiedBy = “Jane Doe”, 7. reviewers = {“Alice”, “Bob”, “Cindy”} // Note array notation 8. } 9. public class Generation3List extends Generation2List { 10. // classcodegoeshere 11. } Anotações – exemplo de anotações – Oracle (disponível em: Linguagem Acadêmica, Batatais, v. 2, n. 1, p. 225-242, jan./jun. 2012 229 download.oracle.com/javase/tutorial/java/javaOO/annotations.html>. Acesso em: 30 set. 2010) Anotações avaliadas em tempo de execução: são anotações utilizadas pelo próprio sistema com o objetivo de causar alguma alteração em seu fluxo de execução. Embora possam existir muitas formas de anotações, a seguir estão exemplos que compreendem a maioria delas. Anotação sem valor interno: pode se criar uma anotação apenas para verificar sua existência. Um exemplo seria a anotação @Obrigatorio que poderia ser utilizada para a validação dos dados de um objeto antes da inserção de seus dados no banco de dados. Exemplo: 1. @Retention(RetentionPolicy.RUNTIME)//Em tempo de execução 2. @Target(ElementType.FIELD) //Anotação de atributos 3. public @interface Obrigatorio {}(citação pessoal). Anotação com apenas um valor: anotações podem receber apenas um valor. Para isso, utilizamos em sua criação o campo value. Um exemplo seria criar uma anotação que armazenasse uma nota para ser enviada ao usuário. 1. @Retention(RetentionPolicy.RUNTIME) //Em tempo de execução 2. @Target(ElementType.TYPE) //Anotação de classes 3. public @interface Nota{ 4. Stringvalue(); 5. }(citação pessoal). Um detalhe importante a ser notado é que os campos das anotações são criados como métodos estáticos. Isso torna perceptível que anotações são na verdade interfaces e não classes. A diferença entre uma interface e uma anotação é a marcação interface e @interface, respectivamente. 230 Linguagem Acadêmica, Batatais, v. 2, n. 1, p. 225-242, jan./jun. 2012 Anotações com mais de um valor: anotações podem receber quaisquer valores, sejam tipos primitivos ou classes. Pode-se então, por exemplo, criar uma anotação que armazene valores para um cálculo. 1. @Retention(RetentionPolicy.RUNTIME) //Em tempo de execução 2. @Target(ElementType.TYPE) //Anotação de classes 3. public @interface ValorCalculo{ 4. floatporcentagemImposto(); 5. floatporcentagemDesconto(); 6. floatporcentagemMulta(); 7. }(citação pessoal) Anotações – anotação com múltiplos valores: observarmos também que a anotação, desse modo, obriga o uso de todos os seus campos. Para que isso não ocorra é necessária a utilização da anotação default. Exemplos do uso das anotações Supondo que seja criado um sistema para calcular o custo de produtos dependendo dos do tempo de entrega, e esse sistema deve exibir o tipo do produto que está sendo calculado, deve considerar cálculos diferentes para cada tipo de produto e ainda verificar se os campos estão todos registrados. Embora se possa criar esse sistema das mais variadas maneiras, uma possibilidade seria, por exemplo, criar as seguintes classes: Código sem anotações: para que seja ilustrado o uso das anotações, foi criado um projeto sem a sua utilização onde é realizado um cálculo com produtos nacionais e importados. O mesmo projeto será reutilizado posteriormente, para que fiquem claras as diferenças de utilização. Produto: classe abstrata que possui os atributos comuns a qualquer uma das classes filho, ProdutoNacional e ProdutoImportado. Linguagem Acadêmica, Batatais, v. 2, n. 1, p. 225-242, jan./jun. 2012 231 1. public abstract class Produto { 2. privateInteger id; 3. privateString nome; 4. privateStringdescricao; 5. privateFloat valor; 6. public Produto() { 7. } 8. publicStringgetDescricao() { 9. returndescricao; 10. } 11. public void setDescricao(String descricao) { 12. this.descricao = descricao; 13. } 14. publicIntegergetId() { 15. return id; 16. } 17. public void setId(Integer id) { 18. this.id = id; 19. } 20. publicStringgetNome() { 21. return nome; 22. } 23. public void setNome(String nome) { 24. this.nome = nome; 25. } 232 Linguagem Acadêmica, Batatais, v. 2, n. 1, p. 225-242, jan./jun. 2012 26. publicFloatgetValor() { 27. return valor; 28. } 29. publicvoidsetValor(Float valor) { 30. this.valor = valor; 31. } 32. } (citação pessoal). ProdutoNacional e ProdutoImportado: Classes que herdam os atributos de Produto, estabelecendo os seus atributos particulares. 1. publicclassProdutoNacionalextends Produto { 2. public static final Float valorImposto = 10.0f; 3. public static final Float valorMulta = 5.0f; 4. publicstatic final FloatvalorDesconto = 1.0f; 5. } (citação pessoal). 1. publicclassProdutoImportadoextends Produto { 2. publicstatic final FloatvalorImposto = 20.0f; 3. public static final Float valorMulta = 8.0f; 4. publicstatic final FloatvalorDesconto = 0.5f; 5. privateFloatvalorImportacao; 6. publicProdutoImportado() { 7. super(); 8. } 9. publicFloatgetValorImportacao() { 10. returnvalorImportacao; 11. } Linguagem Acadêmica, Batatais, v. 2, n. 1, p. 225-242, jan./jun. 2012 233 12. publicvoidsetValorImportacao(FloatvalorImportacao) { 13. this.valorImportacao = valorImportacao; 14. } 15. }(citação pessoal). Calculadora: classes que contém as regras de negócio para os cálculos com produtos. Para sua utilização, seria utilizado um servlet, descrito a seguir. 1. publicclass Calculadora { 2. publicstaticStringcalculaValor(Produto produto, int dias) { 3. Stringmsg = “”; 4. if (produto != null) { 5. Float valor = null; 6. if (produto.getId() != null&&produto.getNome() != null&&produto.getValor() != null&&produto.getDescricao() != null) { 7. valor = produto.getValor(); 8. FloatvalorImposto = 0.0f; 9. FloatvalorMulta = 0.0f; 10. FloatvalorDesconto = 0.0f; 11. if (produto instanceofProdutoNacional || (produto instanceofProdutoImportado&& ((ProdutoImportado)produto). getValorImportacao() != null)) { 12. if (produto instanceofProdutoNacional) { 13. msg += “Calculando valor para produto nacional\n”; 14. valorImposto = ProdutoNacional.valorImposto; 15. valorMulta = ProdutoNacional.valorMulta; 16. valorDesconto = ProdutoNacional.valorDesconto; 17. } 234 Linguagem Acadêmica, Batatais, v. 2, n. 1, p. 225-242, jan./jun. 2012 18. elseif (produto instanceofProdutoImportado) { 19. msg += “Calculando valor para produto importado\n”; 20. valorImposto = ProdutoImportado.valorImposto; 21. valorMulta = ProdutoImportado.valorMulta; 22. valorDesconto = ProdutoNacional.valorDesconto; 23. valor += ((ProdutoImportado)produto).getValorImportacao(); 24. } 25. if (dias > 10) { 26. valor = valor + (valor / 100 * valorMulta * (dias - 10)); 27. } 28. elseif (dias < -10) { 29. valor = valor - (valor / 100 * valorDesconto * (dias + 10) * -1); 30. } 31. valor = valor + (valor / 100 * valorImposto); 32. msg += “O valor encontrado foi “ + valor + “\n”; 33. } 34. else { 35. msg += “É necessário preencher todos os campos.\n”; 36. } 37. } 38. else { 39. msg += “É necessário preencher todos os campos.\n”; 40. } 41. } 42. returnmsg; 43. } 44. }(citação pessoal). Pode se perceber que apesar do cálculo ser simples, o código acaba ficando complexo para respeitar os atributos de cada tipo de produto, isso se percebe na condição que se inicia na linha 12 da calculadora. O código necessita de um bloco como esse para cada tipo de produto. Linguagem Acadêmica, Batatais, v. 2, n. 1, p. 225-242, jan./jun. 2012 235 Outro problema que encontramos nesse código é sua inflexibilidade. Para cada produto também necessitamos procurar ocorrências como a da linha 11 que verifica um atributo utilizado somente no produto importado. A possibilidade de erro em um código como esse é muito grande, mesmo para um desenvolvedor atento. A solução para esse problema pode estar, por exemplo, nas anotações. Neste caso vamos utilizar as mesmas criadas no tópico onde se iniciou a explicação sobre anotações. (@Obrigatorio, @Nota, @ValorCalculo). Código com anotações: conforme dito anteriormente, a seguir está uma possível atualização do projeto anterior, criado sem anotações. Produto: 1. publicclass Produto { 2. @Obrigatorio 3. privateInteger id; 4. @Obrigatorio 5. privateString nome; 6. @Obrigatorio 7. privateStringdescricao; 8. @Obrigatorio 9. privateFloat valor; 10. public Produto() { 11. } 12. publicStringgetDescricao() { 13. returndescricao; 14. } 15. public void setDescricao(String descricao) { 16. this.descricao = descricao; 236 Linguagem Acadêmica, Batatais, v. 2, n. 1, p. 225-242, jan./jun. 2012 17. } 18. publicIntegergetId() { 19. return id; 20. } 21. public void setId(Integer id) { 22. this.id = id; 23. } 24. publicStringgetNome() { 25. return nome; 26. } 27. 28. public void setNome(String nome) { 29. this.nome = nome; 30. } 31. publicFloatgetValor() { 32. return valor; 33. } 34. publicvoidsetValor(Float valor) { 35. 36. this.valor = valor; 37. } 38. }(citação pessoal). ProdutoNacional e ProdutoImportado: As classes filho recebem as anotações @Nota e @ValorCalculo, conforme código abaixo: 1. @Nota(“Produto Nacional”) 2. @ValorCalculo( 3. porcentagemDesconto = 1.0f, Linguagem Acadêmica, Batatais, v. 2, n. 1, p. 225-242, jan./jun. 2012 237 4. porcentagemImposto = 10.0f, 5. porcentagemMulta = 5.0f 6. ) 7. publicclassProdutoNacionalextends Produto {} 1. @Nota(“Produto Importado”) 2. @ValorCalculo( 3. porcentagemDesconto = 0.5f, 4. porcentagemImposto = 20.0f, 5. porcentagemMulta = 8.0f 6.) 7. publicclassProdutoImportadoextends Produto { 8. @Obrigatorio 9. privateFloatvalorImportacao; 10. publicProdutoImportado() { 11. super(); 12. } 13. publicFloatgetValorImportacao() { 14. returnvalorImportacao; 15. } 16. publicvoidsetValorImportacao(FloatvalorImportacao) { 17. this.valorImportacao = valorImportacao; 18. } 19. }(citação pessoal). Calculadora: A maior parte das mudanças fica na classe Calculadora. Ela é responsável pela leitura de todos os dados contidos agora nas anotações. A primeira vista nota-se que o código, embora mais organizado, ficou mais complexo por conta dessa leitura, mas dando-se conta de que esse código não aumenta, não importa quantos tipos de 238 Linguagem Acadêmica, Batatais, v. 2, n. 1, p. 225-242, jan./jun. 2012 produtos participem do calculo. 1. publicclass Calculadora { 2. publicstaticStringcalculaValor(Produto produto, int dias) { 3. Stringmsg = “”; 4. if (produto != null) { 5. Float valor = null; 6. if (camposPreenchidos(produto)) { 7. valor = produto.getValor(); 8.FloatvalorImposto = produto.getClass(). getAnnotation(ValorCalculo.class).porcentagemImposto(); 9.FloatvalorMulta = produto.getClass(). getAnnotation(ValorCalculo.class).porcentagemMulta(); 10.FloatvalorDesconto = produto.getClass(). getAnnotation(ValorCalculo.class).porcentagemDesconto(); 11. msg += produto.getClass().getAnnotation(Nota.class).value() + “\n”; 12. if (produto instanceofProdutoImportado) { 13. valor += ((ProdutoImportado)produto).getValorImportacao(); 14. } 15. if (dias > 10) { 16. valor = valor + (valor / 100 * valorMulta * (dias - 10)); 17. } 18. elseif (dias < -10) { 19. valor = valor - (valor / 100 * valorDesconto * (dias + 10) * -1); 20. } 21. valor = valor + (valor / 100 * valorImposto); 22. msg += “O valor encontrado foi “ + valor + “\n”; Linguagem Acadêmica, Batatais, v. 2, n. 1, p. 225-242, jan./jun. 2012 239 23. } 24. } 25. }(citação pessoal). As anotações resolvem os problemas propostos, pois tem o poder de ler meta-dados das classes identificando-as não importandopara os seus atributos. Este é um recurso valioso quando se necessita identificar valores diferentes em diferentes classes. Como quando lê que os campos são obrigatórios, por exemplo, no método camposPreenchidos da calculadora com anotações. Embora o código fique de certo modo mais complicado, se for analisado que não mais teremos que adicionar campo a campo para ser verificado como acontecia antes (linha 6 - calculadora sem anotações e linha 11, para casos de campos exclusivos) e perceptível que há uma redução significativa de trabalho. Por sua vez, quando se utiliza a leitura do tipo de produto através da anotação @Nota, não ocorre uma redução de trabalho, mas uma limpeza no código, facilitando uma eventual mudança que possa ocorrer futuramente. É muito mais simples identificar que o tipo do produto está escrito na anotação do que quando ocorre no meio do código, como por exemplo, nas linhas 13 e 19 do primeiro modelo de calculadora. Percebe-se que também esta clareza no caso dos valores da anotação @ValorCalculo, onde não são mais a leitura dos valores como atributos da classe e sim como valores separados na anotação. É fácil identificar que são valores especiais destacados logo no início da classe. Também não há mais a necessidade de criação de métodos de obtenção dos mesmos e não há risco de confusão com outros campos de objetos instanciados a partir desta classe. 240 Linguagem Acadêmica, Batatais, v. 2, n. 1, p. 225-242, jan./jun. 2012 CONCLUSÃO Portanto, conclui-se que as anotações não tornaram o código mais simples do que o primeiro modelo onde não é utilizado este recurso, nem tão pouco tornou menor do que o anterior. Mas as anotações tornaram o código mais claro aos olhos de quem conheça a técnica e entenda exatamente o porquê da sua utilização em cada ponto. Torna-se então fundamental não somente o conhecimento da ferramenta central que foi abordada neste trabalho, mas de todos os outros recursos e métodos que estão por trás das boas práticas de programação. Mostrou-se, através deste estudo, que a importância do profundo conhecimento das ferramentas com as quais trabalhamos não está diretamente em utilizar às mesmas e sim na capacidade de se escolher corretamente onde e quando utilizá-las. Toda ferramenta pode trazer benefícios a quem as utiliza, mas é necessário sempre optar pelo bom senso na escolha de quais ferramentas utilizar. Pode se considerar errado não se atualizar e desconhecer as ferramentas atuais de desenvolvimento, mas também é um erro utilizar uma ferramenta apenas por utilizar. REFERÊNCIAS BARNES, D. J.; KÖLLING, M. Programação orientada a objetos com Java: uma introdução básica utilizando o BlueJ. Tradução de Edson Furmankiewicz. São Paulo: Pearson Prentice Hall, 2007. CADENHEAD, R.; LEMAY, L. Aprenda em 21 dias Java 2. Rio de Janeiro: Elsevier, 2005. JAVA. Saibamaissobre a tecnologia Java. 2010. Disponível em: <www.java.com/pt_ BR/about>. Acesso em: 30 set. 2010. ORACLE. Annotations (The Java Tutorials > Learning the Java Language>. 2010. Classes andObjects). Disponível em: <http://download.oracle.com/javase/tutorial/ Linguagem Acadêmica, Batatais, v. 2, n. 1, p. 225-242, jan./jun. 2012 241 java/javaOO/annotations.html>. Acesso em: 30 set. 2010. SEBESTA, R. W. Conceitos de linguagens de programação. Tradução de José Carlos Barbosa dos Santos. 4. ed. Porto Alegre: Bookman, 2000. Title: Analysis of the advantages in the search of new programming techniques through the study of java language and its resource called “annotations”. Author: Gabriel Augusto Duarte. ABSTRACT: Much has been said about new technologies and methodologies for systems development, but few developers do stop to analyse how much technology has evolved so far. This study presents an overview of a resource called “Annotations”, aiming at establishing a comparative basis for further analysis of other similar resources and technologies. Very often it is not perceived how the day-to-day could be more organised, practical and profitable if a routine or paradigm was changed, one that, so far, seemed very well focused but, thanks to the competitiveness of a demanding market, quickly becomes obsolete. Keywords: Information Systems. Systems Development. JAVA. Java Annotations. Evolution of programming languages. 242 Linguagem Acadêmica, Batatais, v. 2, n. 1, p. 225-242, jan./jun. 2012