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
Download

Programação Orientada a Aspectos