PROGRAMAÇÃO ORIENTADA
A ASPECTOS
Equipe:
Leandro Oliveira
Anusio Menezes
Software a ser utilizado
„JDK 1.5
• http://java.sun.com/j2se (1.5.0_01-b08)
„Eclipse
• http://www.eclipse.org (3.1.2)
„AspectJ 1.5
• http://www.eclipse.org/aspectj (1.5.1a)
„AJDT
• http://www.eclipse.org/ajdt (1.3.1)
„http://sergio.dsc.upe.br/aspectos
1. INTRODUÇÃO
A Orientação a Objetos está consolidada. Entretanto,
nem todas as promessas que este paradigma se
propunha a cumprir foram atendidas. Algumas
soluções foram propostas na tentativa de cumprir
estas promessas pendentes, entre elas a Orientação a
Aspectos.
A Orientação a Aspectos (OA) é um paradigma que
estende a Orientação a Objetos (e outros, como o
paradigma estruturado) introduzindo novas
abstrações. Estes novos elementos são destinados a
suprir deficiências na capacidade de representação de
algumas situações.
MOTIVAÇÃO
„Queremos desenvolver software de qualidade
capaz de se adaptar a mudanças
que lide com a complexidade.
A complexidade crescente dos sistemas
de software gera novos desafios para as
metodologias da Engenharia de Software
PROGRAMA ORIENTADO A OBJETOS
„Abstrações bem mais próximas do
mundo do problema
• objetos, não funções
Em um programa, “tudo” é objeto;
„Um programa é um monte de objetos ;
dizendo aos outros o que fazer;
“A orientação a objetos tem por objetivo diminuir a
distância conceitual entre o mundo real e o computacional.”
Creditar
Saldo
Número
R$100,00
12.344-67
Debitar
CLASSE DE CONTAS BANCÁRIAS
CLASSE EM JAVA
public class Conta {
private String numero;
private double saldo;
...
public void debitar (double valor) {
if (this.getSaldo() >= valor)
this.setSaldo(this.getSaldo()-valor);
else
}
public void creditar (double valor) {
this.setSaldo(this.getSaldo()+valor);
}
}
OO RESOLVE NOSSO PROBLEMA?
„Ainda
não!
„Complexidade aumenta sem parar
„Limitações com objetos
• fatores de qualidade ainda são prejudicados
Problema
(mesmo com OO)
„Código relacionado a certos interesses são
transversaisEspalhados por vários módulos de
implementação
(classes)
TIPOS DE INTERESSES
„Funcionais (negócio)
creditar, debitar, transferir
Não-funcionais (sistêmicos)
logging
tratamento de exceções
autenticação
desempenho
concorrência e sincronização
persistência...
Cada cor representa um interesse diferente
AGORA QUE ENTRA O CONCEITO DE
ORIENTAÇÃO A ASPECTOS
Modularização de interesses transversais
„Promove separação de interesses
„Implementação de um interesse dentro
de uma unidade...
Aspecto
nova unidade de
modularização e abstração
SEPARAÇÃO DE INTERESSES
(SEPARATION OF CONCERNS)
Para contornar a complexidade de um
problema, deve-se resolver uma questão
importante ou interesse (concern) por vez
[Dijkstra 76]
IMPLEMENTAÇÃO COM AOP
Complementa a orientação a objetos
novo paradigma?
„Melhoria em reuso e extensibidade
„Separação de interesses
relação entre os aspectos e o resto do sistema nem
sempre é clara
„Normalmente menos linhas de código
EM UMA LINGUAGEM ORIENTADA A
ASPECTOS
Parte OO
Objetos modularizam interesses não-transversais
Parte de aspectos
Aspectos modularizam interesses transversais
ASPECTJ
„Extensão simples e bem integrada de Java
gera arquivos .class compatíveis com qualquer
máquina virtual Java
„Linguagem orientada a aspectos
„Inclue suporte de ferramentas
JBuilder, Eclipse
„Implementação disponível
open source
„Comunidade de usuários ativa
„Mantida por uma grande empresa (IBM)
PARA COMEÇAR...
Temos que identificar os pontos de
interesse na execução
„Neste exemplo: ao fazer um crédito ou
débito em qualquer conta
„Pontos de junção (join points)
pontos na execução de um programa
chamadas de métodos
acesso a atributos (escrita, leitura)
etc.
PRECISAMOS AINDA AGRUPAR!
Interesse logging ocorre em todas as
chamadas a creditar e debitar
„Precisamos agrupar todos os pontos
de junção
„Em AspectJ
pointcut (conjunto de pontos de junção)
POINTCUT
Agrupamento de pontos de junção
Uso de filtros de AspectJ
IDENTIFICAMOS OS PONTOS...
agora precisamos decidir duas coisas
O que fazer nestes pontos?
Fazer isto antes ou depois do ponto?
ADVICES (ADENDO)
Especifica o código que será executado quando
acontecer os pontos indicados
parecido com métodos
„Comportamento executado
antes (before)
depois (after)
EXEMPLO(ADVICE)
TEMOS O SEGUINTE CÓDIGO EM JAVA E VAMOS
EM SEGUIDA FAZER ORIENTADO A ASPECTOS
public class Conta {
private String numero;
private double saldo;
...
public void debitar (double valor) {
if (this.getSaldo() >= valor){
this.setSaldo(this.getSaldo()-valor);
System.out.println(“ocorreu um debito!"); }
}
public void creditar (double valor) {
this.setSaldo(this.getSaldo()+valor);
System.out.println(“ocorreu um credito!");
}
}...
ASPECTO LOGCONTAS
EXERCÍCIO
Faça um aspecto que modularize este concern de
logging
„Dica: usar dois pointcuts e dois advices
PONTOS POSITIVOS E NEGATIVOS A
CERCA DO TEMA...
POSITIVOS...
modularidade, reuso, e extensibilidade
inconsciência (obliviousness)
produtividade
permite implementação e testes progressivos
NEGATIVOS...
Novo paradigma
– aprendizado
– relação entre classes e aspectos deve ser
minimizada
– inconsciência (obliviousness)
Projeto da linguagem
– tratamento de exceções
– conflitos entre aspectos
Requer suporte de ferramentas
Combinação (apenas) estática
CONCLUSÃO
Certamente
a Orientação a Aspectos (OA)
ainda não é o paradigma ideal, e acreditamos
que em breve surgirão outros paradigmas
capazes de melhor abstrair / expressar
soluções, e por tal, permitindo a criação de
soluções melhores. Mas o que fica claro para
nós é que, a OA é um grande passo rumo ao
paradigma ideal. Neste artigo, e mesmo no
livro, trabalhamos apenas a parte da
Orientação a Aspectos ligada à programação,
entretanto as vantagens da OA quando
aplicadas a análise e, principalmente, ao
projeto podem ser impressionantes, mas isto é
um tema para um outro artigo.