Programação Orientada a Aspectos USP – IME – MAC5714 – 2015.1 Marcelo Noguti – 6793181 Thiago Maia – 3078545 2 Sumário Introdução Características de código (Concerns) "Alvos" da POA Suporte Definições básicas Ganhos Padrões de Projeto familiares Um caso de uso Maus usos Bibliografia MAC5714 -- Programação Orientada a Aspectos 3 Introdução Gregor Kiczales (Xerox PARC, 1996-97) "A Programação Orientada a Aspectos (POA) visa a modularizar características transversais, assim como a Programação Orientada a Objetos (POO) visa a modularizar características afins" MAC5714 -- Programação Orientada a Aspectos 4 Introdução POA complementa POO POA objetiva um problema de cada vez Mais sobre as diferentes "visões" de modularização POO – Entidades POA – Funcionalidades MAC5714 -- Programação Orientada a Aspectos 5 Introdução POA teve origem na técnica de Reflexão "POA é um paradigma que considera separadamente as características do software, e modulariza aquelas que são transversais em entidades de software bem-definidas ditas Aspectos" [Pawlak et al.] MAC5714 -- Programação Orientada a Aspectos 6 Introdução A necessária caracterização e separação de requisitos entre Funcionais e Não Funcionais MAC5714 -- Programação Orientada a Aspectos 7 Introdução MAC5714 -- Programação Orientada a Aspectos 8 Características de código (Concerns) Requisitos funcionais Requisitos não funcionais Controle de acessos Registros de operações Concerns de implementação Proteção (erros) Auxílio à depuração Imposição de políticas de implementação MAC5714 -- Programação Orientada a Aspectos 9 Características de código (Concerns) A decomposição principal de Características transversais (um tradeoff de POA) Emaranhamento: várias características no mesmo módulo Espalhamento: a mesma característica em vários módulos Necessidade de disciplina do programador: desastre O código é difícil de manter, atualizar, depurar etc. Exemplo: controle de acesso em quase todos os métodos de quase todas as classes… MAC5714 -- Programação Orientada a Aspectos 10 Características de código (Concerns) Espalhamento: a mesma característica em vários módulos MAC5714 -- Programação Orientada a Aspectos 11 Características de código (Concerns) Emaranhamento: várias características no mesmo módulo MAC5714 -- Programação Orientada a Aspectos 12 Características de código (Concerns) O ideal: equilíbrio e organização MAC5714 -- Programação Orientada a Aspectos 13 "Alvos" da POA Tangências entre muitas abstrações Alto Acoplamento Redundância de código MAC5714 -- Programação Orientada a Aspectos 14 Suporte Java C C++ C# Smalltalk MAC5714 -- Programação Orientada a Aspectos 15 Suporte AspectJ (Xerox PARC, 2001) RIDL HyperJ D2AL QIDL JST AOP/ ST AspectIX D COOL MAC5714 -- Programação Orientada a Aspectos IL 16 Definições básicas Aspects (Aspectos) Join points Pointcuts (Cortes) Advice Inter-type declaration Weaving MAC5714 -- Programação Orientada a Aspectos 17 Definições básicas Aspects (Aspectos) É a entidade básica do paradigma: descreve os cortes e o advice Encapsula as características transversais na decomposição principal, e reduz o emaranhamento e o espalhamento MAC5714 -- Programação Orientada a Aspectos 18 Definições básicas Join points Ponto da execução onde se quer interceptar o fluxo de execução MAC5714 -- Programação Orientada a Aspectos 19 Definições básicas Pointcuts (Cortes) Reunião dos Join points desejados, na decomposição principal em que os aspectos atuam (onde é executado um advice) MAC5714 -- Programação Orientada a Aspectos 20 Definições básicas Advice Código pertinente a um Aspecto (é a implementação do mesmo) MAC5714 -- Programação Orientada a Aspectos 21 Definições básicas Inter-type declaration Trecho de código inserido no software especificamente relacionado ao Aspecto MAC5714 -- Programação Orientada a Aspectos 22 Definições básicas Weaving É a aplicação dos aspectos no código-alvo pela junção destes trechos com os originais (processo realizado por uma ferramenta específica para essa "costura") MAC5714 -- Programação Orientada a Aspectos 23 Definições básicas Weaving MAC5714 -- Programação Orientada a Aspectos 24 Ganhos Se escreve menos código Se lê menos código O código é mais conciso, coeso e mais fácil de se entender O código é mais manutenível MAC5714 -- Programação Orientada a Aspectos 25 Ganhos Menos código implica menos erros Menos código redundante A atenção e a concentração são privilegiadas Portanto há mais produtividade MAC5714 -- Programação Orientada a Aspectos 26 Padrões de Projeto familiares Observer Chain of responsibility Decorator Proxy Strategy MAC5714 -- Programação Orientada a Aspectos 27 Um caso de uso Imprimir log quando o método print() da classe UmaClasseQualquer é chamado: public aspect ImprimeLog{ // Ponto de corte pointcut imprimeLog() : call (* UmaClasseQualquer.print()); // Advice before() : imprimeLog() { System.out.println("OI"); } } MAC5714 -- Programação Orientada a Aspectos 28 Um caso de uso Interceptar o método toString() de qualquer classe e converter a cadeia para caixa baixa: public aspect NormalizaCaixa { // Ponto de corte pointcut string() : call (* *.toString()); // Advice String around() : string() { String s = proceed(); // Execute o método que foi substituído return s.toLowerCase(); } } MAC5714 -- Programação Orientada a Aspectos 29 Um caso de uso Obter a assinatura e o nome do método onde for chamado o Aspecto: public aspect Debug { // Ponto de corte pointcut debug() : call(* *.*(..)) && !within(Debug); after() : debug() { String nomeMetodo = thisJoinPointStaticPart.getSignature().getName(); System.out.println("Acabei de sair do metodo " + nomeMetodo); } } MAC5714 -- Programação Orientada a Aspectos 30 Um caso de uso Passar o contexto para a execução do aspecto: before(Classe c, Parametro p): call(void nomeDoMetodo(Parametro)) && target(c)&& args(p) { System.out.println("Parametro " + p +" para a classe " + c.getNome()); } MAC5714 -- Programação Orientada a Aspectos 31 Um caso de uso Gerar um erro no momento da compilação: declare error: call(java.lang.ArrayList.new(..)) : "Eu disse para não usar ArrayList!!!"; MAC5714 -- Programação Orientada a Aspectos 32 Um caso de uso Um aspecto que insere métodos e atributos à classe: public aspect NotaMinimaAluno { private float Aluno.notaMinima; public boolean Aluno.abaixoDoMinimo(float nota) { return nota < notaMinima; } after(Aluno aluno) : execution(Aluno.new(..)) && this(aluno) { aluno.notaMinima = 5; } .... } MAC5714 -- Programação Orientada a Aspectos 33 Um caso de uso Um aspecto que insere métodos e atributos à classe: public aspect NotaMinimaAluno { .... after(Aluno aluno, float nota) : execution(* Aluno.setNota(float)) && args(nota) && this(aluno) { if (aluno.abaixoDoMinimo(nota)) { System.out.println("Aluno " + aluno.getNome() + " precisa se esforçar mais"); } } } MAC5714 -- Programação Orientada a Aspectos 34 Maus usos Uso de Aspecto(s) em uma classe ou método único Regras de negócio dependentes de Aspecto(s) Requisitos Funcionais escondidos em Aspecto(s) Falta de Integração ou Testes de Unidade MAC5714 -- Programação Orientada a Aspectos 35 Perguntas? MAC5714 -- Programação Orientada a Aspectos 36 Bibliografia BÖLLERT, Kai. On Weaving Aspects. In the Proceedings of the Aspect-Oriented Programming. Workshop at ECOOP'99. 1999. CHAVEZ, Christina. GARCIA, Alessandro. LUCENA, Carlos. Desenvolvimento Orientado a Aspectos. Anais do XVII Simpósio Brasileiro de Engenharia de Software, Manaus, Amazonas. Universidade Federal do Amazonas. 2003. KICZALES, Gregor et al. Aspect-Oriented Programming. In the Proceedings of ECOOP'97. 1997. PAWLAK, Renaud. SEINTURIER, Lionel. Foundations of AOP for J2EE Development. Apress. 2005. MAC5714 -- Programação Orientada a Aspectos