380 likes | 588 Views
Programação orientada a aspectos. Equipe: Leandro Oliveira Anusio Menezes. Software a ser utilizado JDK 1.5 • http://java.sun.com/j2se (1.5.0_01-b08) Eclipse • http://www.eclipse.org (3.1.2) AspectJ 1.5 • http://www.eclipse.org/aspectj (1.5.1a) AJDT
E N D
Programação orientada a aspectos Equipe: Leandro Oliveira Anusio Menezes
Software a ser utilizado • JDK 1.5 • • http://java.sun.com/j2se (1.5.0_01-b08) • Eclipse • • http://www.eclipse.org (3.1.2) • AspectJ 1.5 • • http://www.eclipse.org/aspectj (1.5.1a) • AJDT • • http://www.eclipse.org/ajdt (1.3.1) • http://sergio.dsc.upe.br/aspectos
1. Introdução • A Orientação a Objetos está consolidada. Entretanto, nem todas as promessas que este paradigma se propunha a cumprir foram atendidas. Algumas soluções foram propostas na tentativa de cumprir estas promessas pendentes, entre elas a Orientação a Aspectos. • A Orientação a Aspectos (OA) é um paradigma que estende a Orientação a Objetos (e outros, como o paradigma estruturado) introduzindo novas abstrações. Estes novos elementos são destinados a suprir deficiências na capacidade de representação de algumas situações.
Motivação • Queremos desenvolver software de qualidade capaz de se adaptar a mudanças que lide com a complexidade. • A complexidade crescente dos sistemas • de software gera novos desafios para as • metodologias da Engenharia de Software
Programa orientado a objetos • Abstrações bem mais próximas do • mundo do problema • objetos, não funções • Em um programa, “tudo” é objeto; • Um programa é um monte de objetos ; dizendo aos outros o que fazer;
“A orientação a objetos tem por objetivo diminuir a distância conceitual entre o mundo real e o computacional.”
Creditar Debitar
Classe em Java publicclass Conta { privateString numero; privatedouble saldo; ... publicvoid debitar (double valor) { if(this.getSaldo() >= valor) this.setSaldo(this.getSaldo()-valor); else } publicvoid creditar (double valor) { this.setSaldo(this.getSaldo()+valor); } }
OO resolve nosso problema? • Ainda não! • Complexidade aumenta sem parar • Limitações com objetos • • fatores de qualidade ainda são prejudicados • Problema (mesmo com OO) • Código relacionado a certos interesses são transversaisEspalhadospor vários módulos de • implementação • (classes)
Tipos de interesses • Funcionais (negócio) • creditar, debitar, transferir • Não-funcionais (sistêmicos) • logging • tratamento de exceções • autenticação • desempenho • concorrência e sincronização • persistência...
Agora que entra o conceito de orientação a aspectos • Modularização de interesses transversais • Promove separação de interesses • Implementação de um interesse dentro • de uma unidade... Aspecto nova unidade de modularização e abstração
Separação de Interesses(separationofconcerns) • Para contornar a complexidade de um • problema, deve-se resolver uma questão • importante ou interesse (concern) por vez • [Dijkstra 76]
Implementação com AOP • Complementa a orientação a objetos • novo paradigma? • Melhoria em reuso e extensibidade • Separação de interesses • relação entre os aspectos e o resto do sistema nem sempre é clara • Normalmente menos linhas de código
Em uma linguagem orientada a aspectos • Parte OO • Objetos modularizam interesses não-transversais • Parte de aspectos • Aspectos modularizam interesses transversais
AspectJ • Extensão simples e bem integrada de Java • gera arquivos .class compatíveis com qualquer máquina virtual Java • Linguagem orientada a aspectos • Inclue suporte de ferramentas • JBuilder, Eclipse • Implementação disponível • open source • Comunidade de usuários ativa • Mantida por uma grande empresa (IBM)
Para começar... • Temos que identificar os pontos de interesse na execução • Neste exemplo: ao fazer um crédito ou débito em qualquer conta • Pontos de junção (join points) • pontos na execução de um programa • chamadas de métodos • acesso a atributos (escrita, leitura) • etc.
Precisamos ainda agrupar! • Interesse logging ocorre em todas as chamadas a creditar e debitar • Precisamos agrupar todos os pontos de junção • Em AspectJ • pointcut (conjunto de pontos de junção)
Pointcut • Agrupamento de pontos de junção • Uso de filtros de AspectJ
Identificamos os pontos... agora precisamos decidir duas coisas O que fazer nestes pontos? Fazer isto antes ou depois do ponto?
Advices (adendo) • Especifica o código que será executado quando acontecer os pontos indicados • parecido com métodos • Comportamento executado • antes (before) • depois (after)
Temos o seguinte código em java e vamos em seguida fazer orientado a aspectos publicclass Conta { privateString numero; privatedouble saldo; ... publicvoid debitar (double valor) { if(this.getSaldo() >= valor){ this.setSaldo(this.getSaldo()-valor); System.out.println(“ocorreu um debito!"); } } publicvoid creditar (double valor) { this.setSaldo(this.getSaldo()+valor); System.out.println(“ocorreu um credito!"); } }...
#Partiu_Exercício_ Fixação
Exercício • Faça um aspecto que modularize este concernde logging • Dica: usar dois pointcuts e dois advices
Positivos... • modularidade, reuso, e extensibilidade • inconsciência (obliviousness) • produtividade • permite implementação e testes progressivos
Negativos... • Novo paradigma – aprendizado – relação entre classes e aspectos deve ser minimizada – inconsciência (obliviousness) • Projeto da linguagem – tratamento de exceções – conflitos entre aspectos • Requer suporte de ferramentas • Combinação (apenas) estática
Conclusão • Certamente a Orientação a Aspectos (OA) ainda não é o paradigma ideal, e acreditamos que em breve surgirão outros paradigmas capazes de melhor abstrair / expressar soluções, e por tal, permitindo a criação de soluções melhores. Mas o que fica claro para nós é que, a OA é um grande passo rumo ao paradigma ideal. Neste artigo, e mesmo no livro, trabalhamos apenas a parte da Orientação a Aspectos ligada à programação, entretanto as vantagens da OA quando aplicadas a análise e, principalmente, ao projeto podem ser impressionantes, mas isto é um tema para um outro artigo.