Lincoln S. Rocha ([email protected])
� POO e suas Limitações� Introdução POA� AspectJ: Conceitos Básicos
Exemplo: Tracing� Exemplo: Tracing
� Objetivo da Programação?� Introdução à OO� Introdução à POO
Limitações da POO� Limitações da POO� Requisitos Transversais: Exemplos� Rastreamento Usando POO� Problemas com a Abordagem� A Causa dos Problemas da POO
record Pessoanome : string;idade : integer;nascimento : string;
end
procedure aniversario
Mapeamento
procedure aniversariobegin
(.....)end
Nome Idade Nascimento
Alan Turing 96 23/06/1912
5
� A Orientação a Objetos surgiu no início dos anos 80
� Grande evolução desde os Métodos EstruturadosEstruturados
� É uma abordagem para modelagem de sistemas e um paradigma maduro que continua sendo amplamente utilizado
6
� O paradigma da Orientação a Objetos compreende várias disciplinas� Análise Orientada a Objetos
� Projeto Orientado a Objetos
� Programação Orientada a Objetos
� (...)
7
� O princípio da OO é mapear um modelo da realidade, visto como interação entre objetos, num modelo computacional de dados e programasdados e programas
8
� Foco nos dados (objetos) do sistema, não nas funções
� Estruturação do programa é baseada nos dados, não nas funçõesdados, não nas funções
� As funções mudam mais do que os dados!
9
� Princípios Fundamentais
�Objetos � Herança
�Classes � Polimorfismo
10
�Classes � Polimorfismo
�Abstração � Modularidade
� Encapsulamento � Hierarquia
� Objetos� Entidades que formalizam o modo pelo qual
compreendemos algo no domínio de um problemaproblema
� Em um objeto estão encapsulados os dados (atributos) e os procedimentos (métodos) exclusivos dele▪ Os procedimentos são aplicáveis aos dados residentes
no objeto
11
� Objetos (cont.)� Um objeto possui estado, comportamento e
identidade▪ Estado: valores dos atributos▪ Estado: valores dos atributos
▪ Comportamento: definido pelos métodos (como o objeto age e reage)
▪ Identidade: aquilo que diferencia um objeto de outro
12
� Classes� Descrevem um conjunto de objetos semelhantes
� São templates utilizados para criar objetos
� Classes de objetos podem herdar atributos e métodos de outras classes de objetos
13
� Objetos versus Classes� Objeto é uma entidade concreta e a Classe é uma
abstração
� Do ponto de vista de programação � Do ponto de vista de programação ▪ Definir uma classe significa formalizar um tipo de dados
e todas as operações associadas a este tipo
▪ Declarar objetos significa criar variáveis do tipo definido
14
� A POO falha em modularizar requisitos periféricos que atravessam múltiplos módulos (ex., segurança, rastreamento e distribuição) distribuição)
� Esses requisitos ou interesses são chamados de transversais (crosscutting concerns)
15
� A implementação de requisitos transversais se dá através da adição de código em diversos objetos ao longo do sistema
Gera espalhamento� Gera espalhamento
� Em geral o código relacionado ao requisito transversal não está diretamente ligado à funcionalidade definida para estes objetos� Gera entrelaçamento
16
� Segurança
� Persistência
� Auditoria e depuraçãoAplicação
Auditoria e depuração
� Tratamento de exceções
� Otimização e desempenho
� Concorrência e sincronização
� Regras e restrições do negócio
17
Aplicação POA
public class Tracing {
public static void entry(String text) {
System.out.println("entry: " + text);
}
public static void exit(String text) {
System.out.println("exit: " + text);
}
18
}}
public class Person {private String name = "";
public void setName(String name) {
Tracing.entry("setName("+name+")");
this.name = name;
Tracing.exit("setName()");
}...
}
� Redundância � Fraca coesão� Forte acoplamento
Dificuldade de compreensão� Dificuldade de compreensão� Dificuldade de manutenção� Dificuldade de reutilização
19
A decomposição primáriana POO é feita no plano
O requisito transversal ficaespalhado pelas classes porque é
20
espalhado pelas classes porque étratado na dimensão errada!
TracingO requisito transversal é ortogonalà decomposição primária!
� Introdução� Princípios Básicos� Etapas do Desenvolvimento
Ingredientes Essenciais� Ingredientes Essenciais� Benefício Esperado
� A POA foi concebida por Gregor Kiczales(1997) quando era o cientista chefe cientista chefe (software design) da Xerox PARC (1996 –2002)
23
� O principal objetivo da POA é facilitar a modularização de interesses transversais (crosscutting concerns)
� A POA não veio substituir POO, mas sim
para complementá-la!
24
� A POA, assim como a POO, é baseada no principio da separação de interesses (separation of concerns) o qual preconiza a identificação e o tratamento individualizado identificação e o tratamento individualizado dos diferentes interesses envolvidos no desenvolvimento de um software
� 1974 - Edsger W. Dijkstra em "On the role of scientific thought“
25
� A separação de interesses é um princípio que deve guiar todas as etapas de um processo de desenvolvimento de softwaredesenvolvimento de software
� A modularização de interesses transversais deve ser feita através de uma nova unidade de encapsulamento, denominada aspecto
26
� Visão geral do processo de desenvolvimento na POA
27
� Classes: encapsulam requisitos funcionais� Aspectos: encapsulam requisitos transversais� Weaver: entrelaça classes e aspectos num programa
28
Aspectos
ClassesPrograma
Weaver
� Boa modularidade, mesmo quando temos requisitos transversais
� Facilidade de desenvolvimento� Facilidade de desenvolvimento� Código fonte menos espalho e entrelaçado, mais
compacto e mais natural
29
� Facilidade de manutenção� Mais fácil para entender, depurar e modificar
Facilidade de reutilização� Facilidade de reutilização� Hierarquia de aspectos, biblioteca de aspectos e
aspectos “plug and play”
30
� O que é AspectJ ?� Aspectos versus Classes� Joinpoints e Pointcuts
Advices e Introductions� Advices e Introductions� Reflexão e Reusabilidade
� É uma extensão de Java, orientada a aspectos� É um weaver que implementa POA em Java� É um pré-processador
“Fácil” de aprender e utilizar� “Fácil” de aprender e utilizar� Disponível gratuitamente
� http://eclipse.org/aspectj
33
� Aspectos são similares a classes
� Têm um tipo
� Podem ser estendidos� Podem ser estendidos
� Podem ser abstratos ou concretos
� Podem conter atributos, métodos e tipos como
membros
34
� Aspectos são diferentes de classes
� Não têm construtor, nem destrutor
� Não podem ser criados com o operador new� Não podem ser criados com o operador new
� Podem conter pointcuts e advices como
membros
� Podem acessar membros de outros tipos
35
� São pontos, bem definidos, na execução de um programa, onde aspectos podem interceptar classes
36
Objeto
Método
Execução de método
Chamada de método
getset
Acesso a atributo
Atributo
� São identificados por designadores� call(Signature)
� execution(Signature)
� initialization(Signature)� initialization(Signature)
� preinitialization(ConstructorPat)
� staticinitialization(TypePat)
� handler(TypePattern)
� get(Signature)
� set(Signature)
37
� args(TypePattern, ...)
� within(TypePattern)
� cflow(PointCut)
� cflowbelow(Pointcut)� cflowbelow(Pointcut)
� if(Expression)
� adviceexecution()
� this(TypePattern)
� target(TypePattern)
38
� Designadores podem ser genéricos
� call(* set*())
� call(public Person.*(..))
� call(void foo(..))
� call(* *(..))
� call(*.new(int, int))
39
� Predicados que definem conjuntos de joinpoints
40
pointcut traced() : call(public * set*(..));
� Podem ser definidos como expressões booleanas, empregando-se !, && e ||
41
pointcut traced() : call(public * set*(..)) ||
call(public * get*(..));
� Pointcuts também podem ter argumentos
42
pointcut traced(Person p) : target(p) &&
call(public * set*(..)) ||
call(public * get*(..));
� São trechos de código associados a pointcuts, que injetam um novo comportamento em todos os joinpointsrepresentados pelo pointcutrepresentados pelo pointcut
� Tipos� before
� after
� around
43
chamadochamador
After
advice
Before
advice
� Formas básicas� before(param) : pointcut(param) {...}
� after(param) : pointcut(param) {...}
� after(param) returning [formal] : � after(param) returning [formal] :
pointcut(param) {...}
� after(param) throwing [formal] : pointcut(param)
{...}
� type around(param) [throws typelist] :
pointcut(param) {...}
44
pointcut get(int index) :
args(index) && call(* get*(..));
designador
pointcut
45
before(int index) : get(index) {
System.out.println(index);
}
pointcut
advice
código
� É uma variável especial predefinida� É similar à variável this em Java� Disponibiliza várias informações a respeito do
joinpoint que disparou o advicejoinpoint que disparou o advice
� Exemplos:� thisJoinPoint.toString()
� thisJoinPoint.getArgs()
46
� Um forma de introduzir novos membros a classes e interfaces já existentes
private int Person.id = 0;
47
public void Person.setId(int id){
this.id = id;
}
public int Person.getId(){
return this.id;
}
declare parents: Person extends Animal;
public abstract aspect Tracing {
protected abstract pointcut trace();
// advice code
}
48
}
public aspect MyTracing extends Tracing {
// just define which calls to trace
protected pointcut trace(): call(* set*(..));
}
public class Person {
private String name = "";
public void setName(String name) {
this.name = name;}...
}
50
}
class Tracing {
public static void entry(String text) {
System.out.println("entry: " + text);
}
public static void exit(String text) {
System.out.println("exit: " + text);
}}
aspect Tracing {
pointcut trace () : call(public * Person.set*(..));
51
before() : trace() {
Tracing.entry(thisJoinPoint.toString());
}
after() : trace() {
Tracing.exit(thisJoinPoint.toString());}
}
public class Application {
public static void main(String[] args) {
Person person = new Person();
person.setName("Lincoln Souza Rocha");
52
person.setName("Lincoln Souza Rocha");
}
}
entry: call(void Person.setName(String))
exit: call(void Person.setName(String))
� Kendall, E. A. Aspect-Oriented Programming in AspectJ, 2001.
� Kiczales, G. et all. Aspect-Oriented Programming, 1997.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.
53
Lincoln S. Rocha ([email protected])