1 EXERCÍCIOS (EXERCÍCIO 1) Conceituar requisitos transversais na programação orientada a objetos. (EXERCÍCIO 2) Diga se as afirmações abaixo são verdadeiras ou falsas, justificando as falsas: 1. O comando within interrompe todos os joinpoints de um método. 2. Para se interromper um método construtor de uma classe, utiliza-se a cláusula nome_da_classe.new. 3. Os pointcuts anônimos possuem visibilidade apenas dentro do advice que os declarou. 4. A interrupção de um método especificado por um pointcut de execução ocorre após o retorno do método. (EXERCÍCIO 3) O caractere curinga + serve para: [A] Capturar qualquer método de uma determinada classe. [B] Especificar um pointcut que também interrompa as superclasses. [C] Especificar um pointcut que também interrompa as subclasses. [D] Capturar um método com qualquer parâmetro [E] Substituir as substrings no nome de uma classe ou método. (EXERCÍCIO 4) Diga se as afirmações abaixo são verdadeiras ou falsas, justificando as falsas: 1. O entrelaçamento na orientação a objetos somente ocorre se o programador não fizer o código 100% OO. 2. Os requisitos transversais são aqueles relacionados com a regra do negócio. 3. Os advices são pontos dentro do programa OO que serão interrompidos por um aspecto. 4. Os aspectos favorecem a manutenção, pois neles ficam contidos os códigos de acesso a funções básicas do sistema que em outra circunstância ficariam espalhados por várias classes do sistema. (EXERCÍCIO 5) Explique o que é weaver. 2 (EXERCÍCIO 6) Mostre um exemplo de declaração de um pointcut o qual iria interromper qualquer método de uma classe chamada Produto retornando sempre inteiro e com qualquer argumento. (EXERCÍCIO 7) Qual a diferença entre pointcut e joinpoint? (EXERCÍCIO 8) As cláusulas before e after são utilizadas pelos: [A] pointcuts [B] joinpoints [C] weavers [D] aspects [E] advices (EXERCÍCIO 9) Escreva um pequeno aspecto com o pointcut da questão 10 e com a função main na qual a assinatura do método capturado deva ser impressa na tela. (EXERCÍCIO 10) Explique o que é obliviousness? (EXERCÍCIO 11) Escreva um exemplo de pointcut composto. (EXERCÍCIO 12) Escreva um exemplo de aspecto que possa capturar o conteúdo de um atributo saldo de um objeto de uma classe chamada Contas. Ao capturar tal atributo, imprima-o na tela. (EXERCÍCIO 13) Qual a finalidade da cláusula this? 3 (EXERCÍCIO 14) Diga se as afirmações abaixo são verdadeiras ou falsas, justificando as falsas: 1. O comando args permite capturar um objeto de uma classe. 2. Um aspecto pode executar um método que ele mesmo interrompe, levando o programa a um loop infinito. 3. Os pointcuts de condição podem ser aplicados a qualquer método. 4. O after returning não está presente na documentação oficial do AspectJ. (EXERCÍCIO 15) Dê exemplo de um pointcut de condição. (EXERCÍCIO 16) Reescreva o aspecto da questão 12 com uma função externa ao advice. (EXERCÍCIO 17) Como funciona o advice do tipo around? (EXERCÍCIO 18) O advice before returning corresponde a: [A] after returning [B] before execution [C] around returning [D] after execution [E] around (EXERCÍCIO 19) Os advices nos aspetos são semelhantes a qual elemento das classes? [A] atributos [B] métodos [C] função main() [D] parâmetro de métodos [E] subclasses 4 (EXERCÍCIO 20) Quais elementos da UML são usados para estendê-la? (EXERCÍCIO 21) Na aspectUML, para que serviria o valor com tag {aspecto ativo}? (EXERCÍCIO 22) Comente dois valores com tag utilizados na aspectUML no relacionamento aspecto-classe associação? (EXERCÍCIO 23) Faça um diagrama da aspectUML no qual um aspecto controla uma classe Conta por intermédio de um pointcut transmite_saldo. (EXERCÍCIO 24) Faça um diagrama de classes detalhando as partes de um aspecto da aspectUML correspondente ao trecho de código a seguir: public class Base { private int x; public Base(int x){this.x = x;} public int soma(int y){return this.x+y; } public int getX() {return x;} public void setX(int x) {this.x = x;} } public aspect TesteAfterReturning { pointcut p1() : call( * Base.soma(..) ); after(Base obj) returning(int retorno): p1() && target (obj){ System.out.println("[Advice After] Valor do Atributo da Base: "+obj.getX()); System.out.println("[Advice After] Valor que o método está retornando: "+retorno); } public static void main(String[] args) { Base b = new Base(10); b.setX(b.soma(5)); System.out.println("\n[Principal] Valor do Atributo da Base: "+b.getX()); } }