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 Saldo Número R$100,00 12.344-67 Debitar CLASSE DE CONTAS BANCÁRIAS CLASSE EM JAVA public class Conta { private String numero; private double saldo; ... public void debitar (double valor) { if (this.getSaldo() >= valor) this.setSaldo(this.getSaldo()-valor); else } public void 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 transversaisEspalhados por 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... Cada cor representa um interesse diferente 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 (SEPARATION OF CONCERNS) 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) EXEMPLO(ADVICE) TEMOS O SEGUINTE CÓDIGO EM JAVA E VAMOS EM SEGUIDA FAZER ORIENTADO A ASPECTOS public class Conta { private String numero; private double saldo; ... public void debitar (double valor) { if (this.getSaldo() >= valor){ this.setSaldo(this.getSaldo()-valor); System.out.println(“ocorreu um debito!"); } } public void creditar (double valor) { this.setSaldo(this.getSaldo()+valor); System.out.println(“ocorreu um credito!"); } }... ASPECTO LOGCONTAS EXERCÍCIO Faça um aspecto que modularize este concern de logging „Dica: usar dois pointcuts e dois advices PONTOS POSITIVOS E NEGATIVOS A CERCA DO TEMA... 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.