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