• Nenhum resultado encontrado

Silvio do Lago Pereira

N/A
N/A
Protected

Academic year: 2022

Share "Silvio do Lago Pereira"

Copied!
39
0
0

Texto

(1)

AspectJ

Silvio do Lago Pereira

Doutorando em Ciência da Computação slago@ime.usp.br

(2)

Sumário

Programação Orientada a Objetos (POO)

Programação Orientada a Aspectos (POA)

AspectJ

Exemplos

(3)

Programação Orientada a Objetos

Limitações da POO Requisitos transversais Rastreamento usando POO Problemas com essa abordagem A causa dos problemas da POO

(4)

Limitações da POO

POO é o paradigma de programação da atualidade:

Engenharia de Software

metodologias e ferramentas

POO tem algumas limitações:

(5)

Novembro/2002 Silvio do Lago Pereira 5

Exemplos de requisitos transversais

segurança

persistência

auditoria e depuração

tratamento de exceções

otimização de desempenho

concorrência e sincronização

regras e restrições do negócio

aplicação POA

(6)

Rastreamento usando POO

class Tracing {

public static void entry(String s) { System.out.println("entry: " + s);

}

public static void exit(String s) { System.out.println("exit: " + s);

} }

class Tracing {

public static void entry(String s) { System.out.println("entry: " + s);

}

public static void exit(String s) { System.out.println("exit: " + s);

} }

class Person {

private String name = "";

class Person {

private String name = "";

public void setName(String name) {

(7)

Novembro/2002 Silvio do Lago Pereira 7

Problemas com essa abordagem

Redundância

Fraca coesão

Forte acoplamento

Dificuldade de compreensão

Dificuldade de manutenção

Dificuldade de reutilização

(8)

A causa dos problemas da POO

A decomposição primária na POO é feita no plano.

O requisito transversal fica

espalhado pelas classes porque é tratado na dimensão errada!

(9)

Programação Orientada a Aspectos

Princípios básicos da POA Ingredientes essenciais da POA Benefício esperado da POA

(10)

Princípios básicos da POA

A separação de requisitos transversais é um princípio que deve guiar todas as etapas numa metodologia de desenvolvimento de software.

A modularização de requisitos transversais deve ser feita através de uma nova unidade de encapsulamento, denominada aspecto.

(11)

Novembro/2002 Silvio do Lago Pereira 11

Ingredientes essenciais na POA

Classes: encapsulam requisitos funcionais.

Aspectos: encapsulam requisitos transversais.

Weaver: entrelaça classes e aspectos num programa.

aspectos

classes programa

weaver

(12)

Benefício esperado da POA

Boa modularidade, mesmo quando temos requisitos transversais:

facilidade de desenvolvimento

facilidade de manutenção

facilidade de reutilização

(13)

AspectJ

O que é AspectJ ? Aspectos versus classes Joinpoints e pointcuts Advices e Introductions Reusabilidade

(14)

O que é AspectJ ?

É uma extensão de Java, orientada a aspectos.

É um weaver que implementa POA em Java.

É um preprocessador.

Fácil de aprender e utilizar.

Disponível gratuitamente.

(15)

Novembro/2002 Silvio do Lago Pereira 15

Aspectos versus classes

Aspectos são similares a classes:

têm um tipo;

podem ser estendidos;

podem ser abstratos ou concretos;

podem conter campos, métodos e tipos como membros.

(16)

Aspectos versus classes

Aspectos são diferentes de classes:

não têm construtor, nem destrutor;

não podem ser criados com o operador new;

podem conter pointcuts e advices como membros;

podem acessar membros de outros tipos.

(17)

Novembro/2002 Silvio do Lago Pereira 17

Joinpoints

São pontos na execução de um programa, onde aspectos podem interceptar classes.

object

method

execução de método chamada

de método

set get

acesso a campo field

(18)

Joinpoints

Joinpoints são identificados por designadores:

call(Signature)

execution(Signature)

initialization(Signature)

handler(TypePattern)

get(Signature)

set(Signature)

this(TypePattern)

(19)

Novembro/2002 Silvio do Lago Pereira 19

Joinpoints

Designadores podem ser genéricos:

call(* set*())

call(public Person.*(..))

call(void foo(..))

call(* *(..))

call(*.new(int, int))

(20)

Pointcuts

Predicados que definem conjuntos de joinpoints.

pointcut traced() :

call(public * set*(..));

pointcut traced() :

call(public * set*(..));

(21)

Novembro/2002 Silvio do Lago Pereira 21

Pointcuts

Pointcuts podem ser definidos como expressões booleanas, empregando-se !, && e ||.

pointcut move():

call(Point.setX(..)) ||

call(Point.setY(..)) ||

call(Line.setP1(..)) ||

call(Line.setP2(..));

pointcut move():

call(Point.setX(..)) ||

call(Point.setY(..)) ||

call(Line.setP1(..)) ||

call(Line.setP2(..));

(22)

Pointcuts também podem ter argumentos.

Pointcuts

pointcut move(Object m, Shape s):

this(m) && target(s) &&

(call(Point.setX(..)) ||

call(Point.setY(..)) ||

call(Line.setP1(..)) ||

pointcut move(Object m, Shape s):

this(m) && target(s) &&

(call(Point.setX(..)) ||

call(Point.setY(..)) ||

call(Line.setP1(..)) ||

(23)

Novembro/2002 Silvio do Lago Pereira 23

São trechos de código associados a pointcuts, que injetam um novo comportamento em todos os

joinpoints representados pelo pointcut.

Tipos:

before

after

around

Advices

chamado chamador

After advice

Before advice

(24)

Advices

Formas básicas:

before(param) : pointcut(param) {...}

after(param) : pointcut(param) {...}

after(param) returning [formal] : pointcut(param) {...}

after(param) throwing [formal] :

(25)

Novembro/2002 Silvio do Lago Pereira 25

pointcut get(int index) :

args(index) && call(*get*(..));

before(int index) : get(index) { System.out.println(index);

}

pointcut get(int index) :

args(index) && call(*get*(..));

before(int index) : get(index) { System.out.println(index);

}

Fluxo de informação

designador designador

pointcut pointcut

advice advice

código código

(26)

Exemplo: Hello world!

public class Hello {

public static void main(String args[]) { System.out.println("Hello world!");

} }

public class Hello {

public static void main(String args[]) { System.out.println("Hello world!");

} }

public aspect Greetings {

pointcut pc() : call(* *main(..));

public aspect Greetings {

pointcut pc() : call(* *main(..));

(27)

Novembro/2002 Silvio do Lago Pereira 27

Exemplo: Hello world!

>ajc Hello.java Greetings.java

>java Hello Hi.

Hello world!

Bye...

>ajc Hello.java Greetings.java

>java Hello Hi.

Hello world!

Bye...

(28)

Exemplo: Hello world!

/* Generated by AspectJ version 1.0.6 */

import java.io.*;

public class Hello {

public static void main(String[] args) { try {

Greetings.aspectInstance.before0$ajc();

Hello.main$ajcPostCall(args);

} finally {

Greetings.aspectInstance.after0$ajc();

} }

public Hello() { super();

/* Generated by AspectJ version 1.0.6 */

import java.io.*;

public class Hello {

public static void main(String[] args) { try {

Greetings.aspectInstance.before0$ajc();

Hello.main$ajcPostCall(args);

} finally {

Greetings.aspectInstance.after0$ajc();

} }

public Hello() { super();

(29)

Novembro/2002 Silvio do Lago Pereira 29

Exemplo: Hello world!

/* Generated by AspectJ version 1.0.6 */

public class Greetings {

public final void before0$ajc() { System.out.println("Hi.");

}

public final void after0$ajc() { System.out.println("Bye...");

}

public Greetings() { super();

}

public static Greetings aspectInstance;

public static Greetings aspectOf() { return Greetings.aspectInstance;

}

public static boolean hasAspect() {

return Greetings.aspectInstance != null;

}

static {

Greetings.aspectInstance = new Greetings();

} }

/* Generated by AspectJ version 1.0.6 */

public class Greetings {

public final void before0$ajc() { System.out.println("Hi.");

}

public final void after0$ajc() { System.out.println("Bye...");

}

public Greetings() { super();

}

public static Greetings aspectInstance;

public static Greetings aspectOf() { return Greetings.aspectInstance;

}

public static boolean hasAspect() {

return Greetings.aspectInstance != null;

}

static {

Greetings.aspectInstance = new Greetings();

} }

(30)

Reflexão: thisJoinPoint

É uma variável especial predefinida.

É similar à variável this em Java.

Disponibiliza várias informações a respeito do joinpoint que disparou o advice.

Exemplos:

(31)

Novembro/2002 Silvio do Lago Pereira 31

Introduction

Um forma de introduzir novos membros a classes e interfaces já existentes.

public int Foo.bar(int x);

private int Foo.counter;

declare parents: Mammal extends Animal;

declare parents: MyThread implements MyThreadInterface;

public int Foo.bar(int x);

private int Foo.counter;

declare parents: Mammal extends Animal;

declare parents: MyThread implements MyThreadInterface;

(32)

Reusabilidade

public abstract aspect Tracing {

protected abstract pointcut trace();

// advice code }

public aspect MyTracing extends Tracing { // just define which calls to trace public abstract aspect Tracing {

protected abstract pointcut trace();

// advice code }

public aspect MyTracing extends Tracing { // just define which calls to trace

protected pointcut trace(): call(* set*());

(33)

Exemplos

Rastreamento Sincronização Otimização

(34)

Rastreamento

aspect Tracing {

pointcut traced() : call(public * Person.*(..));

before() : traced() {

System.err.println("entry: " + thisJoinPoint);

}

after() : traced() {

System.err.println("exit: " + thisJoinPoint);

} }

aspect Tracing {

pointcut traced() : call(public * Person.*(..));

before() : traced() {

System.err.println("entry: " + thisJoinPoint);

}

after() : traced() {

System.err.println("exit: " + thisJoinPoint);

} }

class Person { class Person {

(35)

Novembro/2002 Silvio do Lago Pereira 35

Sincronização

aspect Synchronization {

private Semaphore s = new Semaphore();

pointcut updateSem(): call(public void set*(..));

before() : updateSem() { P(s); } after() : updateSem() { V(s); } }

aspect Synchronization {

private Semaphore s = new Semaphore();

pointcut updateSem(): call(public void set*(..));

before() : updateSem() { P(s); } after() : updateSem() { V(s); } }

(36)

Otimização

public class Fibonacci {

public static int fib(int n) { if( n < 2 ) {

System.err.println(n + ".");

return 1;

}

else {

System.err.print(n + ",");

return fib(n-1) + fib(n-2);

}

public class Fibonacci {

public static int fib(int n) { if( n < 2 ) {

System.err.println(n + ".");

return 1;

}

else {

System.err.print(n + ",");

return fib(n-1) + fib(n-2);

}

(37)

Novembro/2002 Silvio do Lago Pereira 37

Otimização

aspect Memoization {

private HashTable cache = new HashTable();

pointcut fibs(int n):

execution(int Fibonacci.fib(int)) && args(n);

// calculate only if not already in cache!

int around(int n): fibs(n) {

Integer result = (Integer)cache.get(new Integer(n));

if (result == null) {

int f = proceed(n); // not found, calculate!

cache.put(new Integer(n), new Integer(f));

return f;

}

else return result.intValue(); // found, done!

} }

aspect Memoization {

private HashTable cache = new HashTable();

pointcut fibs(int n):

execution(int Fibonacci.fib(int)) && args(n);

// calculate only if not already in cache!

int around(int n): fibs(n) {

Integer result = (Integer)cache.get(new Integer(n));

if (result == null) {

int f = proceed(n); // not found, calculate!

cache.put(new Integer(n), new Integer(f));

return f;

}

else return result.intValue(); // found, done!

} }

(38)

Referências

Kendall, E. A. Aspect-Oriented Programming in AspectJ, 2001.

Kiczales, G. et all. Aspect-Oriented Programming, 1997.

Kiczales, G. et all. An Overview of AspectJ, 2002.

Voelter, M. Aspect-Oriented Programming in Java, 2000.

The AspectJ Programming Guide, Xerox Corporation, 2002.

(39)

Fim

Referências

Documentos relacionados

Luminárias da linha Essential LED Highbay com facho fechado (NB) são ideais para aplicações com altura de montagem entre 8-10 metros.*. Em muitos galpões de estoque, posições

Based on the theory that the muscle strength of elderly in- dividuals responds differently to an activity program, ac- cording to the presence or absence of a medical diagnosis

This retrospective study assessed early, clinical and X-ray outcomes using this technique and the total metal-on-metal resurfacing prosthesis3. MATERIALS

The aim of the present work is to fill this gap considering the formation, growth and solubility of hydroxyapatite in the presence of gal- lium salts, the incorporation of

Os objectivos do presente trabalho são contribuir para a validação da versão 36 do WHODAS 2.0 em forma de entrevista e avaliar o impacto da dor músculo-esquelética, mais intensa

was to evaluate the prevalence and severity of malocclusion and its association with the social vulnerability to which adolescents aged 11 to 14 years in the city of Belo

Objective: The purpose of this study was to assess primary stabilization of humeral shaft fractures using three different methods of fixation, represented by a

The accurate diagnosis of the clinical forms of American Tegumentary Leishmaniasis (ATL) is important because the mucosal form requires longer treatment with toxic drugs,