Programação Orientada a Aspectos Uma Breve Introdução Universidade Estadual do Oeste do Paraná Centro de Ciências Exatas e Tecnológicas Colegiado de Informática Prof. Luiz Antonio
Roteiro Introdução Evolução das Linguagens Histórico da POA Estrutura de um Aspecto AspectJ Conclusão Outras Implementações 2
Introdução De canhões e fortes sob a terra Linha Maginot (França) Desenvolvimento de Software Necessidade de estratégias mais produtivas, flexíveis e de qualidade 3
Evolução Linguagem de máquina Programação Estruturada Programação Orientada a Objetos Programação Pós-Objeto 4
Programação Estruturada Da linguagem de máquina para a programação estruturada Suporte a decomposição algorítmica; Procedimentos e funções; Sai o goto e entram as estruturas de controle; Programas maiores, menos flexíveis e difíceis de manter e reutilizar. 5
Exemplo Manipulador de figuras geométricas Figuras são compostas de pontos e linhas; Vários procedimentos para desenhar, girar, escalonar, etc. Código espalhado em vários procedimentos; Introdução de novas figuras exige muitas alterações. 6
Programação Orientada a Objetos Anos 60 e 70: Simula 67, Smalltalk; Decomposição orientada a objetos Objeto: procedimentos e dados em uma unidade independente e auto-contida; A herança e o polimorfismo reduzem o código e facilitam a reutilização; Encapsulamento; Sistemas menores e mais robustos; Como fica o manipulador de figuras geométricas? 7
Onde a OO falha? Domínio do Problema Como representar detalhes que não tem conexão direta com o problema? O que fará parte de uma classe ou de outra? Coerência conceitual; Entrelaçamento de classes (scattering); Espalhamento de código (tangling). 8
Principais problemas da POO Redundância Fragmentos de código repetidos em diversos pontos; Fraca coesão Classes contém funcionalidades que não estão diretamente relacionadas a elas; Forte acoplamento Classes precisam conhecer métodos de outras classes. 9
Modularidade Programação estruturada e Programação Orientada a Objetos permitem a divisão do problema (sistema) em partes; Divisão reduz a complexidade; Separação de Interesses Todo sistema de software lida com diferentes interesses: dados, operações, etc. Cada interesse em uma localidade física. 10
Boa Modularidade Parsing de XML no org.apache.tomcat As linhas vermelhas mostras as linhas de código relevantes Estão todas localizadas em um único bloco 11
Problemas de Modularidade logging no org.apache.tomcat Código não está localizado em um único módulo Nem mesmo em um número pequeno de módulos 12
Entrelaçamento e espalhamento na POO 13
Decomposição orientada a Aspectos 14
Histórico da POA Criada nos laboratórios da Xerox em 1997; Objetivo Definir uma abordagem que permitisse expressar melhor as características ortogonais do comportamento do programa; Separação dos requisitos funcionais e nãofuncionais; Diminuir o entrelaçamento de código. 15
Programação Orientada a Aspectos: definição A Programação orientada a aspectos (POA) é uma tecnologia de programação em evolução que oferece suporte a novos mecanismos de abstração e composição com o objetivo de permitir alcançar uma melhor separação de concerns no nível da implementação. (Chavez, 2004) 16
Separação de Interesses... os sistemas de software complexos devem ser decompostos em unidades modulares menores e claramente separadas, cada uma lidando com um único interesse. (Chavez, 2004) 17
Programação Orientada a Aspectos: justificativa A POA surgiu como uma técnica de programação complementar ao Paradigma de Orientação a Objetos, que visa o tratamento, de maneira independente, de interesses que se revelam espalhados por todo o sistema ou entrelaçados em diversas classes, promovendo a reutilização e facilitando a manutenção do software. (Menolli e Castro, 2007) 18
Aplicação da POA Auditoria; Registro e rastreamento de operações; Persistência de dados; Tratamento de exceções; Políticas de desenvolvimento; Autenticação, identificação e autorização de usuários; 19
O Aspecto O aspecto é a unidade modular principal em AspectJ, assim como a classe é a unidade principal em Java; Um aspecto agrupa pontos de atuação, adendos e introduções. 20
O Aspecto Pontos de Junção (join points) Locais bem definidos da execução de um programa. Ex.: chamada de um método. Pontos de Atuação (pointcuts) Elementos do programa usados para definir um ponto de junção. Adendos (advices) Métodos executados quando um ponto de atuação é alcançado. 21
Pontos de Junção É qualquer ponto identificável pelo Aspecto durante a execução de um programa; entradas e saídas de métodos; construtores; tratamento de exceções; acessos a atributos de objetos; entre outros. 22
Pontos de Atuação São construções de programa que permitem a seleção de um ou mais pontos de junção; Pode-se usar expressões regulares para se especificar os pontos de atuação, permitindo grande flexibilidade. 23
Caracteres Especiais Caractere *.. + Significado Qualquer seqüência de caracteres Ex.: call(private void Item.set*(*)) Substitui zero ou mais sequências Ex.: call (* Comunicador.deliver(..)) Qualquer subclasse de uma classe Ex.: call (* Conta+.set*(*)) 24
Expressões Lógicas Operador! (Negação) (OU lógico) && (E lógico) Significado Ex.: Todos os métodos de todas as classes, exceto os da classe Comunicador. call(* *.*(..) &&!Comunicador) Ex.: Todos os métodos get e set de todas as classes que tratam com strings. call(string *.get*() * *.set*(string)) Ex.: Todos os métodos get da classe Conta e suas especializações, exceto ContaPoupanca call(* Conta+.get*() &&!ContaPoupanca) 25
Tipos de Junção Categoria call execution staticinitialization initialization get set handler Uso Chamada de método ou contrutor Execução de método ou construtor Inicialização de classe Inicialização de objetos Leitura de Atributo de classe Escrita de Atributo de classe Tratamento de Exceção 26
Adendo É um trecho de código que deve ser executado em pontos de junção selecionados por um ponto de corte; O adendo pode ser executado antes (before), depois (after), ou "em volta" (around) do ponto de junção; O around pode ser usado para substituir o ponto de junção pelo advice, ou para executar código antes e depois do ponto de junção. 27
AspectJ Linguagem de Aspectos para Java AspectJ: linguagem para aspectos do Java; ajc: compilador AJDT: plugin do Eclipse. 28
Anatomia do Aspecto public aspect AspectoExemplo { pointcut pontoatuacao1() : call (* Classe.metodo(..)); Ponto de Atuação before() : pontoatuacao1() { //ações } Aspecto Adendo 29
Resumo do Processo 30
Exemplo Shopping 31
Exemplo Log public class Inventory { private List<Item> items = new Vector<Item>(); static Logger logger = Logger.getLogger("trace"); public void additem(item item) { logger.logp(level.info, "Inventory", "additem", "Entering"); items.add(item); } } public void removeitem(item item) { logger.logp(level.info, "Inventory", "removeitem", "Entering"); items.remove(item); } 32
Exemplo Log public aspect TraceAspect { private Logger logger = Logger.getLogger("trace"); pointcut tracemethods() : call(* *.*(..)) &&!within(traceaspect); } before() : tracemethods() { Signature sig = thisjoinpointstaticpart.getsignature(); logger.logp(level.info, sig.getdeclaringtype().getname(), sig.getname(), "Entering"); } 33
Discussão O ponto de atuação identifica todas as chamadas de métodos O adendo registra as informações estáticas do ponto de junção interceptado thisjoinpointstaticpart permite acesso a informações estáticas, como o nome da classe ou do método e parâmetros 34
Exemplo Around Retornando nomes de Itens em maiúsculo public aspect NormalizaCaixaNomeCliente { pointcut caixaalta() : call (String Item.getNome()); } String around() : caixaalta() { String s = proceed(); return s.touppercase(); } 35
Inclusão do código dos Aspectos 36
Introduções É uma forma de um aspecto introduzir mudanças em classes, interfaces e aspectos do sistema; Por exemplo, pode-se acrescentar um atributo ou método a uma classe existente. 37
Exemplo: adição de métodos Podem ser adicionados a qualquer classe; aspect NomeDoAspecto { visibilidade tipodedado Classe.nomeDoMetodo(parâmetros) { //código do metodo } } Exemplo: aspect AspectoItemIntroduction { public void Item.toXML() { //código do metodo } } 38
Conclusão O objetivo do desenvolvimento orientado a aspectos é encapsular interesses em módulos fisicamente separados do restante do código; Além de decompor o sistema em objetos (dados) e métodos (funções), decompomos cada objeto e função de acordo com o interesse, agrupado em um módulo distinto; Esses módulos são denominados aspectos. 39
Outras Implementações Aspect.NET 2.1 JBoss AOP 40
Programação Orientada a Aspectos Uma Breve Introdução Dúvidas? Contato: larodrigues@unioeste.br
Bibliografia The AspectJ Projet. Disponível em: <http://www.eclipse.org/aspectj/> GRADECKI, J. D.; LESIECKI, N. Mastering AspectJ: Aspect-Oriented Programming in Java. Indianapolis: Wiley Publishing, 2003. LADDAD, R. AspectJ in Action: Practical Aspectoriented Programming. USA: Manning, 2003. MENOLLI, A.; CASTRO, C. Programação Orientada a Aspectos. Minicurso. EPAC, 2007. WINCK, D. V.; GOETTEN JUNIOR, V. AspectJ: Programação Orientada a Aspectos com Java. São Paulo: Novatec, 2006. 42